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);**
4

4 に答える 4

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;
于 2012-11-16T21:49:01.520 に答える
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();
于 2012-11-16T21:56:19.357 に答える
2

セルに有効な数値 (空の文字列など) が含まれていない場合はどうなりますか?
質問に記載されている例外が発生します。
簡単な回避策は、TryParseメソッドを使用することです

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

MSDN ドキュメントから

このメソッドが返されるとき、[2 番目のパラメーター]には、変換が成功した場合はs [最初のパラメーター]に含まれる数値に相当する 32 ビットの符号付き整数値が含まれ、変換が失敗した場合は 0 が含まれます。s パラメータが null の場合、正しい形式でない場合、または MinValue 未満または MaxValue より大きい数値を表している場合、変換は失敗します。このパラメーターは初期化されずに渡されます

角括弧内の太字とテキストは、私が追加したものです。したがって、デフォルト値を 0 にする必要がある場合は、TryParse メソッドの結果をテストする必要はありません。

于 2012-11-16T21:48:22.453 に答える
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 になります。ユーザー入力を処理する場合は、この方法を使用することをお勧めします。適切にプロンプ​​トが表示された場合でも、ユーザーが入力する内容がわからないためです...

于 2012-11-16T22:12:19.600 に答える