C#winform:从其他形式访问公共属性以及静态和公共属性之间的区别

我试图了解静态和公共属性间的区别.但是当我试图以其他形式访问我的公共财产“测试”时,它会说’null’.

继表格1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private string _test;

    public string Test
    {
        get { return _test; }
        set { _test = value; }
    }

    private void Form1_Load(object sender,EventArgs e)
    {
        _test = "This is a test";
    }

    private void button1_Click(object sender,EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }
}

这是Form2:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender,EventArgs e)
    {
        Form1 frm1 = new Form1();
        label1.Text = frm1.Test;
    }
}

要检查Form1中“Test”的值,我在此行中添加一个断点:

label1.Text = frm1.Test;

但值为’null’.

请帮助我如何访问其他表单的公共属性.

而且我试图让这个公共财产成为一个“公共静态”.我可以使用这个来访问它:

Form1.Test

但我注意到我可以从Form2更改“Test”值,我不想发生这种情况.这就是我试图使用公共财产但没有运气的原因.有人可以向我澄清这些事情.谢谢你们的帮助!

EDIT: (For follow up question)

John Koerner爵士的答案是我的问题的最佳答案.但我有一个跟进问题,我试图让这些’test’属性成为’静态’,我注意到即使我将这个属性设置为静态或公共属性,它仍然可以在Form2中编辑.为了让自己清楚这里是一个样本:

public partial class Form2 : Form
{
    private Form1 f1;
    public Form2(Form1 ParentForm)
    {
        InitializeComponent();
        f1 = ParentForm;
    }

    private void Form2_Load(object sender,EventArgs e)
    {
        label1.Text = f1.Test;
    }

    private void button1_Click(object sender,EventArgs e)
    {
        f1.Test = "This test has been changed!";

        this.Close();
    }
}

在Form2关闭后,我尝试在Form1_Load中再次中断以检查’Test’的值,并且它已被更改!如何在Form1中将公共属性设置为只在Form2中读取并且不能编辑?请向我澄清一下.非常感谢!

解决方法

您的属性一个实例变量,因此Form1的不同实例的值可能不同.

如果您尝试从父窗体访问实例变量,最简单的方法是将Form1传递给Form2的构造函数.

public partial class Form2 : Form
{
    private Form1 f1;
    public Form2(Form1 ParentForm)
    {
        InitializeComponent();
        f1 = ParentForm;
    }

    private void Form2_Load(object sender,EventArgs e)
    {
        label1.Text = f1.Test;
    }
}

然后,当您从Form1创建一个新的Form2时,您可以这样做:

Form2 frm2 = new Form2(this);

如果您希望您的属性是只读的,则不能指定一个setter:

public string Test
{
    get { return _test; }
}

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...