在执行c#之前检查linq操作是否为空
本文关键字:操作 是否 linq 检查 执行 | 更新日期: 2023-09-27 18:17:08
我有一个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;
如果FirstOrDefault调用的结果为null,则Text调用将抛出空引用异常。您可以通过拆分调用来避免这种情况,这样您就可以调用FirstOrDefault,检查结果是否为空,然后只有在知道结果不为空时才调用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;
现在可以使用下面的代码了:
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 + ")";
}
}