繁体   English   中英

在执行C#之前检查linq操作是否为null

[英]check if linq operation is null before execution C#

我有一个带有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 + ")";

        }
    }

它完全可以正常工作,但问题是,当仅选中一个单选框时,在调试期间会收到警告。 我知道为什么出现警告,但我希望程序不停止。

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

如果没有选中的RadioButton则会在此处得到NullReferenceException

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

因为FirstOrDefault返回null因为RadioButton是引用类型。 然后,您将无法访问其Text属性。 那么如何避免呢?

存储结果并在使用前检查其是否为null

RadioButton firstCheckedRadioButton = panels.Controls.OfType<RadioButton>()
    .FirstOrDefault(r => r.Checked);
if(firstCheckedRadioButton != null)
{
    string text = firstCheckedRadioButton.Text;
    // ...
}

有助于取代

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;

您的问题在这里:

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

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

现在可以使用以下代码:

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 + ")";

        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM