WinForm ListBox中的MouseDown杀死SelectedIndexChanged

时间:2011-05-18 19:31:44

标签: winforms listbox selectedindexchanged onmousedown

我正在编写一些代码来检测打开MultiSelect的WindForms ListBox中的选择切换。由于SelectedIndexChanged只让我看到点击后选择的内容,我一直在寻找一种方法来检测单击ListBox之前选择的内容。我实现了MouseDown事件,我可以得到我想要的,但不幸的副作用是我杀死了SelectedIndexChanged事件。它不会开火。

这是否已知行为?有关在点击之前进入选择列表的想法吗?

感谢。

根据要求编辑包含代码段。

Designer生成的事件:

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事件消失时触发。

希望这能澄清事情。

1 个答案:

答案 0 :(得分: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);

在事件处理程序内部,您可以在列表框更改之前访问所选索引。