2009-11-19 126 views
0

我有一个窗体。它有一个ComboBoxDataGrid取消Windows窗体事件

我有一个Leave事件对我ComboBox,我有一个DoubleClick事件对我DataGrid

的想法是,在离开ComboBox,如果ComboBox的价值再变使用新值重新加载DataGrid

假设ComboBox显示值为1,对于该值,在DataGrid中显示5条记录。 现在用户在ComboBox中输入2并将其隔开。在我的Leave事件中,我看到该值已更改,并且我重新加载了DataGrid以及该值的所有记录。

但是,如果用户输入2和双击现有记录的价值1,比 假事件重新加载DataGrid,比DoubleClick事件触发。

如果DataGrid已重新加载,我如何查找待处理事件的列表并取消其中的每一个?

回答

1

您已遇到事件订单问题,DataGridView.Enter事件过早触发。这可以通过使用Control.BeginInvoke()方法延迟事件操作来干净地解决。只要程序重新进入消息循环,它的代理目标就会被触发。换句话说,在所有悬而未决的事件发射后。使它看起来类似于这样:

private bool selectionDirty; 

private void comboBox1_TextChanged(object sender, EventArgs e) { 
    selectionDirty = true; 
} 

private void dataGridView1_Enter(object sender, EventArgs e) { 
    this.BeginInvoke(new Action(() => selectionDirty = false)); 
} 

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { 
    if (selectionDirty) return; 
    // etc... 
} 
+0

我会试一试周一早上 – CodingJoy 2009-11-21 04:44:15

+0

我不认为这会起作用。因为进入数据网格时,不能保证它被重新加载。 – CodingJoy 2009-11-21 04:46:26

+0

我需要Jon Skeet或Ayende来帮助我 – CodingJoy 2009-11-21 04:48:29

1

而不是使用Leave事件,请尝试SelectedIndexChanged Event,这将在DataGrid s DoubleClick事件之前被解雇。缺点是如果用户使用键盘滚动ComboBox,那么如果用户在ComboBox中向下滚动5个步骤,则会触发5次。

另一种解决办法是进入ComboBox当以存储局部变量lComboEntered=true和值设置为falseLeave事件触发时。并在DataGridDoubleClick事件之前检查lComboEntered=false是否做任何事情。

+0

在我的离去,事件例程,如果组合框的值发生了变化,比我重装DataGrid和设置CancelDoubleClick标志设置为true。在我的datagrid doubleclick例程中,我检查这个标志,如果它是真的,就取消事件。这工作正常,如果我改变我的组合框中的值,并双击行而不做任何事情。但是,如果我在组合框中输入一个值,并且简单地选项卡比我必须双击数据网格TWICE。在哪里我可以重置该标志为假。 – CodingJoy 2009-11-19 21:48:38