-5

我有一个带有一些按钮、文本框、标签等的主表单。在第二个表单上,我想将主表单文本框中的文本复制到第二个表单上。

试过:

var form = new MainScreen();
TextBox tb= form.Controls["textboxMain"] as TextBox;
textboxSecond.Text = tb.Text;

但这只会导致异常。主屏幕文本框已初始化并包含文本。当我将鼠标悬停在上面时,form我可以看到所有控件都在那里。

我究竟做错了什么?

4

2 回答 2

1

凤凰重生是正确的。问题是您正在创建一个新的 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

于 2013-01-12T18:55:56.100 回答
1

查看原始代码,NullReferenceException您得到的可能有两个原因。首先,tb在您提供的代码中没有定义,所以我不确定那是什么。

其次,如果控件未TextBox textbox = form.Controls["textboxMain"] as TextBox找到不是. 默认情况下,控件标记有访问器,这使我怀疑它会返回成员。nullTextBoxprivateform.Controls[...]nullprivate

虽然将控件标记为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

这个解决方案的重要之处在于,您可以更好地控制通过属性存储数据的方式。您的getset操作可以包含逻辑、设置多个值、执行验证和各种其他功能。

如果您使用的是WPF,我建议您查看MVVM模式,因为它允许您对对象状态进行类似操作。

于 2013-01-12T19:18:39.117 回答