2012-03-17 8 views
4

私は現在、Windowsフォームを使用してプロジェクトをビルドしており、マイナーな "問題"が発生しています。C# - 整数の正しい検証

私はユーザーに1時間を入力させ、それはintとして保存されます。ユーザーに詳細なフィードバックを提供して、エラーが発生した場合に間違ったことを正確に把握したいと考えています。

値を指定しないと、フォーマット例外がスローされます。 整数以外が指定された場合は、フォーマット例外がスローされます。

これは、どちらも同じ例外を使用するため、1)値なしまたは2)整数ではないため、新しい項目を追加できないことをユーザーに直接伝えることはできません。

これをどのように解決すればよいでしょうか、何が最善の解決策ですか?

多くのありがとうございます。

答えて

1

あなたの質問に関連するコード例です。特にValidateDataメモ:

// called from ok button click or similar event 
private void Accept() 
{ 
    if (!ValidateData()) 
     return; 

    SaveData(); 
    DialogResult = DialogResult.Ok; 
    Dispose(); 
} 

private bool ValidateData() 
{ 
    int val; 

    if (string.IsNullOrEmpty(mTextBox.Text)) 
     return FailValidation("Value can not be empty.", mTextBox); 

    if (!int.TryParse(mTextBox.Text, out val)) 
     return FailValidation("Value was not an integer.", mTextBox); 

    return true; 
} 

// do something with the value if you need 
private void SaveData() 
{  
} 

// post a message to the user, and highlight the problematic control 
// always evaluates to false 
private bool FailValidation(string pMessage, Control pControl) 
{ 
    if (pControl != null) 
    { 
     pControl.Focus(); 
     TextBox textBox = pControl as TextBox; 
     if (textBox != null) 
      textBox.SelectAll(); 
    } 

    AlertBox(pMessage); 
    return false; 
} 

// quick alert message method 
private void AlertBox(string pMessage) 
{ 
    return MessageBox.Show 
    (
     pMessage,   
     Application.ProductName, 
     MessageBoxButtons.OK, 
     MessageBoxIcon.Exclamation, 
     MessageBoxDefaultButton.Button1 
    ); 
} 
+0

ありがとうございました! ValidateData内でコードの修正版を使用しました。作品は魅力! –

2

Int32.TryParseメソッドを使用して戻り値を確認します。 TryParseを呼び出す前に値を入力しないでください。

はここでMSDNからの使用方法の例です:

int number; 
    bool result = Int32.TryParse(value, out number); 
    if (result) 
    { 
    Console.WriteLine("Converted '{0}' to {1}.", value, number);   
    } 
    else 
    { 
    if (value == null) value = ""; 
    Console.WriteLine("Attempted conversion of '{0}' failed.", value); 
    } 
+0

ありがとうございます!私は以下のようにこれと同様の修正版を使用しました。 –

1

使用int.TryParse整数が有効な範囲内にある場合はフォーマットをチェックし、成功事例のチェックよりもします。空の文字列をチェックするにはString.IsNulOrEmptyを使用します。

1

可能な代替ソリューションを提案できる場合は...最初の場所で不正な入力を防止することが最善の方法です。時間ピッカーやドロップダウンリストのようなコントロールを使って、ユーザーが選択できる値を制限できますか?ドロップダウンリストは、パワーユーザーにとってはキーボードにやさしく、マウスを好む人にとっては少し簡単です。みんなに勝ちます。

+0

私は時間ピッカーを使いましたが、デザイン面からは要素はまったく適合しませんでした。 ドロップダウンリストは機能しますが、テキストボックスの適切なエラーチェックを実装することができました。 ご回答いただきありがとうございます。 –

1

これはWinformsでよくサポートされています。 Validatingイベントを使用してエントリを確認し、エラーを報告するErrorProviderコンポーネントを使用します。サンプルイベントハンドラ:

private void textBox1_Validating(object sender, CancelEventArgs e) { 
     int hour; 
     e.Cancel = true; 
     if (textBox1.Text.Length == 0) errorProvider1.SetError(textBox1, "Can't be empty"); 
     else if (!int.TryParse(textBox1.Text, out hour)) errorProvider1.SetError(textBox1, "Not a number"); 
     else if (hour < 1) errorProvider1.SetError(textBox1, "Hour too small"); 
     else if (hour > 24) errorProvider1.SetError(textBox1, "Hour too large"); 
     else { 
      e.Cancel = false; 
      errorProvider1.SetError(textBox1, ""); 
     } 
    } 

次に、すべてのエントリが満足できるものかどうかを確認するだけです。ダイアログのOKボタンイベントハンドラでValidateChildren()メソッドを使用します。

private void OKButton_Click(object sender, EventArgs e) { 
     if (ValidateChildren()) this.DialogResult = DialogResult.OK; 
    } 
関連する問題