0

我搜索和搜索但找不到这个问题的答案。

如何在 Visual Studio Windows 窗体中将非父窗体中的数据传递给子 MDI。

设想:-

父级有一个菜单树,单击该菜单会打开一个子窗体,在该窗体内有一个按钮可以打开一个具有数据绑定列表框的单独窗体。我正在尝试将数据从这个单独的表单(准确地说是列表框中的选定项目)传递到子表单上的文本框。

我似乎只能找到如何在父母和孩子之间传递数据,反之亦然。

我真的很感激一些例子。

提前致谢。

4

1 回答 1

0

你找不到这个可能是一件好事,因为很多解决方案都是不合格的。

快速且不太可怕的方法

定义一个接口

例如

public interface IOwnerValue
{
String SomeValue {get;set;}
}

将其添加到您的子表单并实施它,例如

public class ChildForm : Form, IOwnerValue
{

public String SomeValue
{
get {return SomeTextBox.Text;}
set {SomeTextBox.Text = value;}
}
}

然后重载子窗体的构造函数以获取 IChildValue 的参数。并添加一个私人成员来持有它。例如

private IOwnerValue _childValue;

Public MySubForm(IOwnerValue argValue) :base()
{
   _childValue = argValue;
}

然后在您的按钮单击处理程序中

说使用 (MySubForm f = new Subform(this)) { f.ShowDialog(); }

然后,当您想在中设置值时,就像

if (_childValue != null)
{
_childValue.SomeValue =  SomeStringFromSomewhere;
}

您可以跳过界面,但是您必须将 ChildForm 和 Subform 类紧密耦合。想象一下,如果您想为不同类型的子表单重用子表单,或者有一个执行类似操作的不同子表单。该接口可以让您保持解耦,更不用说编写一两个单元测试了。

但是另一种方法是将所有这些移到一个单独的类中,其中两种形式都引用了它的接口。一个设置属性。它有一个“Onchanged”事件。对它感兴趣的表单注册了一个事件处理程序。不过,在两种形式之间,对于一个文本值来说,这有点过头了。

无论你走哪条路,如果它有类似的东西

TheFormThatCreatedMe.SomeTextBox.Text = SomeString;

尖叫着跑开。

于 2013-04-30T22:22:14.693 回答