c# - 在执行 C# 之前检查 linq 操作是否为空

标签 c# winforms

我有一个带有 60 个单选按钮的 Win 窗体。我想使用以下代码从选中的单选按钮中获取文本:

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 时,例如说“你必须分配每个按钮”。我单击“确定”按钮,然后我可以检查未检查的按钮。 我尝试了 an other question at 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;
    // ...
}

关于c# - 在执行 C# 之前检查 linq 操作是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041740/

相关文章:

c# - 我如何使用 xUnit Assert.RaisesAny?

c# - Entity Framework 核心 : Challenge Modeling Product Variants Database Design with Many to Many

winforms - DirectShow/WinForms 中的硬件加速视频

winforms - 在 Visual C++ 中检查 MySql 连接是否打开

c# - 如何在使用 foreach 语句循环 winform 控件时更改循环序列

c# - 此应用程序只能在应用程序容器的上下文中运行

c# - Winforms 中的后台工作人员不更新 TextBox

c# - 为什么要在 web api 中指定路由参数类型?

c# - 在 Windows 窗体中切换图像

c# - WinForms:如何防止文本框处理alt键并失去焦点?