[英]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.