c# winforms -在模态表单之间传递参数

本文关键字:之间 参数 表单 模态 winforms | 更新日期: 2023-09-27 18:12:34

我有一个主窗体与Purchase按钮,打开一个模态窗体与组合框和2个按钮,ConfirmClose

当我选择项目并单击Confirm时,它会自动保存在数据库中。

我想做的是当我点击Close按钮并返回到主表单时,DataGridView必须刷新,只有当我购买了至少1项。

c# winforms -在模态表单之间传递参数

要在窗体关闭时做一些事情,为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被点击了