4

ここで明らかな何かを見落としている場合はお詫び申し上げます。

問題のコンテキスト

ユーザーがフォームに入力できるアプリケーションがあり、その内容はデータベースにアップロードされます。「アップロード」ボタンを押すと、フォームを検証する必要があります。無効なフィールドがある場合、ユーザーに警告が表示されます。

現在のソリューション

ユーザーがボタンを押してトランザクションをアップロードすると、validFormSelections()が呼び出されます。

if (!this.validateChildren())
{
    // Display an error
    return false;
}
else
{
    return true; 
}

コンボボックスごとに、検証メソッドが呼び出されます。

cmbName_Validating(object sender, CancelEventArgs e)
{
    if (/* not valid for whatever reason */)
    {
        errorProvider.Clear();
        e.Cancel = true; 
        errorProvider.setError((Control)sender, /* suitable error message */)
    }
    else
    {
        errorProvider.SetError((Control)sender, ""); 
    }
} 

問題

私がやりたいのは、無効なすべてのerrorProviderフィールドの次を表示することですが、現時点では、個々の検証方法では、(私の理解が正しければ)最初の無効なフィールドが表示されると、他のフィールドの検証を続行しません見つかった。e.Cancel = true;

すべての無効なフィールドの隣に呼び出しthis.validateChildren()て表示できるようにするにはどうすればよいですか?errorProvider

これまでの解決策の研究の試み

  • 私が理解している限り、残りの検証を「遮断」するため、 CancelEventArgs'プロパティを true に設定する必要があります。Cancelそのため、後でこのプロパティを設定しないようにする方法を見つけるか、これを回避する方法を見つけることをお勧めします。しかし、私はそれを行う方法がわかりません。

  • 私の最初の考えの 1 つは、各検証イベント ハンドラーから を返すことができれば、これをかなり簡単に解決できるということでしたboolean(しかし、私はそれができないと思っていましたが、それができないことを学びました)。イベント ハンドラーで値を返す代わりに、変更可能な値 (たとえば、CancelEventArgsそれ自体など) を渡すことが考えられます。これはおそらく適切な解決策のように思えますが、どうすれば自分でこれを行うことができるかわかりません...

4

1 に答える 1

3

もちろん設定e.Cancel = trueが問題です。だから、それをしないでください。これは一般的にかなり不快な機能であり、データ入力が非常にモーダルになります。より使いやすい方法は、データ入力タスクをユーザーに自由に任せて、タブ順序を設定したときに想定した順序とは必ずしも異なる順序でデータを入力することです。

それを簡単にする小さなヘルパーメソッドを書くだけです。例えば:

    private Control firstInvalidControl;

    private void SetValidation(object sender, bool ok, string errMsg) {
        var ctl = (Control)sender;
        if (ok) errorProvider1.SetError(ctl, "");
        else {
            if (firstInvalidControl == null) firstInvalidControl = ctl;
            errorProvider1.SetError(ctl, errMsg);
        }
    }

コントロールの Validating イベント ハンドラーで SetValidation() を呼び出します。これで、適切な警告をすべて表示するのが非常に簡単になり、ユーザーがおそらく最初に作業する必要のあるコントロールに移動できるようになります。例えば:

    private void OKButton_Click(object sender, EventArgs e) {
        firstInvalidControl = null;
        this.ValidateChildren();
        if (firstInvalidControl != null) firstInvalidControl.Focus();
        else {
            // Data is good, use it
            // ...                
        }
    }
于 2014-12-15T12:10:32.607 に答える