使用Windows窗体ListBox,如何将双击和返回键绑定到单个操作。我的方式我只是将同一个动作复制到listBox1_MouseDoubleClick
和listBox1_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
}
}
}
对于两个事件来说并不是一件大事,但有没有办法将这两个侦听器绑定到单个动作上?
答案 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;
可能不准确,但你有基本的想法吗?