我正在尝试检测用户何时在ListView中选择新项目以及何时取消选择所有内容(通过单击ListView上的空白区域),但是我很难正确处理。我需要它来启用或禁用几个"上移项目"和"下移项目"按钮。我认为最好的方法是处理ItemSelectionChanged
事件,所以我有这个,这似乎很明显:
private void lstItems_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
if (e.IsSelected) {
cmbMoveUp.Enabled = true;
cmbMoveDn.Enabled = true;
} else {
cmbMoveUp.Enabled = false;
cmbMoveDn.Enabled = false;
}
}
当用户取消选择所有内容时,它工作正常,但问题是当用户选择另一个项目时,此事件会触发两次:一次用于取消选择当前项目,另一次用于选择新项目。这会导致"上移项目"和"下移项目"按钮闪烁,因为它将首先禁用按钮(因为当前项目已取消选择),然后再次启用它们(当选择新项目时)。
有人知道我该如何解决这个问题吗?我已经没有想法了。
提前谢谢。
您是否尝试过使用 lstItems_SelectedIndexChanged 而不是 lstItems_ItemSelectionChanged?我相信这只会触发这 1 次。希望对您有所帮助!
我从未使用过listView,但我认为您可以删除lstItems_ItemSelectionChanged方法的其他部分,然后在if部分中,您可以首先禁用所有按钮,然后仅使用两个相关按钮。 lstItems_ItemSelectionChanged事件触发两次,第一次"if"不会触发,第二次"if"会触发。 所以你的问题就会得到解决。
我发现的最佳解决方案是暂时将事件处理程序设置为 Application.Idle
并从那里进行检查,如下所示:
bool handled;
private void lstItems_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
if (!handled)
{ handled = true;
Application.Idle += SelectionChangeDone; }
}
private void SelectionChangeDone(object sender, EventArgs e) {
Application.Idle -= SelectionChangeDone;
handled = false;
if (lstItems.SelectedItems.Count > 0)
cmbMoveUp.Enabled = cmbMoveDn.Enabled = true;
else cmbMoveUp.Enabled = cmbMoveDn.Enabled = false;
}
使用ItemSelectionChanged
还是SelectedIndexChanged
都无关紧要。在这种情况下,两者都可以正常工作。
非常感谢语法学家在这里回答了基本上相同的问题:https://stackoverflow.com/a/26393234/2532220
我希望我的列表视图在取消选择列表时禁用两个按钮。以下代码实现了此目的。
private void Session_List_SelectedIndexChanged(object sender, EventArgs e) {
bool toggle = true;
if (Session_List.SelectedItems.Count == 0) {
toggle = false;
}
Selected_Task.Enabled = toggle;
Perform_Task.Enabled = toggle;
}