2011-04-13 80 views
17

我想在單元格中的ComboBox中的值發生更改時處理該事件。什麼事件捕獲DataGridViewCell中組合框中值的更改?

CellValueChanged事件,但只有當我點擊DataGridView內的其他地方時纔會觸發。

一個簡單的ComboBoxSelectedValueChanged選擇一個新的值後立即啓動。

如何將偵聽器添加到單元格內的組合框?

回答

37

上面的答案讓我一段時間的報春花路徑。它不起作用,因爲它會導致多個事件觸發並持續添加事件。問題是上面捕獲了DataGridViewEditingControlShowingEvent,它不捕獲更改的值。所以每次你關注它時都會觸發,然後離開組合框,無論它是否已經改變。

關於「CurrentCellDirtyStateChanged」的最後一個答案是正確的選擇。我希望這可以幫助別人避免陷入兔子洞。

這是一些代碼。

 // Add the events to listen for 
     dataGridView1.CellValueChanged += 
      new DataGridViewCellEventHandler(dataGridView1_CellValueChanged); 
     dataGridView1.CurrentCellDirtyStateChanged += 
      new EventHandler(dataGridView1_CurrentCellDirtyStateChanged); 

    // This event handler manually raises the CellValueChanged event 
    // by calling the CommitEdit method. 
    void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
     EventArgs e) 
    { 
     if (this.dataGridView1.IsCurrentCellDirty) 
     { 
      // This fires the cell value changed handler below 
      dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
     } 
    } 

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     // My combobox column is the second one so I hard coded a 1, flavor to taste 
     DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1]; 
     if (cb.Value != null) 
     { 
       // do stuff 
       dataGridView1.Invalidate(); 
     } 
    } 
+0

這幫了我很多,正是我在找的東西。謝謝 – 2014-01-29 13:42:27

+0

偉大的答案和thx爲您的研究 – 2015-01-21 13:49:11

+0

謝謝。我已經看到了很多使用EditedControlShowing方法的例子,但是由於可能是遞歸事件,我甚至最終崩潰了.NET。 – Jonas 2015-06-23 15:51:57

12

這是代碼,這將在DataGridView火選擇的情況下,在ComboBox:

public Form1() 
    { 
     InitializeComponent(); 

     DataGridViewComboBoxColumn cmbcolumn = new DataGridViewComboBoxColumn(); 
     cmbcolumn.Name = "cmbColumn"; 
     cmbcolumn.HeaderText = "combobox column"; 
     cmbcolumn.Items.AddRange(new string[] { "aa", "ac", "aacc" }); 
     dataGridView1.Columns.Add(cmbcolumn); 
     dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing); 
    } 

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     ComboBox combo = e.Control as ComboBox; 
     if (combo != null) 
     { 
      combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged); 
      combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged); 
     } 
    } 

    private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ComboBox cb = (ComboBox)sender; 
     string item = cb.Text; 
     if (item != null) 
      MessageBox.Show(item); 
    } 
+0

它的工作原理** **,但作爲@Severun說,它引發了太多的事件。它工作了一段時間,但在某些情況下,它失敗並引發一個致命錯誤,類型爲「InvalidOperationException:操作無效,因爲它導致對SetCurrentAddressCore函數的重入調用。我使用@Severun的解決方案,現在正在運行正常工作 – 56ka 2015-08-26 09:41:08

+0

感謝您的解決方案@MitjaBonca但如果我有兩個在datagridview comboboxcolumns。 – bhavikshah28 2016-06-30 11:28:16

12

您也可以處理CurrentCellDirtyStateChanged事件每當值改變其被調用,即使它是沒有承諾。要獲得列表中的選定值,您應該這樣做:

var newValue = dataGridView.CurrentCell.EditedFormattedValue; 
+0

驚人的答案!它救了我!在我的情況下還需要額外的檢查:選擇時發生兩個事件,並且當轉到新的單元格時,舊的單元再次引發相同的事件:但通過檢查很容易找到正確的事件。Combo的集中屬性。非常感謝 !!! – 2017-10-04 21:48:05

-2
ComboBox cmbBox = (ComboBox)sender;     
MessageBox.Show(cmbBox.SelectedValue.ToString()); 
相關問題