【问题标题】:How to avoid c# (winforms) creating pointers to forms?如何避免 c# (winforms) 创建指向表单的指针?
【发布时间】:2014-12-03 17:44:46
【问题描述】:

在 c# winforms 中,我遇到了一个问题,即这段代码将创建两个变量,它们指向同一个表单,而不是表单的两个不同实例:

Form formA = new LoginForm();
Form formB = formA;
formB.Close();

当 formB 关闭时,两个表单都关闭。我试图避免这种情况,但是我找不到任何解决方案,例如 formB = new Form(formA);

在我的实际解决方案中,在第一个表单 (formA) 中添加了额外的控件,并在表单的字段中存储了一些额外的数据。这就是为什么我需要复制第一个表单

非常感谢任何帮助!

【问题讨论】:

标签: c# winforms pointers


【解决方案1】:

如果你想要两个表单,创建两个表单 - 两个独立的对象 - 通过调用构造函数两次:

Form formA = new LoginForm();
Form formB = new LoginForm();

现在它们是独立的对象。请注意,没有任何关于此的特定 Winforms - 所有类都是相同的。

编辑:如果您想创建原始表单的 克隆,您仍然需要创建一个新对象 - 并且表单中的每个控件也需要被克隆(a控制不能有两个父母)。克隆是一项棘手的业务,如果可能的话,我会尽量避免在这里。相反,我会尝试有效地重播添加控件或以原始形式设置数据的相同原始操作。

您没有对表单中包含哪些信息进行过多说明,但如果它是复杂数据,您可能希望将其与表单隔离,将其封装在自己的类中......然后您可以决定是否需要创建第二个表单时,该对象的深层或浅层克隆。

【讨论】:

  • 我已经编辑了这个问题来解释为什么这不合适
  • @Stromata:请参阅我对答案的编辑。正确的方法将取决于定制的内容。不过,我个人会远离克隆。
【解决方案2】:

没有一个语句可以满足您的要求。

您可以创建第二个表单,然后将控件从第一个表单复制到第二个表单,可能使用Controls.CopyTo(我不确定 CopyTo)。

要处理数据,您可以创建一个包含您需要使用的所有数据的类,并将该类的克隆复制到新表单中。然后您可以手动填充新表单上的一些字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2016-10-13
    • 2023-03-12
    • 2016-07-25
    • 1970-01-01
    • 2021-04-05
    • 2015-01-31
    相关资源
    最近更新 更多