即使我在所有RadioButtons

时间:2018-04-07 17:16:25

标签: c# .net winforms

我有一个带有两个RadioButton的简单表单。我希望在应用程序开始时取消选中RadioButton个(默认情况下不选择任何选项),这样用户就必须自己做出选择。

虽然我在Checked构造函数和false RadioButton事件中的所有Form上将Form属性设置为Load处理程序,我还在构造函数中调用了一个方法,该方法将所有Checked的所有RadioButton属性设置为false,当我运行应用程序时,第一个RadioButton仍在检查中。

以下是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace OptionSelection
{
    public partial class Form1 : Form
    {
        InitializeComponent();

        radioButton1.Checked = false;
        radioButton2.Checked = false;

        this.Load += new System.EventHandler(this.Form1_Load);
        this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged);
        this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton_CheckedChanged);

        UncheckAllRadioButtons();
    }
    private void UncheckAllRadioButtons()
    {
        IEnumerable<Control> allControls = GetAllControlsOfDeterminedType(this, typeof(RadioButton));
        foreach (Control currentControl in allControls)
        {
            RadioButton _currentRadioButton = (RadioButton)currentControl;
            if (_currentRadioButton.Checked)
            {
                _currentRadioButton.Checked = false;
            }
        }
    }

    public IEnumerable<Control> GetAllControlsOfDeterminedType(Control currentControl, Type type)
    {
       IEnumerable<System.Windows.Forms.Control> allControls = currentControl.Controls.Cast<Control>();

        return allControls.SelectMany(selectedControls => GetAllControlsOfDeterminedType(selectedControls, type)).Concat(allControls).Where(candidateControl => candidateControl.GetType() == type);
    }

    private void radioButton_CheckedChanged(object sender, EventArgs e)
    {
        if (sender == (RadioButton)radioButton1)
        {
            MessageBox.Show("radioButton1");
        }
        else
        {
            MessageBox.Show("radioButton2");
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        radioButton1.Checked = false;
        radioButton2.Checked = false;
    }
}

1 个答案:

答案 0 :(得分:1)

您不需要所有代码。只需将单选按钮的AutoCheck属性设置为false

如果要在代码中将Checked属性设置为false,则必须在显示表单后执行此操作。因此,请将代码从Load事件移至Shown事件:

private void Form1_Shown(object sender, EventArgs e) {
  radioButton1.Checked = false;
  //radioButton2.Checked = false;
}

您只需要第一行,但它是您的代码。

顺便说一下,默认情况下,在表单加载时不会检查单选按钮。您面临的问题是因为您的单选按钮是表单上的第一个控件(或可能是唯一的控件)。因此,当显示表单时,焦点将移动到第一个控件,并自动检查单选按钮。你可以通过简单地更改单选按钮的TabIndex来阻止它,这样它们就不是第一个控件(你必须在表单上有其他控件),或者通过设置单选按钮的TabStop属性来false,所以他们没有专心。