1

したがって、データを受け入れて SQL データベースに書き込むためのいくつかのフィールドを持つ Windows フォームがあります。私の button_click イベントは、ユーザー入力の検証を除くすべての作業を処理するものです。これらは別の方法で処理しています。私の質問は、ユーザーが間違った入力をした場合、メッセージボックスを表示した後にフォームをリセットするにはどうすればよいですか? ボタンクリックイベントを使用して別のメソッドを開始するだけで、より適切に制御できるようになりますか?

private void enter_button_Click(object sender, EventArgs e)
{
    restart:
    try {
        try {
                Validate(fname);
                Validate(lname);
                Validate(city);
                Validate(state);
        } catch (Exception ex) {
            MessageBox.Show(ex.Message);
            if (ex != null) {
                fname.Clear();
                lname.Clear();
                city.Clear();
                state.Clear();
                goto restart;
            }
        }
        try {
            exValidate(address);
        } catch (Exception ex1) {
            MessageBox.Show(ex1.Message);
            if (ex1 != null) {
                address.Clear();
                goto restart;
            }
        }
        //blah blah...write to database.
    }
    // ...
}
4

5 に答える 5

2

ボタンクリックのロジックが多すぎます。個人的には、各分野の焦点が失われたことを検証したいと思います。それをしたくない場合は、bool ValidateForm()のようなメソッドを作成し、そこにすべての検証ロジックをラップします。少なくとも1つの内部検証が失敗した場合は、falseを返します。また、すべてのロジックをラップしてすべてのフィールドをクリアするvoid ClearForm()のようなメソッドを作成します。コードをモジュール化してロジックを再利用できるようにすることは常に良いことです。ここでは、クリアロジックと検証ロジックを特定のイベントに結び付けています(ボタンクリック)。

だからEnterクリックであなたがしたい

if(!ValidateForm())
{
   MessageBox.Show("Invalid Form");
   ClearForm();
   return;
}
SaveForm();

GOTO命令をまったく使用しないことを強くお勧めします!! これは非常に危険な行為であり、コードをスパゲッティの悪夢に変える可能性があります。

お役に立てれば。

于 2012-06-08T14:57:35.540 に答える
0
if (MessageBox.Show(Exception.Message) == System.Windows.Forms.DialogResult.OK)
{
    //Clear all needed controls here
}
于 2012-06-08T14:57:55.570 に答える
0

私の提案は、バックグラウンド ワーカー スレッドを使用してロジックを処理し、background worker を button_click でトリガーすることです。そうすれば、ユーザーが間違いを犯した場合にバックグラウンド ワーカー スレッドを終了し、button_click を介してプロセス全体を再起動できます。

ソース:

スレッドが終了するまでコントロールを無効にしておく方法

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2012-06-08T15:51:58.437 に答える
0

あなたのコードには多くの問題があります。ex!=nullに表示した後に確認するのはなぜMessageBoxですか?また、goto ラベルの使用は C# では標準ではありません。

ネストされた試行も良くありません。データの検証だけを処理する別の関数があるように、コードを少し分離します。ボタン クリック ハンドラーは、このすべての作業を行う必要はありません。したがってvalidate()、検証ロジックを処理する関数とclearForm().

これにより、基本的にボタンクリックハンドラーのすべての混乱が解消され、次の行に沿って何かを行う必要があります。

if (validate())
  //save to db
else
  clearForm()

また、設計を再考する必要があります。関数は、本当に必要な場合にのみ例外をスローする必要があります。1 つのフォーム入力が有効な形式ではなかったために、例外をスローする必要がありますか?

于 2012-06-08T15:00:33.540 に答える
0

sをドロップするだけgotoです。そして、ユーザーが間違ったエントリを修正できるようにします。完了したら、もう一度ボタンをクリックします。行ってrestart:しまうと無限ループに陥ってしまうかもしれません。

エラーが発生したときにすべてのフィールドをクリアすると、ユーザーはすべてのフィールドを再入力する必要があります。どのフィールドが間違っているのか、その理由を伝えるだけで、間違ったエントリを修正し、問題を修正したときにボタンをクリックできるようになります。

ちなみに、使用gotoは本当に醜いです。非常にまれな状況でのみ使用してください。

于 2012-06-08T15:00:52.057 に答える