带有MessageBox的Listview SelectedIndexChanged激发ItemDrag

本文关键字:激发 ItemDrag SelectedIndexChanged Listview MessageBox 带有 | 更新日期: 2023-09-27 18:25:26

我有一个带有SelectedIndexChangedItemDrag事件处理程序的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)
{
}

关于为什么会发生这种情况,有什么建议吗?

带有MessageBox的Listview SelectedIndexChanged激发ItemDrag

我看到了。通知直接来自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")));
    }