列表视图选择如何改变事件的工作方式。它叫双智

use*_*357 1 .net vb.net listview winforms selectionchanged

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

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

    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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Gra*_*ian 5

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

在 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;
}
Run Code Online (Sandbox Code Playgroud)

然后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
}
Run Code Online (Sandbox Code Playgroud)

这些来自ObjectListView的想法已经解决了您将遇到的许多问题ListView