2010-08-04 135 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

相關問題