DialogResult没有关闭表单?

时间:2011-07-30 05:36:11

标签: c# winforms modal-dialog dialogresult

我有一个表单Form1,我将Form2显示为模式表单。从Form2开始,我会对所有值进行编辑和删除,这些值应在关闭Form1后反映在Form2中。所以我在关闭RePopulateControls_in_Form1()之后做的是Form2。由于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。如果它不是.None,则Form2只会被关闭。我不希望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()没有被击中!

简而言之,在我的程序中,如果在RePopulateControls_in_Form1()中修改了值,我怎么能告诉编译器只调用Form2

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

3 个答案:

答案 0 :(得分:10)

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

另外,如果你想在按下按钮时关闭模态窗体,可以使用Button.DialogResult属性而不是制作Button.Click处理程序。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我会使用表单2中的事件。当您的Form2关闭时触发该事件。在Form1中处理该事件将允许您执行任何您想要的处理。此外,如果需要,您可以将参数中的一些信息从Form2传递回Form1。

另一种方法是设置一个全局静态变量 - 也许只是一个bool。然后Form2可以将其设置为true或false,具体取决于是否进行了更改。当Form2返回时,Form1可以读取此值,如果为true,则执行处理并将其设置为false。