Функция для воздействия на несколько объектов формы (checkedListBox) - PullRequest
1 голос
/ 07 марта 2019

У меня есть несколько проверенных списков в форме.Для каждого checkListBox у меня есть кнопка «Выбрать все»:

private void btnSelectAll1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < checkedListBox1.Items.Count; i++)
    {
        checkedListBox1.SetItemCheckState(i, CheckState.Checked);
    }
}

Где каждая кнопка имеет одинаковую функциональность только с checkListBox2, 3, 4 и т. Д.

Вместо копирования кодав каждой функции щелчка я хотел бы просто иметь функцию, которая заменяет «selectedListBox», соответствующий кнопке.Например, «btnSelectAll1» отправляет «checkedListBox1» в функцию, а «btnSelectAll2» отправляет «checkedListBox2» и т. Д.

Что-то вроде:

private void btnSelectAll1_Click(object sender, EventArgs e)
{
    SelectAll(checkedListBox1)
}

private void btnSelectAll2_Click(object sender, EventArgs e)
{
    SelectAll(checkedListBox2)
}

void SelectAll(strCheckedListBox)
{
    for (int i = 0; i < strCheckedListBox.Items.Count; i++)
    {
        strCheckedListBox.SetItemCheckState(i, CheckState.Checked);
    }
}

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Вы можете использовать свойство Control.Tag для сохранения правильной ссылки checkedListBox в каждой кнопке:

Сначала назначьте checkedListBox контрольные ссылки в Form_Load:

btnSelectAll1.Tag = checkedListBox1;
btnSelectAll2.Tag = checkedListBox2;
...
btnSelectAll10.Tag = checkedListBox10;

Затем создайте один обработчик событий для всех этих кнопок (обязательно укажите событие Click каждой кнопки в файле Form.Designer.cs на этот обработчик события):

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 голос
/ 07 марта 2019

Простой, в каждом событии в 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 может быть новым для вас.См. Сопоставление с образцом в C # 7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...