2013-10-30 48 views
0

gridview_new是一个窗体类如何摆脱LinQ查询中的nullReference异常?

private checkNulls[] CheckNulls() 
    { 
     checkNulls Cntrl; 
     checkNulls[] cntrlsToupdate = new checkNulls[15]; 
     using (gridview_new IterateThroughCntrls = new gridview_new()) 
     {    

      for (int i = 5; i < 18; i++) 
      { 
       var getCntrl = 
        IterateThroughCntrls.Controls.Cast<Control>().Where(x => x.TabIndex == i).SingleOrDefault(); 

       if (!(getCntrl.Text == "")) 
       { 
        Cntrl = (checkNulls)(i); 
        cntrlsToupdate[i - 5] = Cntrl; 
       } 
      } 
     } 

     return cntrlsToupdate; 
    } 

取得控制权越来越即使是在制表指数5

+0

首先要解决的是您的命名 - 您的类型和变量名称使此代码目前很难读取。你还需要告诉我们'int'和'checkNulls'之间的转换是什么 - 大概这是一个自定义转换,但是你没有告诉我们任何关于它的事情。 –

+0

是否还有TabIndex == 6,7,...,17的控件? – Henrik

回答

2

首先控制一个空值,...OrDefault返回给定类型的默认值,在参考类型的案例(如Control),您会得到null。所以,那么你可以简单地检查:

if(getCntrl != null) 
{ 
    // safe.... 
} 

如果你想控制的文字和""为默认如果Where一直没有找到匹配的控制,使用Select + DefaultIfEmpty

string getCntrlText = IterateThroughCntrls.Controls.Cast<Control>() 
    .Where(x => x.TabIndex == i) 
    .Select(ctrl => ctrl.Text) 
    .DefaultIfEmpty("") 
    .Single(); 

注意我已经使用Single,因为我提供了一个默认值。

请注意,如果多个项目与谓词匹配,则Single...会引发异常(而不是First...)。通常情况下,它与关键属性一起使用,不应该找到多个元素。所以First(或FirstOrDefault)在这里似乎更合适。