我有一个使用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相互“玩得很好”?
答案 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;
}