我是 C# 新手,正在构建一个应用程序以多种方式与数据交互。我想为用户提供通过在主窗体 (frmTabControl) 上的 TabControl 中显示和隐藏选项卡来自定义界面的机会。
所以我添加了第二个表单,它将作为我的设置对话框(frmSettings)。
在此设置表单上,我有一个复选框来代表 TabControl 中的每个选项卡。
我想做的是,当设置对话框关闭时,选项卡控件会更新为仅显示选中相应复选框的选项卡。
到目前为止,我已经获得设置表单的“FormClosed”事件,以删除任何未选中复选框的选项卡。但我的问题是将它们添加回来。
所以在我的主窗体(frmTabControl)中,我有一个包含 4 个页面的 TabControl:tabPage1、tabPage2、tabPage3 和 tabPage4
我的表单代码顶部有此代码:
public partial class frmTabControl : Form
{
public static frmTabControl frmTBInstance;
public TabControl tabC;
public frmTabControl()
{
InitializeComponent();
frmTBInstance = this;
tabC = tabControl1;
}
// etc etc
然后在我的设置对话框(frmSettings)中,我有一个复选框来代表每个选项卡页:chkShowTabPage1,chkShowTabPage2,chkShowTabPage3,chkShowTabPage4
然后我将这段代码放在 frmSettings 表单的 FormClosed 事件中。
if (chkShowTabPage1.Checked && !frmTabControl.frmTBInstance.tabC.TabPages.ContainsKey("tabPage1"))
{
frmTabControl.frmTBInstance.tabC.TabPages.Insert(0, tabPage1);
}
else if (!chkShowTabPage1.Checked && frmTabControl.frmTBInstance.tabC.TabPages.ContainsKey("tabPage1"))
{
frmTabControl.frmTBInstance.tabC.TabPages.RemoveByKey("tabPage1");
}
// repeats for the other 3 check boxes
但是,if
代码块的
if else
部分中的tabPage1无法识别tabPage1名称,它显示一个问题,指出“tabPage1在此上下文中不存在”。
else if
代码块的if else
部分工作正常,并按预期删除选项卡。
所以我想我的问题是你不能以这种方式通过名称属性访问现有的选项卡页面吗?
如果我在主 frmTabControl 上放置一个按钮并让它执行以下代码:
if (!tabControl1.TabPages.Contains(tabPage1))
tabControl1.TabPages.Insert(0, tabPage1);
else
tabControl1.TabPages.Remove(tabPage1);
它可以关闭和打开第一个选项卡。因此,问题仅出现在我从其他表单访问选项卡控件时。
我可以通过将 tabPage1 放在引号中来添加“新”标签页,即
frmTabControl.frmTBInstance.tabC.TabPages.Insert(2, "tabPage1");
但这不是我需要的(我需要它将它添加回已经存在的标签页中)。
我是否在 frmSettings 表单中错误地创建了 tabcontrol 的实例?
我对 C# 还很陌生,所以有点迷失,并且已经尝试了几个小时来找到解决方案,这是我最接近让它工作的方法。
我不知道您的代码的确切问题是什么;不过,我已经制定了一个可行的解决方案。
请注意,在控件的属性窗口中的“设计”部分,您可以将
Modifier
设置为 Public
。我做这个是为了TabControl
中的frmTabControl
。像这样,可以从其他表单访问它。
我还向
frmSettings
的构造函数添加了一个参数,可以传递 frmTabControl
的实例:
private readonly frmTabControl _frmTabControl;
public frmSettings(frmTabControl frmTabControl)
{
_frmTabControl = frmTabControl;
InitializeComponent();
}
然后我将复选框添加到数组中以能够循环处理它们:
private void FrmSettings_FormClosed(object sender, FormClosedEventArgs e)
{
var chkBoxes = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5 };
for (int i = 0; i < chkBoxes.Length; i++) {
string tabKey = "tabPage" + (i + 1);
bool containsTab = _frmTabControl.tabControl1.TabPages.ContainsKey(tabKey);
if (chkBoxes[i].Checked) {
if (!containsTab) {
_frmTabControl.tabControl1.TabPages.Add(tabControl1.TabPages[tabKey]);
}
} else {
if (containsTab) {
_frmTabControl.tabControl1.TabPages.RemoveByKey(tabKey);
}
}
}
}
最后在
frmTabControl
我有一个带有此 Click 事件处理程序的按钮:
private void BtnConfigureTabs_Click(object sender, EventArgs e)
{
var frm = new frmSettings(this);
frm.ShowDialog();
}
不再需要这些变量:
public static frmTabControl frmTBInstance;
public TabControl tabC;