2014-12-23 8 views
0

내가 그들에게 특정 태그 값을 제공하여 폼에 필요한 모든 값은 항목이 있는지 확인하려고 : 사용자가 저장 버튼을 매쉬 때 다음참조되는 모든 컨트롤이 있어야하고 Text 속성이 있어야 NRE를 가져 오는 이유는 무엇입니까?

//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; 
    . . . 

이의 전성 검사가 수행됩니다

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))); 
} 

내 표시에 따르면 "모든 컨트롤에 태그가 1 (필수)이지만 아직 비어 있으면 false를 반환합니다."라고 표시됩니다. 하지만 (bool val을 beningly 반환) 그것을하는 대신, 그것은 NRE와 충돌합니다. 구체적 :

// 애플리케이션 전반 예외 핸들러 : System.NullReferenceException : NullReferenceException이 HHS.FrmDelivery.b__0 (컨트롤 CTRL)에 System.Linq.Enumerable.Any [TSource (IEnumerable을 1 source, Func 2에서 술어) at HHS.FrmDelivery.RequiredDataMissing() at HHS.FrmDelivery.buttonSave_Click (개체 보낸 사람, EventArgs args) . . .

왜 이렇게 될까요? 원하는대로 작동하도록 내 멋진 바지 RequiredDataMissing() 코드를 우아하게 처리해야합니까?

답변

5

양식에 설정되지 않은 Tag (null)이있는 다른 컨트롤이 포함되어 있다고 가정합니다. 예외입니다.

이 그렇다면, 당신은 당신의 LINQ 쿼리 수정해야 : 당신이 에있는 모든 제어를 Tag 속성을 설정하지 않는 가정

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

을, 당신은 가능한 null 값에 대한 Tag을 확인해야합니다 너무 : 만 TextBoxes처럼 단일 제어 유형에 Tag을 설정하는 경우

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

또는, 다음 채널을 제한 컨트롤 만에 에크 : 당신이 필요하지 않은 컨트롤에 대한 null이 될 수있는 태그에 .Equals를 호출

return this.Controls.OfType<TextBox>() 
        .Any(ctrl => (ctrl.Tag.Equals(HHSConsts.REQUIRED_FIELD)) 
           && (ctrl.Text.Equals(String.Empty))); 
2

.

object o = null; // Tags are objects 
var areEqual = o.Equals(null); // NRE 
:

는 다음과 같은 간단한 예제를 가지고