在间歇工作的C#窗体之间传递值
本文关键字:之间 窗体 工作 | 更新日期: 2023-09-27 18:22:08
我试图在几个winform之间传递值,我总共有6个winform,用户将循环使用。我使用TextBox和Label控件在表单之间传递值。
当我打开Primary winform,然后单击按钮加载第二个winform时,一切都很好(我可以将值传递给First Form)。我的问题是,一旦我将用户引导到另一个表单,并this.Hide();
当前表单(第二个Winform),然后尝试使用第三个表单将值传递给第一个表单,我就会得到以下错误:
对象引用未设置为对象的实例。
我很困惑,因为应该将值传递给第一个Form的控件不是NULL
我使用相同的代码将所有表单连接在一起。
public MainForm MainForm;
然后我试图传递这样的值:
MainForm.textBox1.Text = txt_FileName.Text;
注意:在表单之间传递值的所有TextBox和Label控件都是public
有人碰到这个吗?或者有什么想法?.
您需要确保所有表单都已实例化(通过新的MyForm1()…)。仅仅声明MainForm类型的变量不会创建表单实例-你必须这样做。我猜当你试图访问控件时,你的一个表单还没有创建。
这也是不使用公共控件的另一个原因(也请参阅我的评论),因为控件的生存期与窗体的生存期有关。最好隐藏控件,使其不受公共访问,并通过数据对象向窗体发送数据-窗体会将所有这些值设置为自己的控件。这也使验证变得容易得多,因为控件的值只能设置为表单允许的值。如果从外部设置控件值,则在所有情况下都很难验证它们。
我假设您正在尝试使用模式表单,其工作方式类似于向导,用户可以按照清晰的路径从一个表单转到下一个表单。如果是这样,你可以这样做:
// Data class to set data in Form2
internal class Form2Data
{
public string Name;
...
}
...
internal class Form2 : Form
{
public static DialogResult ShowDlg ( Form2Data oData )
{
Form2 oFrm = new Form2 ();
oFrm.SetData ( oData );
DialogResult nResult = oFrm.ShowDialog ();
if ( nResult == DialogResult.Ok )
oFrm.GetData ( oData );
return ( nResult );
}
private void SetData ( Form2Data oData )
{
// Set control values here
}
private void GetData ( Form2Data oData )
{
// Read control values here
}
}
...
// You call this as such:
Form2Data oData = new Form2Data ();
oData.Name = "...";
DialogResult nResult = Form2.ShowDlg ( oData );
// after the call, oData should have updated values from Form2
if ( nResult == DialogResult.Ok )
{
// show your next form in a similar pattern - set up data
// call form's static method to pass it and then wait for
// the form to finish and return with updated data.
}
你也必须在其他形式中使用类似的模式。这确实需要做更多的工作,因为您需要为所有表单设置不同的数据对象,但通过这种方式,您可以在表单显示之前和之后(在SetData和GetData中)轻松地进行验证。它还可以更好地封装程序,因为无法从外部访问控件。
.Net 2.0及更高版本有一个用于windows窗体的功能,称为"默认实例",它为您提供一个与类型同名的实例。此功能的目的是与从旧的vb6应用程序迁移的代码兼容。如果您不是从旧的vb应用程序迁移,通常最好避免使用默认实例。他们会给你带来麻烦,就像你现在一样。相反,创建一个变量来保存您自己构建的表单实例。
您应该使用表单的实例值来传递值。
例如:
SecondForm secForm2 = new SecondForm();
secForm2.textBox1.Text = txt_FileName.Text
因此,如果您将值从SecondForm传递到ThirdForm:
ThirdForm thiForm = new ThirdForm();
thiForm.textBox1.Text = textBox1.Text