以下是我的代码,其中我将列声明为私有字符串,并且我使用该值将值绑定到网格但是我收到错误输入字符串在“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);**
答案 0 :(得分:4)
很可能row.Cells.FromKey(COL_RENEWAL_GRACE_PERIOD_DAYS).Text
没有返回您的期望。如果它有0-9之外的任何值或大于int.MaxValue
的值,你将得到一个例外。此外,null
或System.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.在处理用户输入时使用此方法是个好主意,因为即使正确提示,也无法告诉人们会输入什么......