列表视图选择如何改变事件工作。它叫了两次

时间:2014-08-13 09:08:18

标签: .net vb.net winforms listview selectionchanged

我有列表视图控件在哪里更改选择,我检查 - 如果选择的记录计数大于零,则只启用组框控件,否则保持禁用。因为,那些控件只与选定的记录相关。如果没有选择记录,则不应启用它。

以下是我的listview所选的已更改事件:

    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

问题:每次用户更改记录选择时,控件将被禁用,然后按启用状态。这给用户带来了一些不方便的设计。

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

由于

1 个答案:

答案 0 :(得分:2)

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带来的许多问题。