当引用的每个控件都必须存在且具有Text属性时,为什么我会获得NRE?

B. *_*non 0 c# linq lambda predicate any

我试图通过给它们一个特定的标签值来检查表单上的所有必需值是否有条目:

//HHSConsts.cs
public static int REQUIRED_FIELD = 1;

// FrmDelivery 
public FrmDelivery(NewDelivery newDel)
{
    InitializeComponent();
    . . .
    SetRequiredControls();
}

private void SetRequiredControls()
{
    // Required controls will have a Tag value of "1"
    textBoxCost.Tag = HHSConsts.REQUIRED_FIELD; 
    . . .
Run Code Online (Sandbox Code Playgroud)

然后,当用户对"保存"按钮进行控制时,将执行完整性检查:

private void buttonSave_Click(object sender, EventArgs args)
{
    if (RequiredDataMissing())
    {
        . . .

private bool RequiredDataMissing()
{
    return this.Controls.Cast<Control>().Any(ctrl => (ctrl.Tag.Equals(HHSConsts.REQUIRED_FIELD)) && (ctrl.Text.Equals(String.Empty)));
}
Run Code Online (Sandbox Code Playgroud)

根据我的说法,这就是说,"如果任何控件的标签为1(需要)但是为空,则返回false." 但是,它没有这样做(不过是返回一个bool val),而是与NRE崩溃.进一步来说:

//来自应用程序范围的异常处理程序:System.NullReferenceException:HHS.FrmDelivery.b__0(Control ctrl)中的NullReferenceException,位于HHS.FrmDelivery.RequiredDataMissing()的System.Linq.Enumerable.Any [TSource](IEnumerable 1 source, Func2谓词) .FrmDelivery.buttonSave_Click(Object sender,EventArgs args)...

为什么会这样; 我必须取消我的花哨裤子RequiredDataMissing()代码以使其按需工作吗?

dym*_*oid 5

我想你的表单包含unset Tag(null)的其他控件,所以异常.

如果是这样,您需要修改您的linq查询:

return this.Controls.Cast<Control>().Any(ctrl => 
    ctrl.Tag != null 
    && ctrl.Tag.Equals(HHSConsts.REQUIRED_FIELD) 
    && ctrl.Text.Equals(String.Empty));
Run Code Online (Sandbox Code Playgroud)