修改TabPage文本时因代码位置不同出现异常与错误文本问题
问题与解决方案
问题描述
我尝试更新Tab标签文本,采用UserControl承载各类控件以便快速添加到新Tab中,textBox1带有“Enter Name”灰色占位文本,点击时清除。遇到以下问题:
- UserControl内的按钮修改Tab文本时,触发
System.NullReferenceException异常 - UserControl内的按钮调用MessageBox获取Tab文本时,同样触发该异常
- 主窗体按钮修改Tab文本时,始终将选中Tab文本改为“Enter Name”,无视输入内容
异常代码与原因分析
1. UserControl内按钮触发空引用异常
异常代码:
private void button1_Click(object sender, EventArgs e) { Form1 form = new Form1(); form.tabControl1.SelectedTab.Text = textBox1.Text; }
private void button1_Click(object sender, EventArgs e) { Form1 form = new Form1(); MessageBox.Show(form.tabControl1.SelectedTab.Text); }
原因:
这里new Form1()创建的是全新的主窗体实例,不是当前正在显示的那个。新实例的tabControl1尚未完成初始化,直接访问会导致空引用。
修复方案:
获取当前显示的主窗体实例,而非新建:
private void button1_Click(object sender, EventArgs e) { // 获取当前所在的主窗体 Form1 form = this.FindForm() as Form1; if (form != null && form.tabControl1.SelectedTab != null) { form.tabControl1.SelectedTab.Text = textBox1.Text; } }
2. 主窗体按钮修改Tab文本始终显示占位文本
异常代码:
private void button2_Click(object sender, EventArgs e) { UserControl control= new UserControl(); tabControl1.SelectedTab.Text = control.textBox1.Text; }
原因:new UserControl()创建的是全新的控件实例,里面的textBox1处于初始状态,显示的是占位文本“Enter Name”,并非用户在当前Tab页输入的内容。
修复方案:
获取当前选中Tab页内的UserControl实例:
private void button2_Click(object sender, EventArgs e) { // 获取当前选中Tab里的UserControl UserControl control = tabControl1.SelectedTab.Controls.OfType<UserControl>().FirstOrDefault(); if (control != null) { // 若textBox1是私有成员,需在UserControl中添加公开属性 tabControl1.SelectedTab.Text = control.textBox1.Text; } }
补充:如果UserControl的textBox1是私有成员,可在UserControl中添加公开属性获取文本:
public string InputText => textBox1.Text;主窗体中调用
control.InputText即可获取内容。
额外说明
主窗体按钮直接获取Tab文本正常,是因为tabControl1.SelectedTab.Text访问的是当前显示的Tab控件实例,没有新建对象,因此不会出现问题。
内容的提问来源于stack exchange,提问作者Matt Lynch
相关产品推荐
相关产品推荐

