在c#中调用父表单的方法

时间:2010-05-11 13:09:23

标签: c# winforms

我打开了一个mainform并调用了一个像

这样的子窗体
     Form4 f = new Form4();
     f.Owner = this;
     f.Show(this);

在form4中,用户选择一个文本文件,其内容将显示在mainform的textBox1中

我正在尝试像

这样的东西
Owner.textBox1.Text = "file contents";

但它无法正常工作

6 个答案:

答案 0 :(得分:8)

将不同形式链接在一起的最佳方式是通过活动。在Form4中创建一个类似FileSelected的活动,然后执行以下操作:

Form4 f = new Form4();
f.FileSelected += (owner, args) => {
    textBox1.Text = args.FileName;
};
f.Show(this);

答案 1 :(得分:2)

除此之外,这是非常糟糕的设计,您需要将textBox1设为主窗体的公共成员,并将f.Owner强制转换为主窗体类型。

像:

 Form4 f = new Form4();
 f.Owner = this;
 f.Show(this);

 // Inside Form4
 MainForm main = this.Owner as MainForm;
 if (main != null) main.textBox1.Text...

答案 2 :(得分:2)

最佳做法是为自己定义一个属性,该属性本身会设置私有控件的Text属性。这是一个实例:

public partial class MainForm : Form {
    public string ContentDescription {
        set {
            textBox1.Text = value.trim();
        }
    }
}

然后,您将能够通过类型转换访问此属性到您的特定类型:

public partial class SecondaryForm : Form {
    public MainForm OwnerForm {
        get {
            return (MainForm)this.Owner;
        }
    }

    public void someMethod() {
        OwnerForm.ContentDescription = "file contents";
    }
}

请记住,在C#中,每个Control都被声明为私有。因此,要访问它,最佳做法是定义一个属性,该属性将授予您对它的必需访问权限。将成员公开通常不是一个好主意,取决于你想要实现的目标。

编辑对于解析方法,您可能应考虑将其设为公开或内部,以便您可以通过子表单的正确类型转换的所有者属性来访问它。

创建一个hlper类可能是正确的解决方案,因此它不依赖于GUI。

答案 3 :(得分:1)

Form4中,您可以将Owner转换为正确的类型:

var o = (Form1) this.Owner;
o.textBox1.Text = "file contents";

要使其工作,所有者必须属于Form1类型且该类型的textBox1必须是公共成员或财产。

答案 4 :(得分:1)

由于Andrew已经为事件驱动提供了正确的解决方案,因此还提供了同步(或阻止)方法:

Form4 f = new Form4;
if(f.ShowDialog() == DialogResult.OK)
{
    textBox1.Text = f.FileName;
}

答案 5 :(得分:0)

您需要将“修饰符”设置为至少公开,以便控件的属性能够访问它。

alt text http://gabecalabro.com/gabe/Capture.PNG