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

Posted

技术标签:

【中文标题】C# winform:从其他表单访问公共属性以及静态和公共属性之间的区别【英文标题】:C# winform: Accessing public properties from other forms & difference between static and public properties 【发布时间】:2013-01-17 19:02:09 【问题描述】:

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

这里是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();
    

这是 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;

但该值为“空”。

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

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

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 中只读且无法编辑?请向我澄清。非常感谢各位!

【问题讨论】:

【参考方案1】:

您的属性是一个实例变量,因此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; 

【讨论】:

感谢这个人,请查看我对后续问题的编辑,我希望我的问题很清楚。 就是这样!感谢您的帮助约翰!你的好课!对不起,我是新手 :(【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

公开

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

静态

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

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

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

静态类 Foo() 静态 Foo() 酒吧=“富巴”;

public static string Bar  get; set; 

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

MyStaticClass.ServiceMethod(...);

【讨论】:

【参考方案5】:

使用这个方法'静态'

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

在下面的程序代码中

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

在下面的Form1代码中

Program.frm2.show();

在下面的Form2代码中

label1.Text=Program.frm1.text; 

【讨论】:

以上是关于C# winform:从其他表单访问公共属性以及静态和公共属性之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

c# winform_form属性详解以及事件详解(二)

C# 使用表单加载其他用户控件并访问基本控件或属性

如何从 Visual Studio C# Winform 中打开 Access 表单?

根据表单大小设置 splitContainer 属性大小 C# WinForms

将对象列表数据绑定到 WinForms DataGridView,但不显示某些公共属性

WinForm窗体重要属性与公共控件的重要属性