【发布时间】:2014-01-22 09:01:51
【问题描述】:
我试图检测用户何时在 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;
}
}
当用户取消选择所有内容时它工作正常,但问题是当用户选择另一个项目时会触发此事件两次:一次用于取消选择当前项目,另一次用于选择新项目。这导致某些闪烁在“移动项目上方”和“移动项目向下移动”按钮,因为它将首先禁用按钮(因为取消选择当前项),然后再次启用它们(选择新项目)。
有人知道我该如何解决这个问题吗?我的想法已经用完了。
提前致谢。
【问题讨论】:
-
好的。对困惑感到抱歉。我已经使用过很多次 ListView 并且从不依赖 ItemSelectionChanged 事件; IsSelected 上都没有。我快速搜索了最后一个属性,我看到的所有结果都提到了 WPF。
-
关于您的问题,您的代码完全符合预期:当发生“跟踪取消选择”(单击 ListView 内的其他位置)时,它会执行给定的操作。您提到的问题是一种不明情况:如果您单击另一个项目,您的代码可以跟踪此更改,但是应该怎么做?发生了两个动作(一个项目被选中,另一个未被选中),应该怎么做?启用还是禁用?因此,您的代码没有问题,但您的想法没有问题。请清楚说明您希望在每种情况下发生什么,您可能会得到一些帮助。
-
抱歉不是很清楚。正如您所说,代码有效,并且在一天结束时,它会做它应该做的事情。 The "problem" (more of a quirk actually) is that when another item is selected, it will fire one time due to the deselecting of the current item (disabling the buttons) and, right after this, fire once again due to the newly选定的项目,启用按钮。当然,这两个连续事件发生得非常快,但它“慢”到足以让您在每次在列表视图中选择另一个项目时看到按钮被禁用和再次启用。 (续)
-
如果用户选择了不同的项目(如丢弃两个事件中的第一个或类似的东西),我需要一些方法来不禁用按钮但仍然禁用如果用户取消选择所有内容(当事件仅引发一次时)。 PS.:我对在 SO 上发帖很陌生,请让我知道我是否应该编辑 OP 并将此信息添加到那里或保留在这里。
-
现在清楚多了(请看我的回答)。我确实认为您应该编辑您的问题以清楚地解释您的目标。
标签: c# winforms listview selecteditemchanged