2010-08-04 129 views
2

我想在DataGridViewComboBoxColumn上处理此事件“SelectedIndexChanged”, 并将其设置为gridview的“EditingControlShowing”事件。Datagridview上的ComboBoxColumn中的“SelectedIndexChanged”事件

问题: “SelectedIndexChanged”事件在第一次尝试从组合框中选择项目时未触发,但在第二次选择该项目后,事件被触发并且一切正常!

下面是代码:

private void dgvRequest_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e) 
{ 
    ComboBox combo = e.Control as ComboBox; 

    if (combo != null) 
    { 
     if (dgvRequest.CurrentCell.ColumnIndex == col_ConfirmCmb.Index) 
     { 
      combo.SelectedIndexChanged -= combo_ConfirmSelectionChange; 
      combo.SelectedIndexChanged += combo_ConfirmSelectionChange; 

      return; 
     } 
    } 
} 


void combo_ConfirmSelectionChange(object sender, EventArgs e) 
{ 
    if (dgvRequest.CurrentCell.ColumnIndex != col_ConfirmCmb.Index) return; 

    ComboBox combo = sender as ComboBox; 
    if (combo == null) return; 

    MessageBox.Show(combo.SelectedText);// returns Null for the first time 
} 

回答

5

事情变得复杂,因为它们仅具有所有行一个编辑控制优化DataGridView的。下面是我如何处理类似的情况:

第一钩了一个代表到EditControlShowing事件:

myGrid.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(
            Grid_EditingControlShowing); 
... 

然后在处理程序挂接到EditControl的SelectedValueChanged事件:

void Grid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    ComboBox combo = e.Control as ComboBox; 
    if (combo != null) 
    { 
     // the event to handle combo changes 
     EventHandler comboDelegate = new EventHandler(
      (cbSender, args) => 
      { 
       DoSomeStuff(); 
      }); 

     // register the event with the editing control 
     combo.SelectedValueChanged += comboDelegate; 

     // since we don't want to add this event multiple times, when the 
     // editing control is hidden, we must remove the handler we added. 
     EventHandler visibilityDelegate = null; 
     visibilityDelegate = new EventHandler(
      (visSender, args) => 
      { 
       // remove the handlers when the editing control is 
       // no longer visible. 
       if ((visSender as Control).Visible == false) 
       { 
        combo.SelectedValueChanged -= comboDelegate; 
        visSender.VisibleChanged -= visibilityDelegate; 
       } 
      }); 

     (sender as DataGridView).EditingControl.VisibleChanged += 
      visibilityDelegate; 

    } 
} 
+0

尼斯片段。它帮助我。当您在第二个Lambda表达式中编写visSender时,这是如何定义的? – MoonKnight 2011-08-25 13:10:35

+0

由于这不能在运行时定义,而没有做一些更人为的编码?非常感谢... – MoonKnight 2011-08-25 15:39:10

+0

EventHandler委托的定义是(object sender,EventArgs e)。 visSender是触发EditingControl.VisibleChanged事件的对象。在这种情况下,lambda期望它是触发可见性更改的编辑控件。这回答了你的问题了吗? – 2011-08-26 14:07:54

相关问题