【问题标题】:Passing a value back to original form将值传递回原始形式
【发布时间】:2010-10-10 20:24:54
【问题描述】:

我有两种表格:Form1 和 Form2。我可以通过调用新的 Form2 并传入值来将 Form1 中的列表的内容获取到 Form2 中的另一个列表。我通过说从其中删除一个项目来更新 form2 中的列表。如何将 Form2 列表的内容传递回 Form1 中的原始列表? Form1 是应用程序运行时出现的第一个表单,因此我不想调用该表单的新实例。

【问题讨论】:

  • 显示form2的代码是什么?

标签: c# winforms


【解决方案1】:

您可以将Form1 的初始实例传递给Form2,并使用此引用将数据传回Form1

// A property `Form2`
public Form1 RefToForm1 { get; set; }

// On form 1, after initializing `Form2`:
Form2 frm2 = new Form2();
frm2.RefToForm1 = this;

注意:

有比上述更好的解决方案(它又快又脏)。更好的选择是在 Form2 上创建一个属性,其中包含您在 Form1 中所需的数据类型,并通过它访问数据:

// A property `Form2`
public List<int> Form2DataForForm1 { get; set; }

// On form 1
var dataFromForm2 = frm2.Form2DataForForm1;

【讨论】:

  • 我发现这个解决方案在 Form1 和 Form2 之间创建了双向依赖关系。我宁愿避免 Form2 依赖于 Form1;在此页面上查看我的答案。
  • @CesarGon - 依赖已经存在。使其双向不会使事情变得更糟(在我看来),并使关系更加明确(数据需要双向传输的事实)。
  • @Oded:除非您为它编写代码,否则我认为不存在依赖关系。在我提出的解决方案中,您可以删除一个类,而另一个不需要触摸;在您的解决方案中,情况并非如此。换句话说:在您的解决方案中,Form2 提到了 Form1 类型,这对编译器和运行时很重要(如果它们恰好位于单独的程序集中,则尤其重要!)。这在我的解决方案中不会发生。
  • 最好传递引用类型进行数据交换(C#类),因为子窗体所做的更改将对父窗体可见,然后使用事件而不是让子窗体直接调用父级上的任何方法。
  • @CesarGon, @Ben Voigt - 公平点。答案更新为更好的解决方案。
【解决方案2】:

我建议你在 Form2 中实现一个返回相关数据的属性,并让 Form1 读取该属性,从 Form2 中“拉取”数据。

这比让 Form2 将数据“推送”回 Form1 更好,因为它仅以一种方式保持依赖关系。

【讨论】:

  • 推动和拉动本质上都不是更好的。对于拉取,使用 Cesar 描述的属性。对于推送,使用事件。
  • @Ben:我同意,无论是推还是拉本身都不是更好。但是单向依赖比双向依赖要好。通过事件推送可以只保持单向依赖,这很好。
  • 如果能提供代码更好理解就更好了
猜你喜欢
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多