取消表格结束

时间:2018-03-13 16:57:51

标签: c# winforms desktop-application

我正在编写一个WinForm桌面应用程序。在主窗体中,用户单击一个按钮,该按钮调用另一个表单供用户提交数据。在提交过程结束时,用户单击“保存”菜单项以关闭子窗体。

这是子窗体调用的代码:

private void btnSubmit_Click(object sender, EventArgs e)
{
    // code for setting myFormArgs

    myForm form = new myForm(myFormArgs);
    form.ShowDialog();

    // the user clicked "Yes" on a "Confirm" MessageBox
    if (form.DialogResult == DialogResult.Yes)
    {
        // code for saving data 

        form.Dispose();
    }
}

这是子窗体中“保存”菜单项的代码:

private void menuSave_Click(object sender, EventArgs e)
{
    string message, title;
    MessageBoxIcon icon;
    MessageBoxButtons buttons;

    if(DataSubmitted)
    {
        if(ValidData)
        {
            message = "Confirm?";
            title = "Select an action";
            icon = MessageBoxIcon.Information;
            buttons = MessageBoxButtons.YesNo;
        }
        else
        {
            message = "Incomplete data";
            title = "Error";
            icon = MessageBoxIcon.Error;
            buttons = MessageBoxButtons.OK;
        }
    }
    else
    {
        message = "No data submitted";
        title = "Error";
        icon = MessageBoxIcon.Error;
        buttons = MessageBoxButtons.OK;
    }
    this.DialogResult = MessageBox.Show(message, title, buttons, icon);
    if (this.DialogResult == DialogResult.Yes) this.Close();
    else this.OnFormClosing(new FormClosingEventArgs(CloseReason.None, true));
}

问题是代码将始终返回到调用方法,因此关闭(可能只是隐藏?)子表单,即使未调用this.Close()方法。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你不应该创建一个新的事件实例,这些是你想要避免的事情  而是尝试:

DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", 
MessageBoxButtons.YesNo);
if(dialogResult == DialogResult.Yes)
{
    Close();
}

事件应该自动发生,因此当表单关闭时,“OnFormClosing”将会提升。

我也建议使用this.Close而不是Dispose Form.Close()发送正确的Windows消息以关闭win32窗口。在此过程中,如果表单未以模态方式显示,则在表单上调用Dispose。处理表单会释放表单所持有的非托管资源。

更多有组织的代码, 尝试从主窗体中创建窗体的实例 并处理对话框结果如下:

using (SubForm form = new SubForm())
{
     DialogResult dr = form.ShowDialog();
         if(dr == DialogResult.Yes)
         {
             string studdToSave= form.StuffToSave;
             SaveToFile(studdToSave);
         }

}

答案 1 :(得分:0)

我觉得奇怪的是,当用户只想保存数据时你要关闭表单。 :)

保存不应该关闭您的表单。

关闭表单时,应验证是否有未保存的更改。 如果有,请向用户询问是否要在关闭前保存更改并向他提供选项“是”,“否”和“取消”,其中“取消”表示“取消关闭表单”。

根据用户点击是或否,您应该或不应该保存更改。 如果用户单击取消,则应通过为FormClosing事件发生事件来取消关闭表单。此事件允许您取消关闭表单。

    private void btnClose_Click(object sender, EventArgs e)
    {
        if (unsavedChanges)
        {
            var result = MessageBox.Show("Save changes?", "unsaved changes", MessageBoxButtons.YesNoCancel);

            if (result == DialogResult.Yes)
            {
                SaveChanges();
            }
            if (result == DialogResult.Cancel)
            {
                cancelClose = true;
            }
            this.Close();
        }
    }

    private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = cancelClose;
        cancelClose = false;
    }

当'Form2'不是模态形式时,上面的代码很有用。

如果您希望Form2以模态显示,上面的代码也可以使用。但是,在这种情况下,您还可以使用Form的DialogResult属性:

    private void btnClose_Click(object sender, EventArgs e)
    {
        if (unsavedChanges)
        {
            var result = MessageBox.Show("Save changes?", "unsaved changes", MessageBoxButtons.YesNoCancel);

            if (result == DialogResult.Yes)
            {
                SaveChanges();
            }

            if (result == DialogResult.Cancel)
            {
                result = DialogResult.None;
            }

            this.DialogResult = result;
        }
    }