窗体和对话框.结果无
本文关键字:结果 对话框 窗体 | 更新日期: 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
也会产生。
button1.DialogResult = DialogResult.Yes;
button2.DialogResult = DialogResult.No;
现在按下任何这些按钮应该关闭Form2
。
如果您想限制关闭button1
和button2
。需要对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()
}