2014-09-24 75 views
1

是刷新组合框的项目,并仍然保持选定的项目,以便SelectedIndexChanged事件不会被触发的方式吗?即使所选项目不在新项目列表中?从DataSource刷新组合框,并保持选定的项目,但不触发SelectedIndexChanged

以下代码似乎会重置所选项目并触发SelectedIndexChanged事件。

void RefreshComboboxItems() 
{ 
    var ds = GetRefreshedItems(); 
    cb.DataSource = ds; 
    cb.DisplayMember = "Name"; 
    cb.ValueMember = "Value"; 
} 

// cb is already initialized and an item is selected 
RefreshComboboxItems(); // Want to keep the selected item unchanged and don't trigger the event 
+0

@JohnOdom它在问题代码中提供。 – user2864740 2014-09-24 21:54:15

+0

我会试图在操作过程中仅仅抑制SelectedIndexChanged事件 - 通过使用布尔防护变量(例如“refreshingData”)和try/catch。 (这个事件保证与上面的代码执行内联一致) – user2864740 2014-09-24 21:55:00

+0

我想不出任何。只有当我执行脏兮兮的工作时,临时取消分配处理程序,然后弹回 – ne1410s 2014-09-24 21:55:55

回答

0

如果你想删除的事件处理程序暂时你可以这样做:

void RefreshComboboxItems() 
{ 
    cb.SelectedIndexChanged -= Ddl_SelectedIndexChanged; 

    var ds = GetRefreshedItems(); 
    cb.DataSource = ds; 
    cb.DisplayMember = "Name"; 
    cb.ValueMember = "Value"; 

    cb.SelectedIndexChanged += Ddl_SelectedIndexChanged; 
} 
2

没有,你可以得到当前的SelectedValue,删除事件处理程序,刷新组合,尝试重新设定的SelectedValue与保存的值,然后重新进行添加事件处理程序

void RefreshComboboxItems() 
{ 
    try 
    { 
     int currentValue = -1; 
     if(cb.SelectedValue != null) 
      currentValue = Convert.ToInt32(cb.SelectedValue); 

     cb.SelectedIndexChanged -= mySelectedIndexChangedMethod; 
     var ds = GetRefreshedItems(); 
     cb.DataSource = ds; 
     cb.DisplayMember = "Name"; 
     cb.ValueMember = "Value"; 

     if(currentValue != -1) 
     cb.SelectedValue = currentValue; 

    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
     cb.SelectedIndexChanged += mySelectedIndexChangedMethod; 
    } 
} 

请注意,我已经重新加入一个内部事件处理程序最后,以确保事件处理程序重新添加哟你的组合框还可以防止在移除事件处理程序后异常导致此代码过早退出

+0

即使它不在新项目列表中,是否可以重新分配选定的值? – ca9163d9 2014-09-24 22:39:46

+0

如果您尝试将SelectedValue设置为不在列表中的值,则对列表没有任何影响,并且您将不会选择任何项目。 – Steve 2014-09-24 22:49:32

相关问题