从不同的表单访问控件
本文关键字:访问 控件 表单 | 更新日期: 2023-09-27 17:52:46
我有一个主要的形式,一些按钮,文本框,标签等。在第二个表单中,我想将主表单文本框中的文本复制到第二个表单中。
尝试:
var form = new MainScreen();
TextBox tb= form.Controls["textboxMain"] as TextBox;
textboxSecond.Text = tb.Text;
但是它只会导致一个异常。初始化主屏幕文本框并包含文本。当我将鼠标悬停在form
上时,我可以看到所有的控件都在那里。
我做错了什么?
查看原始代码,您得到的NullReferenceException
可能有两个原因。首先,tb
没有在您提供的代码中定义,所以我不确定那是什么。
其次,如果控件没有找到或不是TextBox
, TextBox textbox = form.Controls["textboxMain"] as TextBox
可以返回null
。默认情况下,控件被标记为private
访问器,这使我怀疑form.Controls[...]
将为private
成员返回null
。
虽然将控件标记为internal
可能会解决这个问题,但这并不是解决这种情况的最佳方法,只会导致未来的不良编码习惯。控件上的private
访问器非常好。
public
属性。例如,假设你在主屏幕上有一个TextBox
,名为usernameTextBox
,并希望将其公开给其他表单:
public string Username
{
get { return usernameTextBox.Text; }
set { usernameTextBox.Text = value; }
}
那么你需要在代码中做的就是:
var form = new MainForm();
myTextBox.Text = form.Username; // Get the username TextBox value
form.Username = myTextBox.Text; // Set the username TextBox value
这个解决方案的伟大之处在于,您可以更好地控制如何通过属性存储数据。您的get
和set
操作可以包含逻辑,设置多个值,执行验证和各种其他功能。
如果您正在使用WPF,我建议您查找MVVM模式,因为它允许您对对象状态做类似的操作。
PhoenixReborn正确。问题是,您正在创建一个新的MainScreen,这意味着创建了新的控件,所以除非控件中的文本在表单构造函数中初始化,否则它们将是空的。通常,处理这种情况的方法是将第一个表单实例传递给第二个表单,如下所示:
SecondForm second = new SecondForm(this);
和第二种形式:
public SecondForm (MainForm form)
{
// do something with form, like save it to a property or access it's controls
}
这样,第二个表单就可以访问第一个表单的控件。您可以考虑将需要使用的属性设置为公共属性(在设计器属性窗格中)。这样你就可以直接输入form.textboxMain.Text