我正在一个具有TabControl和5个TabPage控件的项目中,每个TabPage至少有10个按钮启动不同的窗体。
在表单的Load
事件上,我遍历所有TabPage并将所有按钮存储在一个集合中(名称作为值,文本作为键),还将所有按钮的文本存储在ComboBox中,以便当我选择此按钮时按钮在组合框中的文本,然后单击“执行”按钮,将使用此代码单击具有所选项目为文本的任何按钮...
Dim btnText As String = myCollection(myCombo.Text)
Dim btnName as Button = DirectCast(Controls.Find(btnText, True)(0), Button)
btnName.PerformClick()
该代码仅适用于TabPage被选中的按钮。如何在不选择按钮的TabPage的情况下对按钮执行此单击操作?
我的目标是允许用户快速执行按钮单击,而无需在TabPage上查找它。
而不是调用PerformClick
,而是将代码从Click
事件处理程序中取出,并将其放入自己的方法中。然后,您可以从任何位置调用该方法,包括Click
的Buttons
事件处理程序。
实际上,在这种情况下甚至不涉及Buttons
。使用ComboBox
中的文本或索引来识别要执行的操作,然后让每个Button
提供相同的文本或数字。假定每个Button
执行相同的操作,但具有不同的表单标识符。
正确的设计是将用户界面元素与激活用户界面元素时应执行的操作分开。
因此您的按钮单击事件处理程序不应执行该操作,它应调用执行此操作的方法。
之所以这样分离,是因为它使您能够通过使用其他界面元素来执行此操作。一个常见的示例是一个按钮,其功能与菜单项相同。对于您自己的情况:无论您按下按钮还是从组合框中选择按钮,操作都是相同的。
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添加到combobox1.Items。显示键,并在选择一个项目时获取值。这样,您不需要单独的字典。但是,这样做有同样的缺点,即只能通过从组合框中选择项目来做到这一点。如果您还想要具有此功能的ListBox,则最好使用单独的字典。