http://blog.csdn.net/a312100321/article/details/25195311
問題:DataGridView綁定數據源之后,有一列需要用下拉框DataGridViewComboBoxCell顯示,但是在處理DataGridViewComboBoxCell的下拉事件有些麻煩,它不像ComBox有SelectedIndexChanged,困擾我很久,結合網上的一些方法,再加上自己的一些改動,終於完全可以解決這個問題了。下面是我的代碼,有詳細注釋。
一、
/// <summary>
/// 首先給這個DataGridView加上EditingControlShowing事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridView dgv = sender as DataGridView;
//判斷相應的列
if (dgv.CurrentCell.GetType().Name == "DataGridViewComboBoxCell" && dgv.CurrentCell.RowIndex != -1)
{
//給這個DataGridViewComboBoxCell加上下拉事件
(e.Control as ComboBox).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
}
}
二、
/// <summary>
/// 組合框事件處理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox combox=sender as ComboBox;
//這里比較重要
combox.Leave+=new EventHandler(combox_Leave);
try
{
//在這里就可以做值是否改變判斷
if (combox.SelectedItem != null)
{
}
Thread.Sleep(100);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
三、(這一步比較重要,如果不加,會導致selectedchanged事件一直觸發)
/// <summary>
/// 離開combox時,把事件刪除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void combox_Leave(object sender, EventArgs e)
{
ComboBox combox = sender as ComboBox;
//做完處理,須撤銷動態事件
combox.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
}
總結:網上的方法一般都是在第二步的時候把
//做完處理,須撤銷動態事件
combox.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
這個事件撤銷了,但是我在用的時候,發現,如果在第二步就撤銷這個事件,在Combox沒有失去焦點的情況下,選擇另一個選項,不會觸發Combox的selectedchanged事件