2013-02-02 66 views
5

我想了解静态和公共属性之间的区别是什么。但是当我试图以其他形式访问我的公共属性'Test'时,它会显示'null'。C#winform:从其他形式访问公共属性和静态和公共属性之间的区别

继承人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的 '测试' 的值,我把一个断点这一行:

label1.Text = frm1.Test; 

但是这个值是'null'。

请帮助我如何访问其他形式的公共财产。

顺便说一句,我试图让这个公共财产成为'公共静态'。我可以用这个访问此:

Form1.Test 

但我注意到,我可以改变从窗体2“测试”值,我不希望发生的事情。这就是为什么我试图使用公共财产,但没有运气。有人可以澄清我这些事情。感谢您的帮助!

EDIT: (For follow up question) 

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

窗体2关闭后,我试图在Form1_Load的再次突破,以检查“测试”的价值,它被改变!如何使Form1中的公共属性只能在Form2中读取,并且无法编辑?请向我澄清。非常感谢你们!

回答

6

您的属性是一个实例变量,因此该值可以在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上一个新的窗体2,你可以这样做:

Form2 frm2 = new Form2(this); 

如果你想为只读你的财产,你可以简单地不指定一个二传手:

public string Test 
{ 
    get { return _test; } 
} 
+0

感谢这位老兄,请看我编辑的跟进问题,希望我明确提出了我的问题。 – jomsk1e

+0

@JRC看我的编辑。 –

+0

就是这样!谢谢你的帮助约翰!从你的好教训!对不起,作为一个新手:( – jomsk1e

0

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

0

Form1的第一个实例示出的Form2一个实例,然后Form2创建Form1另一个实例。这可以工作,但你在Form.Load事件,设置_test:显示首次表单之前

发生。

你没有表现的Form1实例你想读Test,所以其Load事件不会发生,Test仍然null

您可以添加构造函数重载或属性来传递Form1引用,如@JohnKoerner所述,但我更愿意仅传递必需的变量,甚至可能封装在事件中以减少耦合。 Form2通常不需要全部了解Form1

-1

公共

类型或构件可以通过在相同的组件中的任何其他代码或引用它的另一个组件进行访问。

静态

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

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

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

静态类Foo() { 静态美孚() { 酒吧= “FUBAR”; }

public static string Bar { get; set; } 

}

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

MyStaticClass.ServiceMethod(...);

1

使用此方法 '静态'

在第一控制标签属性修改器=公共

在程序代码如下

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

在Form1的代码下面

Program.frm2.show(); 

在Form2代码如下

label1.Text=Program.frm1.text;