使用MessageBox的Listview SelectedIndexChanged触发ItemDrag

时间:2014-10-03 18:39:38

标签: c# listview messagebox selectedindexchanged

我有ListViewSelectedIndexChangedItemDrag个事件处理程序。 如果我在MessageBox中打开SelectedIndexChanged,则会触发ItemDrag

通过创建包含某个元素的列表并在MessageBox中放置SelectedIndexChanged并在ItemDrag方法中放置断点,可以轻松复制该问题。

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{        
        MessageBox.Show("Selected Index Changed");
}

private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
}

有关为何发生这种情况的任何建议?

1 个答案:

答案 0 :(得分:2)

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