C#的winform:访问与其他形式的&区别静态和公共属性之间的公共属性(C# winform: A

2019-07-19 04:38发布

我想了解最新的静态和公共属性之间的区别。 但是,当我试图访问其他形式我的公共财产“测试”它说,“空”。

继承人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;

但值是“空”。

请帮我,我怎么能访问公共属性,以其他形式。

和BTW我试图让这公共财产是一个公共静态“。 我可以用这个访问此:

Form1.Test

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

EDIT: (For follow up question) 

约翰·柯纳先生的回答是我的问题的最佳答案。 但我有一个跟进的问题,我试图让这些“试验”性质是“静态”,我注意到,即使我做这个属性静态或公共财产,它仍然可以在窗体2编辑。 为了让自己在这里明确的是一个示例:

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中的公共属性为readOnly在窗口2并不能editted? 请澄清我。 非常感谢你们!

Answer 1:

你的财产是一个实例变量,所以值可以跨越不同的情况不同的Form1

如果你正试图从一个父窗体访问实例变量,要做到这一点最简单的方法是通过在Form1到窗体2的构造。

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


Answer 2:

这种方法的使用“静态”

起初,控制标签属性修改器=公共

在下面的程序代码

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

下面Form 1代码

Program.frm2.show();

在下面的代码的Form2

label1.Text=Program.frm1.text; 


Answer 3:

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



Answer 4:

的第一个实例Form1示出的一个实例Form2 ,然后Form2创建的另一个实例Form1 。 这可以工作,但你设置_testForm.Load事件,其中:

被显示在第一次的形状之前发生。

你不显示的情况下Form1你想读Test从,所以它的Load事件不会发生, Test仍然null

你可以添加一个构造函数重载或财产传递Form1中引用作为@JohnKoerner提到,但我宁愿只传递所需的变量,甚至是封装在一个事件,以减少耦合。 Form2通常并不需要了解所有关于Form1



Answer 5:

上市

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

静态的

在一个类中的static修饰符意味着该类不能被实例化,所有成员都是静态的。 静态成员有一个版本,无论是如何创建它的封闭类型的多个实例。

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

然而,有一个这样的东西作为一个静态构造函数。 任何类都可以有其中之一,包括静态类。 它们不能被直接称为不能有参数(不是在类本身的任何类型的参数等)。 静态构造函数是自动调用初始化类之前,首先是创建或任何静态成员被引用。 是这样的:

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

public static string Bar { get; set; }

}

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

MyStaticClass.ServiceMethod(...);



文章来源: C# winform: Accessing public properties from other forms & difference between static and public properties