影响多个表单对象的功能(checkedListBox)

时间:2019-03-07 15:22:02

标签: c# winforms

我在一个表单上有多个checkedListBox。对于每个checkedListBox,我都有一个用于“全选”项目的按钮:

componentDidMount

其中每个按钮具有与checkedListBox2、3、4等相同的功能。

我不想复制每个单击函数中的代码,而是想简单地使用一个函数来替换与按钮对应的“ checkedListBox”。例如。 “ btnSelectAll1”发送“ checkedListBox1”到函数,“ btnSelectAll2”发送“ checkedListBox2”,依此类推。

类似的东西:

componentDidUpdate

2 个答案:

答案 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