如何从添加到另一个控件的子控件访问变量

本文关键字:控件 访问 变量 另一个 添加 | 更新日期: 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);