Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在windows窗体中将单个操作绑定到多个事件侦听器_C#_Winforms_Visual Studio 2010 - Fatal编程技术网

C# 如何在windows窗体中将单个操作绑定到多个事件侦听器

C# 如何在windows窗体中将单个操作绑定到多个事件侦听器,c#,winforms,visual-studio-2010,C#,Winforms,Visual Studio 2010,使用windows窗体列表框,如何将双击和返回键绑定到单个操作。按照我的方式,我只是将相同的操作复制到listBox1\u MouseDoubleClick和listBox1\u KeyUp public partial class MyForm : Form { public MyForm() { InitializeComponent(); } private void listBox1_MouseDoubleClick(object sen

使用windows窗体列表框,如何将双击和返回键绑定到单个操作。按照我的方式,我只是将相同的操作复制到
listBox1\u MouseDoubleClick
listBox1\u 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
        }
    }
}
对于两个事件来说,这并不是什么大问题,但是有没有办法将这两个侦听器绑定到单个操作?

检查您的设计器代码! 在某些地方,您应该有类似
listBox1.onDoubleClick+=listBox1\u鼠标双击
你所要做的就是写一个方法

private void CommonAction(object sender, MouseEventArgs e){
    this.textBox1.Text = this.listBox1.SelectedItem.ToString(); 
}
并改用这种方法:

listBox1.onDoubleClick+=CommonAction

可能不准确,但您了解基本想法吗?

检查您的设计器代码! 在某些地方,您应该有类似
listBox1.onDoubleClick+=listBox1\u鼠标双击
你所要做的就是写一个方法

private void CommonAction(object sender, MouseEventArgs e){
    this.textBox1.Text = this.listBox1.SelectedItem.ToString(); 
}
并改用这种方法:

listBox1.onDoubleClick+=CommonAction


可能不准确,但您知道基本的想法吗?

由于两个事件的委托的签名不同,您无法真正组合事件处理程序,特别是如果您需要键盘处理程序具有一些附加逻辑,例如检查按下了哪个键

但是,您可以做的是将赋值放入它自己的方法中,然后从两个事件处理程序调用它。这样,您就不会违反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();
    }
}

由于两个事件的委托的签名不同,因此无法真正组合事件处理程序,特别是如果需要键盘处理程序具有一些附加逻辑,例如检查按下了哪个键

但是,您可以做的是将赋值放入它自己的方法中,然后从两个事件处理程序调用它。这样,您就不会违反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();
    }
}

您可以将这两个事件绑定到同一个处理程序,但在本例中不建议这样做。实际上,您将使代码更难阅读,并且您的代码仍将重复。在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
  }
}
我要说的是保持现状。如果在按下双击或enter键时需要执行更多操作,请将该逻辑移动到两个处理程序调用的单独方法中

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

您可以将这两个事件绑定到同一个处理程序,但在本例中不建议这样做。实际上,您将使代码更难阅读,并且您的代码仍将重复。在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
  }
}
我要说的是保持现状。如果在按下双击或enter键时需要执行更多操作,请将该逻辑移动到两个处理程序调用的单独方法中

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

似乎它可以工作,但如何检查
是否(e.KeyCode==Keys.Return)
?我无法传入
KeyEventArgs
MouseEventArgs
?似乎可以工作,但如何检查
是否(e.KeyCode==Keys.Return)
?我无法传入
KeyEventArgs
MouseEventArgs