7

我试图了解静态属性和公共属性之间的区别。但是当我尝试以其他形式访问我的公共财产“测试”时,它显示为“空”。

继承人Form1:

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();
    }
}

这是表格2:

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;

但该值为“空”。

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

顺便说一句,我试图让这个公共财产成为“公共静态”。我可以使用这个来访问它:

Form1.Test

但我注意到我可以从我不想发生的 Form2 中更改“测试”值。这就是为什么我试图使用公共财产但没有运气的原因。有人可以澄清我这些事情。感谢您的所有帮助!

EDIT: (For follow up question) 

John Koerner 爵士的回答是对我问题的最佳回答。但我有一个后续问题,我试图将这些“测试”属性设为“静态”,我注意到即使我将此属性设为静态或公共属性,它仍然可以在 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 中只读且无法编辑?请向我澄清。非常感谢你们!

4

5 回答 5

7

您的属性是一个实例变量,因此不同实例的值可能不同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);

如果您希望您的属性是只读的,您可以简单地不指定设置器:

public string Test
{
    get { return _test; }
}
于 2013-02-02T16:06:59.830 回答
1

使用此方法“静态”

一开始控制标签属性Modifiers=Public

在下面的程序代码中

public static Form1 frm1 = new Form1();
public static Form2 frm2 = new Form2();

在下面的 Form1 代码中

Program.frm2.show();

在下面的 Form2 代码中

label1.Text=Program.frm1.text; 
于 2013-02-02T16:51:34.867 回答
0

不是您的frm1主要表单对象。它是新创建的对象,属性Test在加载时初始化(在Form1_Load事件处理程序中)。

于 2013-02-02T16:07:37.070 回答
0

的第一个实例Form1显示 的实例Form2,然后Form2创建的另一个实例Form1。这可能有效,但您_testForm.Load事件中设置,其中:

在第一次显示表单之前发生。

您没有显示Form1您尝试从中读取的实例Test,因此它的Load事件不会发生并且Test仍然存在null

您可以添加构造函数重载或属性来传递 @JohnKoerner 提到的 Form1 引用,但我更愿意只传递所需的变量,甚至可能封装在一个事件中,以减少耦合。Form2通常不需要知道所有关于Form1.

于 2013-02-02T16:08:56.777 回答
-1

上市

类型或成员可以由同一程序集或引用它的另一个程序集中的任何其他代码访问。

静止的

类上的 static 修饰符意味着该类不能被实例化,并且它的所有成员都是静态的。无论创建了多少个其封闭类型的实例,静态成员都有一个版本。

静态类与非静态类基本相同,但有一个区别:静态类不能被外部实例化。换句话说,您不能使用 new 关键字来创建类类型的变量。因为没有实例变量,所以您可以使用类名本身来访问静态类的成员。

但是,有一个静态构造函数。任何类都可以有其中之一,包括静态类。它们不能直接调用并且不能有参数(除了类本身的任何类型参数)。在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。看起来像这样:

静态类 Foo() { 静态 Foo() { Bar = "fubar"; }

public static string Bar { get; set; }

}

静态类通常用作服务,您可以像这样使用它们:

MyStaticClass.ServiceMethod(...);

于 2013-02-02T16:14:18.387 回答