我打开了一个mainform并调用了一个像
这样的子窗体 Form4 f = new Form4();
f.Owner = this;
f.Show(this);
在form4中,用户选择一个文本文件,其内容将显示在mainform的textBox1中
我正在尝试像
这样的东西Owner.textBox1.Text = "file contents";
但它无法正常工作
答案 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)
您需要将“修饰符”设置为至少公开,以便控件的属性能够访问它。