Programmatically Change Administrative Area in AddressField
Here is an example, You need to use ajax. I think you will just need to alter the form structure a bit from what I have but the basic logic is there.

$country_list = array(0=&gt;'USA',1=&gt;'Canada');
$value_country = isset($form_state['values']['country']) ? $form_state['values']['country'] : key($country_list);

$form['country'] = array( 
    '#type' =&gt; 'select',
    '#title' =&gt; t('Select Country'),
    '#options' =&gt;  $country_list,  
    '#ajax' =&gt; array(
        'event' =&gt; 'change',
        'callback' =&gt; 'mymodule_ajax_callback',
        'wrapper' =&gt; 'name_replace',
        ),
 );

$form['state'] = array( 
    '#type' =&gt; 'select',
    '#title' =&gt; t('Select State'),
    '#prefix' =&gt; '&lt;div id="name_replace"; style="margin-top:50px;"&gt;',
    '#suffix' =&gt; '&lt;/div&gt;',
    '#options' =&gt;  mymodule_find_states($value_country), //pass country, run query, return correct states
    '#default_value' =&gt; isset($form_state['values']['country']) ? $form_state['values']['country'] : '',
 );


Add this function make sure this function is NOT inside form_alter function

function mymodule_ajax_callback($form, $form_state) {
    return $form['state'];
}