我有一个带有一些按钮、文本框、标签等的主表单。在第二个表单上,我想将主表单文本框中的文本复制到第二个表单上。
试过:
var form = new MainScreen();
TextBox tb= form.Controls["textboxMain"] as TextBox;
textboxSecond.Text = tb.Text;
但这只会导致异常。主屏幕文本框已初始化并包含文本。当我将鼠标悬停在上面时,form
我可以看到所有控件都在那里。
我究竟做错了什么?
凤凰重生是正确的。问题是您正在创建一个新的 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
。
查看原始代码,NullReferenceException
您得到的可能有两个原因。首先,tb
在您提供的代码中没有定义,所以我不确定那是什么。
其次,如果控件未TextBox textbox = form.Controls["textboxMain"] as TextBox
找到或不是. 默认情况下,控件标记有访问器,这使我怀疑它会返回成员。null
TextBox
private
form.Controls[...]
null
private
虽然将控件标记为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模式,因为它允许您对对象状态进行类似操作。