3

MultiSelectがオンになっているWindFormsリストボックスで選択の切り替えを検出するコードを書いています。SelectedIndexChangedを使用すると、クリック後に選択されたものしか表示されないため、ListBoxがクリックされる前に選択されたものを検出する方法を探していました。MouseDownイベントを実装したところ、必要なものを正確に取得できましたが、残念な副作用として、SelectedIndexChangedイベントを強制終了しました。発火しません。

これは既知の動作ですか?クリックする前に選択リストにアクセスすることについて何か考えはありますか?

ありがとう。

要求に応じてコードスニペットを含めるように編集しました。

デザイナーが生成したイベント:

this.lbPhysicianClinic.SelectedIndexChanged += new System.EventHandler( this.lbPhysicianClinic_SelectedIndexChanged );
this.lbPhysicianClinic.MouseDown += new System.Windows.Forms.MouseEventHandler( this.lbPhysicianClinic_MouseDown );

MouseDownイベントを示すコードスニペット:

private void lbPhysicianClinic_MouseDown( object sender, MouseEventArgs e )
    {
        List<Clinic_List_ByPhysicianResult> Selected = this.PhysicianGetSelectedClinics( this.lbPhysicianClinic.SelectedIndices );
    }

SelectedIndexChangedイベントを示すコードスニペット:

private void lbPhysicianClinic_SelectedIndexChanged( object sender, EventArgs e )
    {
        try
        {
            if ( this.FormInitComplete && this.RefreshUIComplete )
            {
                List<Clinic_List_ByPhysicianResult> Selected = this.PhysicianGetSelectedClinics( this.lbPhysicianClinic.SelectedIndices );

                Clinic_List_ByPhysicianResult DroppedClinic = new Clinic_List_ByPhysicianResult();

各イベントにブレークポイントを設定しましたが、MouseDownイベントが存在する場合、SelectedIndexChangedイベントは発生しません。MouseDownイベントがなくなったときにのみ発生します。

うまくいけば、これは物事を明確にします。

4

1 に答える 1

5

ListBox は、MouseDown または SelectedIndexChanged イベントを発生させる前に、その選択を変更します。

必要なことは、基になる Win32 メッセージをキャプチャして、自分でイベントを発生させることです。これを行うには、ListBox をサブクラス化できます。

class MyListBox : ListBox
{
    private const int WM_LBUTTONDOWN = 0x201;

    public event EventHandler PreSelect;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_LBUTTONDOWN:
                OnPreSelect();
                break;
        }

        base.WndProc(ref m);
    }

    protected void OnPreSelect()
    {
        if(null!=PreSelect)
            PreSelect(this, new EventArgs());
    }

}

MyListBox クラスを使用して、次のように PreSelect イベントのハンドラーを追加できます。

this.lbPhysicianClinic.PreSelect += 
    new EventHandler(this.lbPhysicianClinic_PreSelect);

リストボックスがインデックスを変更する前に、イベント ハンドラ内で選択したインデックスにアクセスできます。

于 2011-05-19T07:34:40.557 に答える