从多个表单访问的C#全局事件

时间:2011-08-10 05:14:39

标签: c# winforms events

我有一个功能可以在用户右键单击列表框时取消选择列表框中的所有选定项目。有没有办法将此功能应用于我的项目中的所有列表框?

我想知道是否有另一种方法,而不是创建一个类并将该函数放在类中等等:

public class selectedListbox{
   private void setSelected(ListBox details){
   details.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listBoxDeselectAll);
   }

   private void listBoxDeselectAll(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                ((ListBox)sender).ClearSelected();
            }
        }

}

然后为每个列表框执行此操作:

selectedListBox h = new selectedListBox();
h.setSelected(listboxNameHere);

3 个答案:

答案 0 :(得分:2)

可能有扩展名+ lambda?

public static class ListBoxSelectExtension
{
  public static void SetSelected(this ListBox Me)
  {
      Me.MouseDown +=
          (sender, e) =>
          {
              if (e.Button == MouseButtons.Right)
                  ((ListBox)sender).ClearSelected();
          };
  }
}

通过这种方式,您可以执行以下操作,而无需实例化新类或必须将所有列表框都设为派生类:

MyListBox1.SetSelected();
MyListBox2.SetSelected();

答案 1 :(得分:1)

最直接的方法是创建一个继承自ListBox的类:

public class CustomListBox : ListBox
{
    public void SetSelected()
    {
        this.MouseDown += new MouseEventHandler(this.DeselectAll);
    }

    public void UnsetSelected()
    {
        this.MouseDown -= new MouseEventHandler(this.DeselectAll);
    }

    private void DeselectAll(object sender, MouseEventArgs e)
    {
        // ...
    }
}

您可以像使用标准列表框一样使用自定义列表框。

答案 2 :(得分:1)

   public class MyListBox : ListBox
    {
        public sListBox() : base()
        {
             MouseDown += new System.Windows.Forms.MouseEventHandler( this.MouseDownFired ); 
        }

        private void MouseDownFired(object sender, MouseEventArgs args)
        {
          if ( args.Button == MouseButtons.Right ) 
          { 
             SelectedItems.Clear();
          }
        }