如何动态设置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的设计,我应该修改这个控制流(如果我记得的话)。

你知道解决这个问题的更好方法吗?

如何动态设置TabPage的活动控件

用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();
}