c# winforms -在模态表单之间传递参数
本文关键字:之间 参数 表单 模态 winforms | 更新日期: 2023-09-27 18:12:34
我有一个主窗体与Purchase
按钮,打开一个模态窗体与组合框和2个按钮,Confirm
和Close
。
当我选择项目并单击Confirm
时,它会自动保存在数据库中。
我想做的是当我点击Close
按钮并返回到主表单时,DataGridView必须刷新,只有当我购买了至少1项。
要在窗体关闭时做一些事情,为FormClosed
事件附加一个处理程序,您可以在窗体的处理程序中访问您需要的任何信息:
OtherForm other = new OtherForm();
other.FormClosed += (s, args) =>
{
if(otherForm.SomeInformation == someValue)
DoSomething(other.SomeData);
};
other.Show();
表单和其他类一样,可以包含属性。窗体的生命周期不一定与其可见性同步。
这就是为什么你可以在表单显示之前设置属性,在模态表单后面的代码中更改它们,然后在表单关闭后使用它们。
// Create a instance of the modal form
using(var frm = new MyModalForm())
{
// Initialize some properties
frm.Text = "Product catalog";
...
// Show the modal form. At this time, the code execution is suspended until
// the modal form is closed
frm.ShowDialog(this);
// Once the form is closed, it remains instanciated and can still be used
if (frm.RefreshRequired)
{
// Perform the datagrid refresh
}
}
// At this time, the form is disposed because of the using block, and
// all the resources it used are cleaned
public class MyModalForm : ...
{
...
public MyModalForm()
{
this.InitializeComponent();
}
// Set this flag to true or false according to the
// operations done in the modal form
// (in the event code of the buttons for example)
public bool RefreshRequired = false;
...
}
当然,也可以使用dialgresult属性,但是这种方式允许检索更多的属性,例如所选产品的列表。
我通常在模态表单本身上编写一个helper方法,如下所示:
public static ModalResponse ShowModal()
{
OtherForm otherForm = new OtherForm();
otherForm.ShowDialog();
//craft a ModalResponse based on the state of otherForm, and return it here
}
,并在父表单中像这样调用它:
public void button_Click(object sender, EventArgs e)
{
var response = OtherForm.ShowModal();
//do things with the response
}
(ModalResponse
不是一个类存在于框架的某个地方,它只是一个例子。)
我喜欢这种方法而不是仅仅捕获DialogResult
的原因是因为DialogResult
(通常)只会告诉您单击了哪个按钮。如果您需要关于表单输入状态的更多信息(如OP所提到的),那么需要一个"更丰富"的对象(无论如何都比Enum
更丰富)。
我将使用表单的DialogResult
来确定是否单击了close或cancel:
public class Modal : Form
{
public Modal {
InitializeComponent();
}
private void Confirm_Click(object sender, EventArgs e) {
this.DialogResult = DialogResult.OK;
}
private void Cancel_Click(object sender, EventArgs e) {
this.DialogResult = DialogResult.Cancel;
}
}
然后你可以用
using (var modal = new Modal()) {
modal.ShowDialog();
if (modal.DialogResult == DialogResult.OK) {
// respond to confirm click here.
}
else if (modal.DialogResult == DialogResult.Cancel) {
// respond to cancel click here.
}
}
好的部分是,因为你实例化了Modal
,你仍然可以在你的对话sult检查中访问它的属性。你的Modal类可以设置一个属性,指定至少购买了一个项目,然后检查该属性,并在else中响应,如果你知道Cancel被点击了