0

使用 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
        }
    }
}

对于两个事件来说并不是什么大问题,但有没有办法将这两个监听器绑定到单个动作?

4

3 回答 3

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();
    }
}
于 2012-09-07T02:28:00.733 回答
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
}
于 2012-09-07T02:28:23.260 回答
0

检查您的设计器代码!在某个地方你应该有这样的代码
listBox1.onDoubleClick += listBox1_MouseDoubleClick;
你所要做的就是编写一个方法

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

并改用此方法:

listBox1.onDoubleClick += CommonAction;

可能不准确,但是您了解基本概念吗?

于 2012-09-07T01:41:51.777 回答