在单击 RadioButton 之前保持按钮不可见 c#

Keep a button invisible until a RadioButton is clicked c#

我正在尝试强制用户 select 一个 rabiobutton,然后才被允许移动到下一步。我使 "Next" 按钮不可见,但我有 10 个单选按钮,如果选中其中任何一个,则必须对其进行验证。根据定义,只能选中 1 个单选按钮。我的代码看起来像这样:

b1.Text = "Next";
b1.Parent = fpn1;
fpn1.Controls.Add(b1);
b1.Dock = DockStyle.Bottom;
b1.BackColor = Color.LightGray;
b1.Visible = false;
RadioButton rb;
while (b1.Visible == false)
        {
            MessageBox.Show("LOOOL");
            //Thread.Sleep(5000);
            rb = fpn1.Controls.OfType<RadioButton>()
                             .FirstOrDefault(r => r.Checked);
            if (rb != null)
            {
                b1.Visible = true;
            }
        }

所以当我的 none 个单选按钮被点击时,b1 是不可见的。问题是......这进入了无限循环。用户甚至无法再选择任何按钮,因为页面无法加载。有什么绕过的想法吗?

我还能做些什么来获得想要的结果?

您阻塞了线程,这就是线程未加载的原因。我看不出您需要循环的原因,因为当用户单击单选按钮时您可以引发事件。然后,当您处理事件时,您将可见性设置为 true。

无限循环非常擅长阻止应用程序执行任何操作。从本质上讲,您是在倒退地考虑它。你在想:

Keep making the button invisible until something happens.

为什么?使按钮不可见后,它将保持 不变,直到您更改它为止。所以,相反,可以这样想:

Make the button visible when something happens.

在这种情况下 "something happens" 是用户更改了您的单选按钮的值。所以你想要那个事件的处理程序:

private void radioButton_CheckedChanged(Object sender, EventArgs e)
{
    // your logic here
}

您可以使用表单设计器将此函数分配给各种单选按钮的所有 CheckedChanged 事件,因此它们都使用相同的处理程序。

那"your logic"会是什么?好吧,真的,这取决于你。 听起来 您想等到几个不同的单选按钮组被选中?因此,您将基于此构建一些条件。在高层次上,这在语义上看起来像这样:

if (allRadioButtonsSelected())
    b1.Visible = true;

如果您的代码行符合您的要求:

rb = fpn1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked)

那么你甚至可以直接使用它:

if (fpn1.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked) != null)
    b1.Visible = true;

虽然完全听起来不像是你要找的东西,因为它会告诉你是否只有一个单选按钮被选中。但我可能误解了你的意思,所以这取决于你。


要点是,不要在检查是否发生某些事情时一直循环并阻塞线程。因为当你阻塞线程时,它永远不会发生。相反,使用事件处理程序在事件发生时对其做出响应。