2

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

问题是这样的——当我做出一个创建弹出窗口的选择时——程序最初按预期工作。当我将鼠标移回列表视图时,它会导致选择更改为鼠标下方的符号(无需单击) - 就好像“HoverSelect”已打开(当它未打开时)。这只发生在我做出涉及弹出消息框的选择之后。

考虑到我弄坏了一些东西,我决定写一个简单的测试。我创建了一个带有硬编码值的列表视图并输入了以下代码:

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
      {

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

      }

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

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

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

所以我认为这是我主要问题的另一个方面。删除代码以禁用/启用列表视图并没有什么不同。

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

4

5 回答 5

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;
}
于 2012-08-16T12:04:27.320 回答
0

SelectedIndexChanged 事件触发两次,因为它的行为是设计使然。

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

有关更多信息,请查看MSDN

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

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView1.SelectedItems.Count > 0)
    {
        MessageBox.Show("Test");
    }
}
于 2012-08-16T11:55:56.187 回答
0

设置ListView.HideSelectionfalse

ListView.HideSelection: 获取或设置一个值,该值指示当控件失去焦点时控件中的选定项是否保持突出显示。

于 2012-08-16T10:06:36.523 回答
0

前几天我遇到了类似的问题,在执行将焦点从ListView. 在我的情况下,单击ListViewItem更新的 UI 的另一部分,这使得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;
}

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

于 2012-08-16T10:09:38.723 回答
0

我想我解决了你的问题:

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            if (!e.Item.Selected)
            {
                e.Item.Selected = false;
            }
            MessageBox.Show("test");
        }
    }
于 2012-08-16T10:36:20.727 回答