如何动态设置TabPage的活动控件
本文关键字:TabPage 活动 控件 设置 何动态 动态 | 更新日期: 2023-09-27 18:17:39
我不是在问如何设置窗体的活动控件(我知道如何做到这一点)。我在一个TabControl
中有2个TabPage
,我希望当某个TabPage
被选中时,某个TabPage
的控制成为SelectedTab
的主动控制。
我已经试过了:
if (searcher_tabControl.SelectedIndex == 0)
this.ActiveControl = findWhat_find_textBox;
else//SelectedIndex == 1
this.ActiveControl = findWhat_replace_textBox;
这当然现在工作,但如果我想改变我的程序/TabControl
的设计,我应该修改这个控制流(如果我记得的话)。
你知道解决这个问题的更好方法吗?
用TabControl:
将其放入表单的构造函数中tabControl1.SelectedIndexChanged += (s, e) =>
ActiveControl = tabControl1.SelectedTab.Controls.Cast<Control>()
.SingleOrDefault(x => x.TabIndex == 0);
每次切换制表符时,它将选择TabIndex
为0的控件(如果有的话)。
你必须确保你想要设置为"活动"的控件在标签页中的TabIndex
为0。如果忘记将1设置为0,则不会将任何控件设置为"活动"(也不会抛出异常)。
如何调用这种方式的添加和事件处理程序?我从未在c#中见过
=>
操作符的用法。
这是一个内联方法。如果您将其与设置事件方法的正常方式进行比较,那么s
是您的object sender
, e
是您的EventArgs e
,而lambda运算符=>
之后的语句是该事件要执行的代码。如果你想执行多行代码,你可以用花括号把它们括起来:
... += (s, e) => { something(); somethingElse(); };
或者,因为我们实际上没有对参数做任何事情,你也可以说:
tabControl1.SelectedIndexChanged += delegate
{
ActiveControl = tabControl1.SelectedTab.Controls.Cast<Control>()
.SingleOrDefault(x => x.TabIndex == 0);
};
你使用的任何方法,这些或你习惯的方式,最终结果都是一样的。参见:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions.
我不知道每个选项卡上的控件是什么,所以我的例子集中在第一个tabindex为活动的控件上。尽管如此,订阅tabControl上的Selected事件并放置以下代码:
private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
this.ActiveControl = e.TabPage.Controls.OfType<Control>().OrderBy(c => c.TabIndex).First();
}