带有MessageBox的Listview SelectedIndexChanged激发ItemDrag
本文关键字:激发 ItemDrag SelectedIndexChanged Listview MessageBox 带有 | 更新日期: 2023-09-27 18:25:26
我有一个带有SelectedIndexChanged
和ItemDrag
事件处理程序的ListView
。如果我在SelectedIndexChanged
中打开一个MessageBox
,它就会触发ItemDrag
。
通过创建一个带有某些元素的列表,并在SelectedIndexChanged
中放置MessageBox
,在ItemDrag
方法中放置断点,可以很容易地再现该问题。
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
MessageBox.Show("Selected Index Changed");
}
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
}
关于为什么会发生这种情况,有什么建议吗?
我看到了。通知直接来自Windows,不涉及.NET。这类MessageBox引发的问题并不罕见,它导致的重新进入问题与臭名昭著的DoEvents()方法造成的痛苦非常相似。编写ListView并不是为了假设它的SelectedIndexChanged事件做了如此激烈的事情。
我认为潜在的触发因素是焦点的变化,它在关闭消息框后重新获得焦点,很有可能鼠标在同一时间被移动。这看起来也像是一次尝试拖拽。请注意,当您使用键盘关闭消息框时,如何不会收到事件。
有一个通用的解决方案来解决这类重新进入问题,也能解决这个问题。方法是延迟对话框的显示,等待事件由控件调度和处理,并且ListView中的代码不再处于活动状态。可以用Timer完成,但最优雅的方法是使用BeginInvoke()方法:
private void listView1_SelectedIndexChanged(object sender, EventArgs e) {
this.BeginInvoke(new Action(() => MessageBox.Show("Okay now")));
}