如何将单个操作绑定到Windows窗体中的多个事件侦听器

时间:2012-09-07 01:36:10

标签: c# winforms visual-studio-2010

使用Windows窗体ListBox,如何将双击和返回键绑定到单个操作。我的方式我只是将同一个动作复制到listBox1_MouseDoubleClicklistBox1_KeyUp

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }

    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.textBox1.Text = this.listBox1.SelectedItem.ToString(); // Repeated
    }

    private void listBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Return)
        {
            this.textBox1.Text = this.listBox1.SelectedItem.ToString(); // Repeated
        }
    }
}

对于两个事件来说并不是一件大事,但有没有办法将这两个侦听器绑定到单个动作上?

3 个答案:

答案 0 :(得分:3)

由于两个事件代表的签名不同,因此无法真正组合事件处理程序,特别是如果您需要键盘处理程序以获得一些额外的逻辑,例如检查按下了哪个键。

但是,你可以做的是将赋值放入自己的方法中,然后从两个事件处理程序中调用它。这样你就不会违反DRY原则,如果你需要扩展行动,你只需要在一个地方做,以及如果你想对其他一些事件使用同样的行动,你将会是能够通过调用方法来做到这一点。

public partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent();
    }

    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        SyncListToTextBox();
    }

    private void listBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Return)
        {
            SyncListToTextBox();
        }
    }

    private void SyncListToTextBox() 
    {
        this.textBox1.Text = this.listBox1.SelectedItem.ToString();
    }
}

答案 1 :(得分:3)

您可以将两个事件绑定到同一个处理程序,但在这种情况下不建议使用它。您实际上会使代码更难阅读,您的代码仍将重复。在KeyUp事件中,您使用的是KeyEventArgs。

所以,如果他们共享相同的处理程序,你需要类似的东西。

private void CommonAction(object sender, EventArgs e)
{
  var keyEventArgs = e as KeyEventArgs;
  if(keyEventArgs!=null)
  {
    if(keyEventArgs.KeyCode == Keys.Return)
    {
      this.textBox1.Text = this.listBox1.SelectedItem.ToString(); 
    }
  }
  else
  {
    this.textBox1.Text = this.listBox1.SelectedItem.ToString(); // Still repeated
  }
}

我想说就像现在一样。如果在按下双击或输入键时需要执行更多操作,请将该逻辑移动到两个处理程序调用的单独方法中。

private void ListBoxItemWasSelected(string itemString)
{
  this.textBox1.Text = itemString;
  // Do more stuff
}

答案 2 :(得分:0)

检查您的设计师代码! 你应该在某个地方使用像 listBox1.onDoubleClick += listBox1_MouseDoubleClick;
你所要做的就是写一个方法

private void CommonAction(object sender, MouseEventArgs e){
    this.textBox1.Text = this.listBox1.SelectedItem.ToString(); 
}

并改为使用此方法:

listBox1.onDoubleClick += CommonAction;

可能不准确,但你有基本的想法吗?