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