我在一个表单上有多个checkedListBox。对于每个checkedListBox,我都有一个用于“全选”项目的按钮:
componentDidMount
其中每个按钮具有与checkedListBox2、3、4等相同的功能。
我不想复制每个单击函数中的代码,而是想简单地使用一个函数来替换与按钮对应的“ checkedListBox”。例如。 “ btnSelectAll1”发送“ checkedListBox1”到函数,“ btnSelectAll2”发送“ checkedListBox2”,依此类推。
类似的东西:
componentDidUpdate
答案 0 :(得分:2)
您可以使用Control.Tag
属性在每个按钮中存储正确的checkedListBox
引用:
首先,在checkedListBox
中分配Form_Load
控件引用:
btnSelectAll1.Tag = checkedListBox1;
btnSelectAll2.Tag = checkedListBox2;
...
btnSelectAll10.Tag = checkedListBox10;
然后,为所有所有按钮创建一个事件处理程序(确保将Form.Designer.cs文件中每个按钮的Click
事件指向此事件处理程序):
private void SelectAll_Click(object sender, EventArgs e)
{
var clickedButton = sender as Button;
var checkedListBoxControl = clickedButton.Tag as CheckedListBox;
// Do what you need with checkedListBoxControl...
}
答案 1 :(得分:1)
简单,在winforms中的每个事件中,发送者都是引发事件的对象。
Button button1 = new Button() {...}
Button button2 = new Button() {...}
button1.OnClicked += this.OnButtonClicked;
button2.OnClicked += this.OnButtonClicked;
// both buttons will call OnButtonClicked when pressed
您也可以在Visual Studio Designer中的属性窗口中使用带有闪电标记的选项卡来执行此操作。只需选择您以前使用的功能即可。
private void OnButtonClicked(object sender, EventArgs e)
{
Button button = (Button)sender;
// now you know which button was clicked
...
}
请注意是否让其他项目也称为此偶数处理程序
ListBox listBox = new ListBox();
listBox.OnClicked += this.OnButtonClicked;
private void OnButtonClicked(object sender, EventArgs e)
{
// sender can be either a Button or a ListBox:
switch (sender)
{
case Button button:
ProcesButtonPressed(button);
break;
case ListBox listBox:
ProcessListBoxPressed(listBox);
break;
}
}
此switch语句可能对您来说是新的。参见Pattern Matching in C# 7