如何从添加到另一个控件的子控件访问变量
本文关键字:控件 访问 变量 另一个 添加 | 更新日期: 2023-09-27 18:34:06
我有以下代码(这是我试图在其中包含所有重要信息的摘录)
public partial class MyTopScreen : Form
{
public bool _myVariable ;
public CommonForm _commonGridForm;
public MyTopScreen(bool first_param, string second_param )
{
CommonForm commonGridForm = new CommonForm();
DataGridView dataGridView1 = commonGridForm.dataGridView1;
_commonAttributForm = commonAttributForm;
InitializeComponent();
this.TabPage1.Controls.Add(dataGridView1);
}
}
然后当我在里面时CommonForm
如下:
public partial class CommonForm : Form
{
public CommonForm()
{
//My Question is how do I access the _myVariable from this point in the code ?
//this.parent doesnot work or does not give me access to _myVaribale
}
}
提前感谢您的帮助。
一种方法是,将MyTopScreen
的实例传递给另一个类的构造函数(如果它与它相关)。将其存储在字段中。
public partial class CommonForm : Form
{
public CommonForm(MyTopScreen screen)
{
this.TopScreen = screen;
}
private MyTopScreen TopScreen{ get; set; }
}
现在,您可以通过TopScreen._myVariable.
在CommonForm
中访问该变量
您必须将其传递给构造函数:
CommonForm commonGridForm = new CommonForm(this);
您必须将父级转换为适当的类型:
MyTopScreen myParent = this.parent as MyTopScreen;
if (myParent != null)
{
bool myVariableFromParent = myParent._myVariable;
}
只要小心转换,因为如果父控件是不同的控件,那么在尝试访问 _myVariable
时将出现空引用异常。另外,不要尝试直接强制转换((MyTopScreen)this.parent
),因为如果父控件是不同的控件,则会出现强制转换异常。
this.Parent
不起作用的原因是您从未将MyTopScreen
设置为父级。 您需要向代码添加commonGridForm.Parent = this
。 然后你可以打电话给((MyTopScreen) this.Parent)._myVariable
. 但这只是为了让您当前的代码正常工作;这绝对不是最好的方法。
我建议的一项改进是不要公开您的字段,而是将它们用作通过属性公开的支持字段(请参阅此处)。
此外,还可以通过构造函数将对父窗体的引用传递到子窗体中。 代码可能如下所示:
public partial class MyTopScreen : Form
{
//keep your fields private.
private bool _myVariable;
private CommonForm _commonGridForm;
//expose fields through properties.
public bool MyVariable
{
get { return _myVariable; }
}
public CommonForm CommonGridForm
{
get { return _commonGridForm; }
}
public MyTopScreen(bool first_param, string second_param)
{
CommonForm commonGridForm = new CommonForm(this);
DataGridView dataGridView1 = commonGridForm.dataGridView1;
_commonAttributForm = commonAttributForm;
InitializeComponent();
this.TabPage1.Controls.Add(dataGridView1);
}
}
public partial class CommonForm : Form
{
private MyTopScreen _parent;
//inject parent reference in child form's constructor.
public CommonForm(MyTopScreen withParent)
{
_parent = withParent;
//_parent.MyVariable <-- here's how you'd access your var.
}
}
创建 CommonForm 类的参数化构造函数(构造函数重载)并将布尔值传递给它。
public partial class MyTopScreen : Form
{
public bool _myVariable ;
public CommonForm _commonGridForm;
public MyTopScreen(bool first_param, string second_param )
{
CommonForm commonGridForm = new CommonForm(_myVariable);
DataGridView dataGridView1 = commonGridForm.dataGridView1;
_commonAttributForm = commonAttributForm;
InitializeComponent();
this.TabPage1.Controls.Add(dataGridView1);
}
}
public partial class CommonForm : Form
{
public CommonForm(bool _myVariable)
{
//Here you access the variable
}
}
有几种方法可以做到这一点。 如果值不会更改,则可以将其传递给 CommonForm 的构造函数(推荐):
public partial class CommonForm : Form
{
public CommonForm(bool myVariable)
{
// available
}
}
CommonForm commonGridForm = new CommonForm(_myVariable);
如果它可以更改,则可以将实例传递给构造函数中的父窗体:
public partial class CommonForm : Form
{
public CommonForm(MyTopScreen parent)
{
// available
parent._myVariable;
}
}
CommonForm commonGridForm = new CommonForm(this);