ListView和Messagebox怪异的bug?

时间:2012-08-16 09:56:26

标签: c# winforms listview messagebox

我有一个使用ListView的项目。用户可以从列表视图中选择一些内容(在详细模式下设置) - 并且在某些情况下会出现一个消息框,其中询问是/否确认。确认代码不会以任何方式修改ListView或选择。代码位于SelectedIndexChanged事件处理程序中。

问题在于 - 当我做出一个创建弹出窗口的选择时 - 程序最初按预期工作。我将鼠标移回列表视图的那一刻,但它会将选择更改为鼠标下方的符号(不点击) - 就像“HoverSelect”打开一样(当它不是时)。这只发生在我做出一个涉及MessageBox弹出的选择之后。

以为我破坏了什么,我决定写一个简单的测试。我创建了一个带有硬编码值的列表视图,并输入以下代码:

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
      {

            listView1.Enabled = false;
            MessageBox.Show("Test");
            listView1.Enabled = true;

      }

当我做出选择时 - 事件被触发两次。我不确定它是否与我原来的问题或其他巧合有关。

补充:在我的测试示例中 - 发生以下情况:

首选 - “测试” 第二选择 - “测试”“测试” 第三...... N - “测试”“测试”

所以我认为这是我主要问题的另一个方面。删除代码以禁用/启用列表视图没有任何区别。

如何让MessageBox和ListView相互“玩得很好”?

5 个答案:

答案 0 :(得分:0)

ListView.HideSelection设为false

  

ListView.HideSelection :获取或设置一个值,指示当控件失去焦点时控件中的所选项是否仍然高亮显示。

答案 1 :(得分:0)

前几天我遇到了类似的问题,在执行从ListView移除焦点的操作时遇到了奇怪的问题。在我的情况下,点击ListViewItem更新了用户界面的另一部分,这使ListView失去了焦点并且不满意。

我的解决方案是执行以下操作 - 添加以下方法:

private bool AllowToLoseFocus = true;

private void MyListView_Leave(object sender, EventArgs e)
{
   if(!AllowToLoseFocus)
        MyListView.Focus();
}

private void MyListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    AllowToLoseFocus = false;
    //do stuff here
    AllowToLoseFocus = true;
}

也许不是最好的解决方案,可能不适用于您的情况......但值得一试!

答案 2 :(得分:0)

我认为我解决了你的问题:

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            if (!e.Item.Selected)
            {
                e.Item.Selected = false;
            }
            MessageBox.Show("test");
        }
    }

答案 3 :(得分:0)

SelectedIndexChanged事件触发两次因为它的设计行为。

  

当用户选择项目而不按CTRL执行   多次选择,控件首先清除先前的选择。   在这种情况下,对于每个项目,此事件都会发生一次   先前已选择,一次为新选择的项目。

如需更多信息,请查看MSDN

我无法重现您的悬停问题,但您可以尝试此操作只显示一次消息框(仅当您不使用多选时才有效)

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.SelectedItems.Count > 0)
    {
        MessageBox.Show("Test");
    }
}

答案 4 :(得分:0)

快速去并立即复制它,这是一个棘手的问题。我可以告诉你一个解决方案,它不是很好,但它有效。您需要在MessageBox上使用第二个表单,然后返回到禁用/启用列表视图。

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.Enabled)
    {
        listView1.Enabled = false;
        Form2 confirm = new Form2();
        confirm.FormClosed += new FormClosedEventHandler(confirm_FormClosed);
        confirm.Show();
    }
}

void confirm_FormClosed(object sender, FormClosedEventArgs e)
{
    listView1.Enabled = true;
}