在执行C#

时间:2015-10-09 15:11:43

标签: c# winforms

我有一个带有60个单选按钮的Win-form。我希望使用以下代码从已检查的单选按钮中获取文本:

private void button1_Click_1(object sender, EventArgs e)
    {

         string[] boxes = new string[30];
         string[] names = new string[30];

        for (int i = 1; i < boxes.Length; i++)
        {
            var label = this.Controls.Find("lb" + i, true)[0];

            var panelcontr = this.Controls.Find("panel" + i, true)[0] as Panel;
            var panels = panelcontr;

            var p = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked).Text;

            boxes[i] += p;
            names[i] += label.Text;
            tobeWritten += names[i] + boxes[i] + ",";
                textBox1.Text = "Anamnese(" + tobeWritten + ")";

        }
    }

它工作得很好,但问题是,当只有一个无线电盒未经检查时,我会在调试期间收到警告。我知道警告出现的原因,但我希望程序不要停止。

我要问的是:当我没有检查一个例如radioButton时,是否可以创建一个出现的MessageBox。说“你必须分配每个按钮”。我单击“确定” - 按钮,我可以检查未选中的按钮。 我尝试了an other question at StackOverflow的建议,但没有成功,因为函数panels.Controls.OfType<RadioButton>()在查询之前执行。

3 个答案:

答案 0 :(得分:0)

替换

会有帮助吗?
var p = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked).Text;

var ch = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked);
if (ch == null)
{
  // show message box and break;

}
var p = ch.Text;

答案 1 :(得分:0)

您的问题在这里:

var p = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked).Text;

如果FirstOrDefault调用的结果为null,则Text调用将抛出空引用异常。您可以通过拆分调用来避免这种情况,以便调用FirstOrDefault,检查结果是否为null,然后在知道结果不为null时调用Text。

答案 2 :(得分:0)

现在使用此代码:

private void button1_Click_1(object sender, EventArgs e)
    {

         string[] boxes = new string[30];
         string[] names = new string[30];

        for (int i = 1; i < boxes.Length; i++)
        {

            var label = this.Controls.Find("lb" + i, true)[0];

            var panelcontr = this.Controls.Find("panel" + i, true)[0] as Panel;
            var panels = panelcontr;

            var radiobutton = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked);
            if(radiobutton==null)
            {
                MessageBox.Show("Check all Buttons!");
                break;
            }

            boxes[i] += radiobutton.Text;
            names[i] += label.Text;
            tobeWritten += names[i] + boxes[i] + ",";
            textBox1.Text = "Anamnese(" + tobeWritten + ")";

        }
    }