2012-11-16 4 views
0

다음 코드는 열을 개인 문자열로 선언하고 값을 그리드에 바인딩하는 데 사용하지만 입력 문자열이 올바른 형식이 아닌 오류가 나타납니다. 근처 "PolicyRenewalGracePeriodDays는"아래의 강조 표시된 텍스트를 볼 셀 (예 : 빈 문자열) 유효한 숫자를 포함하지 않는 경우 어떻게 무엇입력 문자열의 형식이 올바르지 않습니다.

/// </summary> 
private const string COL_UNDERWRITER_DISPLAY_NAME = "UnderwriterDisplayName"; 
/// <summary> 
/// 
/// </summary> 
private const string COL_UNDERWRITER_INITIALS = "UnderwriterInitials"; 
/// <summary> 
/// 
/// </summary> 
private const string COL_UA_DISPLAY_NAME = "UADisplayName"; 
/// <summary> 
/// 
/// </summary> 
private const string COL_UA_INITIALS = "UA"; 
**private const string COL_RENEWAL_GRACE_PERIOD_DAYS = "PolicyRenewalGracePeriodDays";** 
#endregion 


    protected void grdAction_DataBound(object sender, EventArgs e) 
     { 
      foreach (UltraGridRow row in this.grdAction.DisplayLayout.Rows) 
      { 
       TemplatedColumn col; 
       CellItem item; 
       HyperLink docLink; 
       HyperLink letterLink; 
       HyperLink actionLink; 
       Label actionLabel; 
       var policyClassId = Utility.GetCurrentPolicyClassId(); 
      PolicyClass policyClass = Utility.GetCurrentPolicyClassEntity(); 
       var accountId = (int) row.DataKey; 
       var insuredName = row.Cells.FromKey(COL_INSURED_NAME_HIDDEN).Text; 
       var referenceNumber = row.Cells.FromKey(COL_REFERENCE_NUMBER).Text; 
       var statusId = int.Parse(row.Cells.FromKey(COL_STATUS_ID).Text); 

       var optionNames = string.Empty; 
       if (!string.IsNullOrEmpty(row.Cells.FromKey(COL_OPTION_NAMES).Text)) 
        optionNames = row.Cells.FromKey(COL_OPTION_NAMES).Text; 

       var optionCount = int.Parse(row.Cells.FromKey(COL_OPTION_COUNT).Text); 
       var isVoidable = (row.Cells.FromKey(COL_IS_VOIDABLE).Text == "1"); 
       bool renewalFlag; 
       bool doNotRenewFlag; 
       bool hasRenewingReferenceNumber; 
       var currentUser = (User) Session[AppConstants.SK_CURRENT_USER]; 
       var expirationDate = DateTime.MinValue; 
       bool convertedFlag; 
       var documentCount = int.Parse(row.Cells.FromKey(COL_DOCUMENT_COUNT).Text); 
       var allowAddLayer = bool.Parse(row.Cells.FromKey(COL_ALLOW_ADD_LAYER).Text); 
       var renewableLayers = row.Cells.FromKey(COL_RENEWABLE_LAYERS).Text; 
       int renewalGracePeriodDays = 0; 

       **renewalGracePeriodDays = int.Parse(row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text);** 
+2

내 생각 엔'row.Cells.FromKey (COL_RENEWAL_GRACE_PERIOD_DAYS) .Text' 다른 문자가 포함되어 다음'0-9' : –

+1

당신은'row.Cells.FromKey (COL_RENEWAL_GRACE_PERIOD_DAYS)의 값을 식별해야합니다.텍스트 '로 표시됩니다. 그런 다음 해당 값을 포함하도록 질문을 업데이트하십시오. –

+1

'int.Parse ("thisIsNotAValidNumber")'는 당신이 보는 것과 같은 예외를 던질 것입니다. 텍스트 문자열이 무엇인지 확인하십시오. 아마도 비어 있거나 편지 나 무언가를 포함하고있을 것입니다. –

답변

2

제발 조언 ..please?
질문에 언급 된 예외가 발생합니다. 이 방법의 반환, 는 [제 파라미터] 32 비트 부호있는 정수 값을 포함하는 경우
간단한 해결 방법은 MSDN 워드 프로세서

부터 TryParse 방법을

int renewalGracePeriodDays; 
string temp = row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text; 
Int32.TryParse(temp, out renewalGracePeriodDays); 

를 사용 상당 s [첫 번째 매개 변수]에 포함 된 번호로 변환이 성공하면 또는 변환이 실패한 경우. s 매개 변수가 널이거나 올바른 형식이 아니거나 MinValue보다 작거나 MaxValue보다 큰 숫자 인 을 나타내는 경우 변환이 실패합니다. 이 매개 변수는 이 초기화되지 않은 상태가되었습니다.

굵은 글씨로 표시되며 대괄호로 된 텍스트가 추가되었습니다. 따라서 기본값을 0으로 설정해야 TryParse 메서드의 결과를 테스트 할 필요가 없습니다.

4

대부분 row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text은 예상 한 것을 반환하지 않습니다. 0-9 이외의 값이나 int.MaxValue보다 큰 값이 있으면 예외가 발생합니다. 또한 null 또는 System.String.Empty으로 인해 예외가 발생합니다.

대신 구문 해석이 성공했는지 여부를 나타내는 bool을 반환하는 TryParse을 사용할 수 있습니다. 작동하는 경우, 전달하는 int는 전달하는 문자열로 설정됩니다.

실제 코드를 제공하려면;

public static class ExtensionUtils 
{ 
    public static int ToZeroIfNotInt(this string valueToConvert) 
    { 
     int number =0; 
     int.TryParse(valueToConvert,out number); 
     return number; 
    } 
} 

을 그리고 같은 그래서 전화 :

renewalGracePeriodDays = row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text.ToZeroIfNotInt(); 
+0

답장을 보내 주셔서 감사 드리며 귀하가 제공 한 코드를 사용하려고합니다. 그 코드에는 몇 가지 잘못된 인수가 포함되어 있습니다 ... 의견이 있으십니까? – user1567194

+0

@ user1567194 내 변수 이름 중 하나가 잘못되었습니다. 방금 고쳤어. 아무것도 생각할 수 없다 ... 이들은 msdn에 지정된 args입니다. http://msdn.microsoft.com/en-us/library/f02979c7.aspx – evanmcdonnal

2

위의 답변 외에도, 당신은 쉽게 정상적으로 이러한 경우를 처리하기 위해 약간의 확장 메서드를 만들 수 있습니다 검사 할 열은 빈 문자열이거나 비 정수 데이터를 포함합니다. TryParse 메서드를 사용하는 것이 좋습니다.

int renewalGracePeriodDays; 
if (!int.TryParse(row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text), out renewalGracePeriodDays) 
{ 
    renewalGracePeriodDays = 0; 
    // Inside here, you can log the exception, alert the user, or end processing 
} 

TryParse가 실패 할 경우에는 사람들이 들어갑니다 무엇을 제대로하라는 메시지도 말하는 경우가 없기 때문에, 유예 기간, 그것은 사용자 입력을 처리 할 때이 방법을 사용하는 것이 좋습니다 0으로 기본 설정됩니다 ...

+0

일부 값이 실제로 '0'이면 일부는 잘못된 문자가있는 경우 ? –

+0

@ L.B. 여전히 값을 올바르게 반환합니다. 값을 파싱 할 수없는 경우 기본값으로 '0'을 사용합니다. 확장 메서드에 매개 변수를 추가하여 0 이외의 기본값을 선택할 수 있습니다. 예를 들어 유효하지 않은 값을 나타 내기 위해 -1을 반환 할 수 있습니다. – Icarus

+0

이카루스, 필드에 정수 (16 진수) 당신은 1a를 0으로, 0을 0으로 리턴 할 것입니다. 진정한 문제는 OP가이 메시지를 얻는 방법이 아닌 이유입니다. –

1

그것은 가능성이 있습니다

if(!int.TryParse(row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text, out renewalGracePeriodDays)) 
     renewalGracePeriod = MyDefaultValue; 
+0

그리고 에반이 나를 때렸어. 쥐. – MadHenchbot

관련 문제