【问题标题】:How listview selection changed event work. It called twise列表视图选择更改事件如何工作。它叫了两次
【发布时间】:2014-10-06 13:59:09
【问题描述】:

我有列表视图控件,在更改选择时,我会检查 - 如果选定的记录数大于零,则仅启用组框控件,否则将其禁用。因为,这些控件仅与选定的记录相关。如果没有选择记录,则不应启用它。

以下是我的列表视图选择的更改事件:

    Private Sub lv_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lv.SelectedIndexChanged

   If lv.SelectedItems.Count() > 0 Then
     ...
     .
     ResetifNorecordSelectedState(False)
   Else
      ..
    ResetifNorecordSelectedState(True)
   End If

问题:每次用户更改记录选择时,控件都会变为禁用状态,然后是启用状态。它给用户带来了一些不便的设计。

任何人都可以分享我的解决方案或者我应该在这里更改什么来纠正这个问题。 ?

谢谢

【问题讨论】:

  • 想做什么?
  • 请找到更新的问题(包括一些细节)。
  • 它正在做它的设计。特别是使用单选时,当用户更改选择时,您会收到一个通知,A 现在被取消选择,然后 B 现在被选中。
  • 这个活动很闲聊,告诉你的比你想知道的要多。你需要一个定时器来避免“不方便的设计”,当你没有看到选择时启动它,当你看到一个或多个时停止它。或者只是prevent the user from deselecting an item
  • 如何做定时器。我无法创建新的 listview 控件,因为它是通过许多更改和依赖项实现的。有什么方法可以覆盖某些事件或解决此问题的方法。

标签: .net vb.net winforms listview selectionchanged


【解决方案1】:

ListView 在选择行和取消选择行时都会触发SelectedIndexChanged。因此,单击新行会触发两个事件:一个用于取消选择旧行,另一个用于选择新行。

在您的 SelectedIndexChanged 事件中,安排另一个方法在空闲时间运行,但请确保安排其中一个:

// If we haven't already scheduled an event, schedule it to be triggered
// By using idle time, we will wait until all select events for the same
// user action have finished before triggering the event.
if (!_hasIdleHandler) {
    _hasIdleHandler = true;
    Application.Idle += HandleDeferredSelectionChanged;
}

然后在你的HandleDeferredSelectionChanged 你可以做你的工作:

private virtual void HandleDeferredSelectionChanged(object sender, EventArgs e) {
    // Remove the handler before triggering the event
    Application.Idle -= HandleDeferredSelectionChanged;
    _hasIdleHandler = false;

    // do your checking here
}

来自ObjectListView 的这些想法已经解决了您在使用ListView 时会遇到的许多问题。

【讨论】:

  • 这是个好主意!有人必须对框架有相当深入的了解才能提出这个问题。感谢 Grammarian 把这个带到这里 :-)
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多