我想在單元格中的ComboBox
中的值發生更改時處理該事件。什麼事件捕獲DataGridViewCell中組合框中值的更改?
有CellValueChanged
事件,但只有當我點擊DataGridView
內的其他地方時纔會觸發。
一個簡單的ComboBox
SelectedValueChanged
選擇一個新的值後立即啓動。
如何將偵聽器添加到單元格內的組合框?
我想在單元格中的ComboBox
中的值發生更改時處理該事件。什麼事件捕獲DataGridViewCell中組合框中值的更改?
有CellValueChanged
事件,但只有當我點擊DataGridView
內的其他地方時纔會觸發。
一個簡單的ComboBox
SelectedValueChanged
選擇一個新的值後立即啓動。
如何將偵聽器添加到單元格內的組合框?
上面的答案讓我一段時間的報春花路徑。它不起作用,因爲它會導致多個事件觸發並持續添加事件。問題是上面捕獲了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();
}
}
這是代碼,這將在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);
}
它的工作原理** **,但作爲@Severun說,它引發了太多的事件。它工作了一段時間,但在某些情況下,它失敗並引發一個致命錯誤,類型爲「InvalidOperationException:操作無效,因爲它導致對SetCurrentAddressCore函數的重入調用。我使用@Severun的解決方案,現在正在運行正常工作 – 56ka 2015-08-26 09:41:08
感謝您的解決方案@MitjaBonca但如果我有兩個在datagridview comboboxcolumns。 – bhavikshah28 2016-06-30 11:28:16
您也可以處理CurrentCellDirtyStateChanged
事件每當值改變其被調用,即使它是沒有承諾。要獲得列表中的選定值,您應該這樣做:
var newValue = dataGridView.CurrentCell.EditedFormattedValue;
驚人的答案!它救了我!在我的情況下還需要額外的檢查:選擇時發生兩個事件,並且當轉到新的單元格時,舊的單元再次引發相同的事件:但通過檢查很容易找到正確的事件。Combo的集中屬性。非常感謝 !!! – 2017-10-04 21:48:05
ComboBox cmbBox = (ComboBox)sender;
MessageBox.Show(cmbBox.SelectedValue.ToString());
這幫了我很多,正是我在找的東西。謝謝 – 2014-01-29 13:42:27
偉大的答案和thx爲您的研究 – 2015-01-21 13:49:11
謝謝。我已經看到了很多使用EditedControlShowing方法的例子,但是由於可能是遞歸事件,我甚至最終崩潰了.NET。 – Jonas 2015-06-23 15:51:57