how to change the widget of view's exposed filter form? I have an exposed filter form, and its default widgets are textfields. I'd like to change them to selects based on values from database.
I have tried hook_form_alter and hook_form_views_exposed_form_alter, but get an error:

An illegal choice has been detected. Please contact the site administrator.


The code I used to change the widget is like this and I've tried #validate option.

$form['field_address_province'] = array(
        '#type' =&gt; 'select',
        '#options' =&gt; $province_options,
        '#validate' =&gt; true,
        '#description' =&gt; 'Select address',
    );


Edit:

Sorry for the lack of infomation.
The $province_options is an array like 

Array
(
    [0] =&gt; Please Select
    [6] =&gt; Area1
    [7] =&gt; Area2
    [2] =&gt; Area3
)
i tested this kind of thing and found that when you try to switch a exposed widget field you need to provide an array with the empty first key, if it is checkboxes or radios; if new widget will be a select then you need to provide an array with the 'All' first key. E.g.:

//Suppose that you have a default input widget which you want to change to select widget.
//We will get the values which we want our new select widget will get as options:
$opts = array(
  'first_key' =&gt; 'First value',
  'sec_key' =&gt; 'Second value',
);

// Then we will add required 'All' first key:
$options = array('All' =&gt; 'Choose a value') + $opts;

// Then we will create our new select widget
$form['YOUR_FIELD_NAME'] = array(
     '#type' =&gt; 'select',
     '#title' =&gt; t('MY TITLE'),
     '#options' =&gt; $options,
   );