从不同的表单访问控件

本文关键字:访问 控件 表单 | 更新日期: 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

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

如果您正在使用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