输入字符串的格式不正确

时间:2012-11-16 21:41:45

标签: c# asp.net infragistics

以下是我的代码,其中我将列声明为私有字符串,并且我使用该值将值绑定到网格但是我收到错误输入字符串在“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);**

4 个答案:

答案 0 :(得分:4)

很可能row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text没有返回您的期望。如果它有0-9之外的任何值或大于int.MaxValue的值,你将得到一个例外。此外,nullSystem.String.Empty会导致异常。

您可以使用TryParse代替,这将返回指示解析是否有效的bool。如果它工作,你传入的int将被设置为你传入的字符串。

提供一些实际代码;

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

答案 1 :(得分:2)

如果单元格不包含有效数字(例如空字符串)会发生什么? 您得到了问题中提到的例外情况 一个简单的解决方法是使用TryParse方法

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

来自MSDN文档

  

当此方法返回时, [第二个参数] 包含32位有符号整数值   相当于s [第一个参数] 中包含的数字,如果转换成功,   如果转换失败,则为零。如果是s,则转换失败   参数为null,格式不正确或表示a   小于MinValue或大于MaxValue的数字。这个参数是   通过未初始化的

我添加了方形手柄中的粗体和文字。因此,如果您的默认值应为零,则不必对TryParse方法的结果进行任何测试。

答案 2 :(得分:2)

除了上述答案之外,您还可以轻松创建一个小扩展方法来优雅地处理这些情况:

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

答案 3 :(得分:1)

您正在检查的列可能是空字符串,也可能包含非整数数据。我建议使用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.在处理用户输入时使用此方法是个好主意,因为即使正确提示,也无法告诉人们会输入什么......