我正在编写一个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()
方法。
提前致谢。
答案 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;
}
}