如何从另一个winform更改表单1属性及其对象属性?

时间:2013-01-06 11:45:42

标签: c# .net winforms

我无法访问我的主要表单的属性或从Form1打开的辅助表单的对象属性。

有一种简单的方法可以解决这个问题吗?

我在网上找到了几个无用的解决方案。

4 个答案:

答案 0 :(得分:0)

Form1的属性设置为公开,但请注意,这会破坏OOP规则

答案 1 :(得分:0)

在MainForm中设置一个或多个公共属性。打开第二个表单时,将该表单的所有者设置为MainForm。这样,您可以以第二种形式访问MainForm的属性。示例代码:

代码隐藏Form1:

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

    public String SomeProperty { get; set; }

    //Event of a normal button with name 'OpenFormButton'
    private void OpenFormButton_Click(object sender, EventArgs e)
    {
        var secondForm = new Form2
        {
            Owner = this
        };
        secondForm.Show();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        SomeProperty = "HELLO WORLD";
    }
}

Code-behind Form2:

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

    private void Form2_Load(object sender, EventArgs e)
    {
        var owner = this.Owner as Form1;
        var val = owner.SomeProperty;
        MessageBox.Show(val); //Shows a MessageBox with 'HELLO WORLD'
    }
}

这只是一个简单的代码,用于说明如何访问其他表单上的属性。您也可以设置(更改)属性的值,而不仅仅获取属性的值。这也适用于复杂类型而不是字符串和整数。希望这有帮助!

答案 2 :(得分:0)

您必须将Form1的实例传递给Form2构造函数

答案 3 :(得分:0)

我更喜欢使用像这样的简单回调函数:

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

    public String SomeProperty { get; set; }

    private void OpenFormButton_Click(object sender, EventArgs e)
    {
        var secondForm = new Form2()
        {
            GetSomeProperty = () => { return SomeProperty ;};
        };
        secondForm.Show();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        SomeProperty = "HELLO WORLD";
    }
}



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

    public Func<string> GetSomeProperty
    {
        get;
        set;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        MessageBox.Show(GetSomeProperty.Invoke());
    }
}

每次打电话 GetSomeProperty.Invoke(); Func将调用get访问器并从第一个Form

返回它