0

Windows フォームの ListBox を使用して、ダブルクリックとリターン キーの両方を 1 つのアクションにバインドするにはどうすればよいですか。私のやり方では、同じアクションを と の両方にコピーしまし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
        }
    }
}

2 つのイベントだけでは大したことではありませんが、これらのリスナーの両方を 1 つのアクションにバインドする方法はありますか?

4

3 に答える 3

3

2 つのイベントのデリゲートの署名が異なるため、実際にはイベント ハンドラーを組み合わせることができません。特に、どのキーが押されたかを確認するなど、キーボード ハンドラーに追加のロジックが必要な場合はそうです。

ただし、できることは、割り当てを独自のメソッドに入れ、両方のイベント ハンドラーから呼び出すことです。そうすれば、DRY 原則に違反することはありません。アクションを拡張する必要がある場合は、1 か所で実行するだけで済みます。また、同じアクションを他のイベントに使用したい場合は、次のようになります。メソッドを呼び出すだけで実行できます。

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

2 つのイベントを同じハンドラーにバインドできますが、この場合はお勧めしません。実際には、コードが少し読みにくくなり、コードが繰り返されます。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 キーが押されたときにさらに多くのことを行う必要がある場合は、そのロジックを、2 つのハンドラーが呼び出す別のメソッドに移動します。

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 に答える