【问题标题】:C# global event accesed from multiple forms从多个表单访问的 C# 全局事件
【发布时间】:2011-08-10 05:14:38
【问题描述】:

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

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

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);

【问题讨论】:

  • 您可能会发现创建一个继承自 ListBox 并具有此功能的新控件很有用。
  • 我认为您可以使用 form.controls 集合,但我没有足够的经验给您完整的答案。检查msdn
  • @Inuyasha 你想给我更多关于创建新控件的细节吗?谢谢

标签: c# winforms events


【解决方案1】:

也许带有扩展名 + 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();

等等

【讨论】:

  • 你也可以使用@this作为变量名,IMO它让它感觉更自然(作为一个正常的方法)
【解决方案2】:

最直接的方法是创建一个继承自 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)
    {
        // ...
    }
}

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

【讨论】:

    【解决方案3】:
       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();
              }
            }
    

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 2011-01-29
      • 2017-02-20
      • 2017-01-08
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2010-12-30
      相关资源
      最近更新 更多