不关闭表格的DialogResult?

7

我有一个表单Form1,从这个表单中,我以模态窗口的形式显示Form2。在Form2中,我做了各种编辑和删除不同数值的操作,这些更改应该在关闭Form2后反映在Form1中。所以我在关闭Form2后执行RePopulateControls_in_Form1()。由于RePopulateControls_in_Form1()是一个长时间的过程,我只想在Form2中进行一些修改(编辑、添加、删除)时才执行该方法,而不是当Form2只是打开和关闭时。

所以这是我在Form1中尝试做的:

        Form2 f = new Form2();
        if (f.ShowDialog(this) == DialogResult.Something)
            RePopulateControls_in_Form1()

接着在 Form2 中,我进行以下操作:

    private void bntEdit()
    {
        //If Edit?
        this.DialogResult = DialogResult.Something;
    }
    private void bntAdd()
    {
        //If Add?
        this.DialogResult = DialogResult.Something;
    }
    private void bntDelete()
    {
        //If Delete?
        this.DialogResult = DialogResult.Something;
    }

但是我的问题是.Something。如果不是.NoneForm2会被关闭。我不希望Form2自己被关闭,除非用户关闭它。

如果我这样做:

    //in Form1
    private void Form1_Click()
    {
        Form2 f = new Form2();
        if (f.ShowDialog(this) == DialogResult.None)
            RePopulateControls_in_Form1()
    }

    //in Form2
    private void Form2_SomeModification()
    {
        //If Modified?
        this.DialogResult = DialogResult.None;
    }

RePopulateControls_in_Form1()未被调用!

简而言之,在我的程序中,如何告诉编译器仅在Form2中的值被更改时才调用RePopulateControls_in_Form1()

注:重新填充肯定是必需的,因为控件是动态创建的,有点复杂(实际上在Form2中创建的是GUI控件及其标签等)。

3个回答

12

在窗体上设置DialogResult会隐藏窗体并从ShowDialog中返回。如果您想要延迟此操作直到用户执行其他操作(例如关闭窗体),则应将该状态存储为成员字段,并在Form.Closing的处理程序中设置DialogResult。

另外,如果您确实想要在按钮按下时关闭模态窗体,则可以使用Button.DialogResult属性而不是创建Button.Click处理程序。


2

一种简单的方法可能是根本不使用DialogResult,而是使用一个专门的属性,不干扰窗体的行为。 - 然后您应该能够编写任何您想要的逻辑。


但我感觉 @Ryan Russell 的这个调用很酷。。我来标记他。 - nawfal

0

我会在窗体2中使用事件。当您的Form2正在关闭时触发该事件。在Form1中处理该事件将允许您执行任何所需的处理。如果需要,您甚至可以通过事件参数将一些信息从Form2传递回Form1。

另一种选择是设置一个全局静态变量 - 可能只是一个布尔值。然后Form2可以根据是否有更改来将其设置为true或false。当Form2返回时,Form1可以读取它,如果为true则进行处理并将其设置为false。


好的,我理解第一部分,但是第二个逻辑不是一个合适的编码技巧! - nawfal
1
为什么不这样做呢?在上述情况下,我会使用事件。但是,如果有一个值在应用程序中被用于20个表单和10倍于此的类,你如何确保只使用一个值?你更喜欢通过构造函数参数或属性将该值从表单传递到类吗? - ScruffyDuck
这只是简单地设置一个标志以让Form1了解Form2的一些信息。为什么要使用不安全的全局变量呢?我理解当你必须在220个类中使用它时,普通全局变量的重要性。但是,在这里,我们不仅应尽可能避免静态变量(在整个应用程序的生命周期中都处于休眠状态),更重要的是,我想知道您如何预见到问题需求会扩展到像我的简单问题一样大,需要在220个类中使用 :) - nawfal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接