窗体和对话框.结果无

本文关键字:结果 对话框 窗体 | 更新日期: 2023-09-27 18:04:55

我正在学习窗体,不知何故无法弄清楚这段代码的问题,当我想在Form2中按下带有Dialog.Result.Yes的按钮或带有Dialog.Result.No的按钮以保持Form2打开时,它无论如何都会在单击其中一个后关闭。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_MouseClick(object sender, MouseEventArgs e)
    {
        Formular2 Form2 = new Formular2();
        Form2.ShowDialog();
        if (Form2.DialogResult == DialogResult.Yes)
        {
            this.DialogResult = DialogResult.None;
        }
        else if (Form2.DialogResult == DialogResult.No)
        {
            DialogResult = DialogResult.None;
        }
    }
}

谢谢你的建议

窗体和对话框.结果无

如果你想让Form2保持打开状态,你需要设置Form2的dialgresult属性,而不是Form1的dialgresult属性。

你需要在Form2上关闭Form2的按钮中移动这个逻辑

那么,假设有一个按钮在表单类命名为buttonOK和它的属性对话sult设置为对话sult. ok。
然后在类代码中为按钮单击事件(而不是MouseClick事件)编写事件处理程序

private void buttonOK_Click(object sender, MouseEventArgs e)
{
    // Perform some logic to validate the inputs and if something is wrong return false
    if(SomeLogicToAcceptTheForm() == false)
    {
        // Inform the user of the error
        MessageBox.Show("Your input is not valid");
        // Stop the closing process of this Formular instance 
        this.DialogResult = DialogResult.None;
    }
    // If your logic accepts the input, then the code continue at this point 
    // This will cause the form to exit from the ShowDialog call 
    // and you can read the current form DialogResult value.
}

编辑
为了更好地理解这个流程,你应该考虑到,在调用按钮单击事件的事件处理程序之前,表单引擎会根据按钮的对话sult属性中的值设置表单的对话sult属性。因此,如果您的验证结果是正确的,您不需要做任何事情,窗体关闭返回dialog sult。好的(或者你在按钮的对话sult属性中添加的任何东西)

设置一个dialgresult的行为将导致Form关闭,并将结果返回给创建实例的Form,这样它就可以检查结果并采取适当的操作。在您的情况下,因为您希望保持第二个表单打开,您要么不需要分配对话sult。没有按钮,并按照史蒂夫的建议,或者你可以拦截表单的FormClosing事件,测试对话sult如果对话sult。No设置为None并取消窗体的关闭。
虽然我建议不要使用对话sult,如果你想保持窗体打开。

public Form2()
{
    InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
    DialogResult = DialogResult.No;
}
private void button1_Click(object sender, EventArgs e)
{
    DialogResult = DialogResult.Yes;
}
private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.No)
    {
        DialogResult = DialogResult.None;
        e.Cancel = true;
    }
}

Form2选择控件中分配各自的对话框结果。如果你点击Form2控件,同样的DialogResult也会产生。

Form2: 示例
button1.DialogResult = DialogResult.Yes;
button2.DialogResult = DialogResult.No;

现在按下任何这些按钮应该关闭Form2

如果您想限制关闭button1button2。需要对Click事件进行以下更改:

private void button1_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.None;
}

Form1 :

在结果中,您可以通过查看Form2.DialogResult来查看结果。您可以这样做,因为您从Form2 dialog:

获得结果
Formular2 Form2 = new Formular2();
Form2.ShowDialog();
if (Form2.DialogResult == DialogResult.Yes)
{
    //
}
else if (Form2.DialogResult == DialogResult.No)
{
   //
}

在任何显示为模态的windows窗体上(使用ShowDialog()),设置dialgresult的行为将导致隐藏模态窗体并将控制权返回给调用代码。阅读MSDN本页的备注

如果您希望再次显示您的表单,您可以执行以下操作:

private void button1_MouseClick(object sender, MouseEventArgs e)
{
    Formular2 Form2 = new Formular2();
    Form2.ShowDialog();
    if (Form2.DialogResult == DialogResult.Yes)
    {
        Form2.DialogResult = DialogResult.None;
    }
    else if (Form2.DialogResult == DialogResult.No)
    {
        Form2.DialogResult = DialogResult.None;
    }
    Form2.Show(); // or Form2.ShowDialog()
}