C# DataGridView中DataGridViewComboBoxCell列,下拉框事件的处理【完美解决】
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事件