Как Button.PerformClick на неактивной TabPage? - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над проектом, в котором есть TabControl с 5 элементами управления TabPage, каждая TabPage имеет не менее 10 кнопок, запускающих разные формы. TabPages и сохраните все кнопки в коллекции (Name as Value, Text as Key), а также сохраните текст всех кнопок в ComboBox, чтобы, когда я выбираю текст этой кнопки в ComboBox и нажимаю кнопку 'go' , любая кнопка с выбранным элементом в тексте будет нажата с использованием этого кода ...

Dim btnText As String = myCollection(myCombo.Text) 
Dim btnName as Button = DirectCast(Controls.Find(btnText, True)(0), Button) 
btnName.PerformClick()

Код работает только с кнопками, у которых выбрана TabPage. Как я могу выполнить это действие щелчка на кнопках, не выбирая их TabPage?

Моя цель - позволить пользователю быстро выполнить щелчок по кнопке, не ища его на TabPages.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Правильный дизайн заключался бы в отделении элементов пользовательского интерфейса от действий, которые должны выполняться при активации элемента пользовательского интерфейса.

Таким образом, обработчик события нажатия кнопки не должен выполнять действие, он должен вызывать метод, выполняющий это действие.

Причина этого разделения заключается в том, что он позволяет вам выполнять это действие, используя другие элементы интерфейса. Типичный пример - кнопка, которая выполняет то же действие, что и пункт меню. В вашем случае: действие одинаково независимо от того, нажимаете ли вы кнопку или выбираете ее из поля со списком.

private void OnFileNew() {...}
private void OnFileOpen() {...}
private void OnFileSave() {...}

private void OnButtonFileNewClicked(object sender, EventArgs e)
{
    this.OnFileNew();
}

private void OnMenuItemFileNewClicked(object sender, EventArge e)
{
    this.OnFileNew();
}

Dictionary<string, Action> comboActions = new Dictionary<string, Action>()
{
    { this.ButtonFileNew.Name, OnFileNew },
    { this.ButtonFileOpen.Name, OnFileOpen },
    { this.ButtonFileSave.Name, OnFileSave },
    ...
}

// fill the name with the names of the comboActions:
comboBox1.Items.AddRange(comboActions.Keys);

private void OnComboItemSelected(object sender, ...)
{
    string selectedName = ((ComboBox)sender).SelectedValue;
    Action selectedAction = comboActions[selectedName];
    // execute the selectedAction:
    selectedAction();
}

Другая возможность - добавить KeyValuePairs в поле со списком1.Items. Отобразите ключ, и когда элемент выбран, выберите значение. Таким образом, вам не понадобится отдельный словарь. Однако у этого есть тот же недостаток, что вы можете сделать это, только выбирая элементы из поля со списком. Если вам также нужен ListBox с этой функциональностью, лучше использовать отдельный словарь.

0 голосов
/ 26 мая 2020

Вместо вызова PerformClick возьмите код из обработчика событий Click и поместите его в собственный метод. Затем вы можете вызвать этот метод из любого места, включая обработчики событий Click из Buttons.

Фактически, в этом случае даже не задействуйте Buttons. Используйте текст или указатель из ComboBox, чтобы определить действие, которое нужно выполнить, а затем пусть каждый Button предоставит одинаковый текст или номер. Это предполагает, что каждый Button выполняет одно и то же, но с другим идентификатором формы.

...