簡體   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