Winforms Windows窗体方法Form.ShowDialog()奇怪的行为

Winforms Windows窗体方法Form.ShowDialog()奇怪的行为,winforms,showdialog,Winforms,Showdialog,我试图显示一个表单(FormChild),其中包含一些单选按钮,以便从调用表单(FormParent)中选择、关闭并获取所选单选按钮的值。在FormParent中的按钮的单击事件处理程序上,我刚刚执行了以下操作: var formChild=newFormChild(); formChild.ShowDialog(this); 在我决定处理FormChild中一个单选按钮的CheckedChanged事件之前,一切都很顺利: private void SomeRadioButton_Check

我试图显示一个表单(
FormChild
),其中包含一些单选按钮,以便从调用表单(
FormParent
)中选择、关闭并获取所选单选按钮的值。在
FormParent
中的按钮的单击事件处理程序上,我刚刚执行了以下操作:

var formChild=newFormChild();
formChild.ShowDialog(this);
在我决定处理FormChild中一个单选按钮的CheckedChanged事件之前,一切都很顺利:

private void SomeRadioButton_CheckedChanged(object sender, EventArgs e)
{
    Close();
}
现在是
formChild.ShowDialog(这个)未显示formChild,formChild立即返回对话框结果。取消

对此有何解释


提前感谢

如果您的代码设置了RadioButton的值,是否有任何地方?如果以编程方式设置RadioButton的“Checked”属性,它将触发事件

在您的情况下,事件处理程序包含您的Form.Close(),因此表单永远不会被用户看到


注意:设置RadioButton。在设计器中选中为“true”将不会触发事件。

如果您的代码设置RadioButton的值,是否存在任何位置?如果以编程方式设置RadioButton的“Checked”属性,它将触发事件

在您的情况下,事件处理程序包含您的Form.Close(),因此表单永远不会被用户看到


注意:设置RadioButton。在设计器中选中为“true”将不会触发事件。

如果您的代码设置RadioButton的值,是否存在任何位置?如果以编程方式设置RadioButton的“Checked”属性,它将触发事件

在您的情况下,事件处理程序包含您的Form.Close(),因此表单永远不会被用户看到


注意:设置RadioButton。在设计器中选中为“true”将不会触发事件。

如果您的代码设置RadioButton的值,是否存在任何位置?如果以编程方式设置RadioButton的“Checked”属性,它将触发事件

在您的情况下,事件处理程序包含您的Form.Close(),因此表单永远不会被用户看到


注意:设置RadioButton。在设计器中选中为“true”将不会触发事件。

默认情况下,将选中最低选项卡索引RadioButton,如果将此事件处理程序分配给该按钮,则会导致您描述的情况

您可以更改选项卡顺序,也可以创建一个布尔标志,该标志在Forms Showed EventHandler中设置,以防止其触发,直到您再次检查它

public partial class Form1 : Form
{
    bool initDone;
    public Form1()
    {
        InitializeComponent();
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (initDone)
        {
            if (((RadioButton)sender).Checked == true)
            {
                Close();
            }
        }
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        initDone = true;
    }
}

默认情况下,将选中最低选项卡索引单选按钮,如果将此事件处理程序分配给该按钮,则将导致您描述的情况

您可以更改选项卡顺序,也可以创建一个布尔标志,该标志在Forms Showed EventHandler中设置,以防止其触发,直到您再次检查它

public partial class Form1 : Form
{
    bool initDone;
    public Form1()
    {
        InitializeComponent();
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (initDone)
        {
            if (((RadioButton)sender).Checked == true)
            {
                Close();
            }
        }
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        initDone = true;
    }
}

默认情况下,将选中最低选项卡索引单选按钮,如果将此事件处理程序分配给该按钮,则将导致您描述的情况

您可以更改选项卡顺序,也可以创建一个布尔标志,该标志在Forms Showed EventHandler中设置,以防止其触发,直到您再次检查它

public partial class Form1 : Form
{
    bool initDone;
    public Form1()
    {
        InitializeComponent();
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (initDone)
        {
            if (((RadioButton)sender).Checked == true)
            {
                Close();
            }
        }
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        initDone = true;
    }
}

默认情况下,将选中最低选项卡索引单选按钮,如果将此事件处理程序分配给该按钮,则将导致您描述的情况

您可以更改选项卡顺序,也可以创建一个布尔标志,该标志在Forms Showed EventHandler中设置,以防止其触发,直到您再次检查它

public partial class Form1 : Form
{
    bool initDone;
    public Form1()
    {
        InitializeComponent();
    }

    private void radioButton1_CheckedChanged(object sender, EventArgs e)
    {
        if (initDone)
        {
            if (((RadioButton)sender).Checked == true)
            {
                Close();
            }
        }
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        initDone = true;
    }
}

您应该设置DialogResult()而不是使用Close()。此外,您应该从按钮处理程序执行此操作,以便用户有机会更改其答案。如果他们点击了错误的单选按钮怎么办?…一旦他们做出选择,表单将立即关闭,他们将没有机会更改它。@Idle\u Mind,谢谢你的评论,不仅如此,事实上,我现在正在使用两个按钮(Ok和Cancel),它们是FormChild的AcceptButton和CancelButton。但我的问题是在最初的情况下提出的。另外,现在我只处理OK按钮的Click事件,并执行以下操作:var rButton=MyGroupBox.Controls.OfType().FirstOrDefault(r=>r.Checked);Close();您应该设置DialogResult()而不是使用Close()。此外,您应该从按钮处理程序执行此操作,以便用户有机会更改其答案。如果他们点击了错误的单选按钮怎么办?…一旦他们做出选择,表单将立即关闭,他们将没有机会更改它。@Idle\u Mind,谢谢你的评论,不仅如此,事实上,我现在正在使用两个按钮(Ok和Cancel),它们是FormChild的AcceptButton和CancelButton。但我的问题是在最初的情况下提出的。另外,现在我只处理OK按钮的Click事件,并执行以下操作:var rButton=MyGroupBox.Controls.OfType().FirstOrDefault(r=>r.Checked);Close();您应该设置DialogResult()而不是使用Close()。此外,您应该从按钮处理程序执行此操作,以便用户有机会更改其答案。如果他们点击了错误的单选按钮怎么办?…一旦他们做出选择,表单将立即关闭,他们将没有机会更改它。@Idle\u Mind,谢谢你的评论,不仅如此,事实上,我现在正在使用两个按钮(Ok和Cancel),它们是FormChild的AcceptButton和CancelButton。但我的问题是在最初的情况下提出的。另外,现在我只处理OK按钮的Click事件,并执行以下操作:var rButton=MyGroupBox.Controls.OfType().FirstOrDefault(r=>r.Checked);Close();您应该设置DialogResult()而不是使用Close()。此外,您应该从按钮处理程序执行此操作,以便用户有机会更改其答案。如果他们点击了错误的单选按钮怎么办