5

非常に単純な質問です。リスト ビューの選択されたインデックスが変更されると、イベントが 2 回発生します。

さまざまな時点で選択または選択解除するときにイベントを使用する必要がありますが、選択を解除してしばらくしてから再選択すると、有効になっているUIフラッシュの半分がオンからオフになり、再びオンになり、かなりのコードが実行されます。クリックされたのが別の項目であり、空白ではなかった場合 (選択解除のため)、選択解除の発火を回避する方法が必要です。

Dave R はここで 100 ミリ秒のタイマーを使用するように言っ ています。

私の他の唯一のアイデアは、クリックイベントを使用して、その場所でアイテムを見つけることでしたか? しかし、私はむしろ面倒なことに行きたくない

前もって感謝します!

-編集-

クリックイベントが最初に発生すると思ったので、クリックイベントがアイテムで発生した場合に選択インデックスの変更されたコードをスキップするフラグを設定し、使用後にフラグをリセットして、選択解除をスキップできますか? 今見てみますが、非常に単純に聞こえることを行うための非常に効率的または簡単な方法のように思えませんか?

4

4 に答える 4

4

代わりにItemSelectionChangedイベントを使用してください。ListViewItemSelectionChangedEventArgsは、どのアイテムが起動したか、およびそれが選択されているかどうかを示します。

于 2012-09-26T13:47:43.267 に答える
1

潜在的に遅延のない別のソリューションを試しましたが、うまくいきました:

    If ListView1.Items(ListView1.FocusedItem.Index).Selected = False Then
        'This is the deselected value
        MsgBox("Deselected: " & ListView1.Items(ListView1.FocusedItem.Index).SubItems(0).Text)
    Else
        'This is the new selected value
        MsgBox("Selected: " & ListView1.Items(ListView1.FocusedItem.Index).SubItems(0).Text)
    End If
于 2014-02-04T19:26:02.330 に答える
0

次のソリューションは、1 ミリ秒の遅延があっても機能します。確実に動作するようにするには、たとえば 10 ミリ秒などのより高い遅延を選択できますが、100 ミリ秒の遅延では、「何もない」を選択するのが少し遅くなります。C#コードは次のとおりです。

public class FixedListView : ListView
{
    private Timer _ItemSelectionChangedTimer = new Timer();
    private Timer _SelectedIndexChangedTimer = new Timer();

    private ListViewItemSelectionChangedEventArgs _ItemSelectionChangedEventArgs;
    private EventArgs _SelectedIndexChangedEventArgs;

    public FixedListView()
    {
        this._ItemSelectionChangedTimer.Interval = 1;
        this._SelectedIndexChangedTimer.Interval = 1;

        this._ItemSelectionChangedTimer.Tick += (sender, e) =>
        {
            this.OnItemSelectionChanged(this._ItemSelectionChangedEventArgs);
            this._ItemSelectionChangedEventArgs = null;
        };
        this._SelectedIndexChangedTimer.Tick += (sender, e) =>
        {
            this.OnSelectedIndexChanged(this._SelectedIndexChangedEventArgs);
            this._SelectedIndexChangedEventArgs = null;
        };
    }

    protected override void OnItemSelectionChanged(ListViewItemSelectionChangedEventArgs e)
    {
        if (this._ItemSelectionChangedTimer.Enabled)
        {
            this._ItemSelectionChangedTimer.Stop();
            base.OnItemSelectionChanged(e);
        }
        else
        {
            this._ItemSelectionChangedEventArgs = e;
            this._ItemSelectionChangedTimer.Start();
        }
    }

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        if (this._SelectedIndexChangedTimer.Enabled)
        {
            this._SelectedIndexChangedTimer.Stop();
            base.OnSelectedIndexChanged(e);
        }
        else
        {
            this._SelectedIndexChangedEventArgs = e;
            this._SelectedIndexChangedTimer.Start();                
        }
    }
}

そして、ここにVBコードがあります:

Public Class FixedListBox

Inherits ListView

Public Sub New()

    Me._ItemSelectionChangedTimer.Interval = 1
    Me._SelectedIndexChangedTimer.Interval = 1

    AddHandler Me._ItemSelectionChangedTimer.Tick, _
        Sub(sender, e)
            Me.OnItemSelectionChanged(Me._ItemSelectionChangedEventArgs)
            Me._ItemSelectionChangedEventArgs = Nothing
        End Sub

    AddHandler Me._SelectedIndexChangedTimer.Tick, _
        Sub(sender, e)
            Me.OnSelectedIndexChanged(Me._SelectedIndexChangedEventArgs)
            Me._SelectedIndexChangedEventArgs = Nothing
        End Sub

End Sub

Private _ItemSelectionChangedTimer As New Timer()
Private _SelectedIndexChangedTimer As New Timer()

Private _ItemSelectionChangedEventArgs As ListViewItemSelectionChangedEventArgs
Private _SelectedIndexChangedEventArgs As EventArgs

Protected Overrides Sub OnItemSelectionChanged(e As ListViewItemSelectionChangedEventArgs)

    If Me._ItemSelectionChangedTimer.Enabled Then

        Me._ItemSelectionChangedTimer.Stop()
        MyBase.OnItemSelectionChanged(e)

    Else

        Me._ItemSelectionChangedEventArgs = e
        Me._ItemSelectionChangedTimer.Start()

    End If

End Sub

Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs)

    If Me._SelectedIndexChangedTimer.Enabled Then

        Me._SelectedIndexChangedTimer.Stop()
        MyBase.OnSelectedIndexChanged(e)

    Else

        Me._SelectedIndexChangedEventArgs = e
        Me._SelectedIndexChangedTimer.Start()

    End If

End Sub

クラス終了

通常の ListView のようにコントロールを使用できますが、SelectedIndexChanged と ItemSelectionChanged は 1 回だけ起動します。

楽しむ...

于 2013-04-03T07:18:35.873 に答える
-1

SelectedIndexChanged イベントで、フォーカスされた項目が null であるかどうかを確認して終了します。

ListView^ item = listView1-> FocusedItem;   //get selected item
if (item == nullptr){return;)  // this line exits when deselection event fires
String^ data1 = Convert::ToString (  item-> SubItems [0]    );   // get your data from columns like so
MessageBox::Show (data1);  // display

サブアイテムで提供されるインデックスを変更することで、複数の列の下のデータを取得できることに注意してください。タイマーと遅延を使用すると、特に大規模なデータベースでオーバーヘッドが発生し、ビジュアル C++ .NET のコードが遅くなりますが、C# などにも同じ理論が適用されます。

楽しみ!!

于 2014-08-24T07:37:43.170 に答える