C# 列表视图 - 检测用户何时取消选择项或选择新项



我正在尝试检测用户何时在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;
}

相关内容

  • 没有找到相关文章

最新更新