5

フォームでアクティブな ErrorProvider があるかどうかを知りたいです。これを見つけることができれば、私のコードを減らすのに役立つかもしれません..

私はここでこのことを見つけました

しかし、誰かがより良い方法を知っている場合に備えて...ここに行きます。

わかりましたので、基本的には多くの TextBoxes を持つ WinForm があります。ユーザーが値を入力すると Validating を使用して検証を実行し、正規表現と一致しない場合は、そのコントロールの ErrorProvider をオンに設定します。同様に、ユーザーが値を許容可能な値に変更した場合そのコントロールの ErrorProvider を OFF に切り替えます。

しかし、保存をクリックすると、ユーザーが私に耳を傾けず、想定どおりに変更し、保存をクリックした場合に備えて、とにかく別のチェックを行う必要があります..クラッシュしたくない..

すっごくmmは、ErrorProvidersがアクティブでない場合に言うことができるようなものがあります。それから、それを変更するというメッセージボックスを保存して続行します。

[別の質問]

うーん、それを検証するときは、コントロールがフォーカスを失ったときにのみ検証します...ユーザーが入力をやめたときに検証を行いたいのですが..私が言いたいことを理解してください

ユーザーが自分の名前を入力しているときに電子メールアドレス(テキストボックス)のように、まだ検証を行いたくない[DON'T]が、ユーザーが入力を終了すると、ErrorProviderが消えるのを待っています(しかし、それだけではありませんコントロールがフォーカスを失ったとき) 入力してから 2 奇数秒後に検証を行うことはできますか?

4

9 に答える 9

15

残念ながら、ErrorProviderコントロールはそのような機能を提供しません。投稿したリンクからカスタムエラープロバイダークラスを使用するのが最善です。

それ以外の場合は、代わりに呼び出すメソッドを作成できますSetError

int errorCount;
void SetError(Control c, string message)
{
    if (message == "")
        errorCount--;
    else
        errorCount++;
    errorProvider.SetError(c, message);
}

または、ErrorProviderクラスの拡張メソッドを作成して、エラーを設定し、それらの行に沿ってカウンターなどをインクリメントすることもできます。

そして最後になりましたが、すべてのコントロールを繰り返すことができます。遅いですが、機能します:

bool IsValid()
{
    foreach (Control c in errorProvider1.ContainerControl.Controls)
        if (errorProvider1.GetError(c) != "")
            return false;
    return true;
}

編集

エラープロバイダー用のクイック拡張クラスを作成しました。

public static class ErrorProviderExtensions
{
    private static int count;

    public static void SetErrorWithCount(this ErrorProvider ep, Control c, string message)
    {
        if (message == "")
        {
            if (ep.GetError(c) != "")
                count--;
        }
        else
            count++;

        ep.SetError(c, message);
    }

    public static bool HasErrors(this ErrorProvider ep)
    {
        return count != 0;
    }

    public static int GetErrorCount(this ErrorProvider ep)
    {
        return count;
    }
}

私はそれを広範囲にテストしていないので、を呼び出す前にもう少し検証を行うことをお勧めSetErrorしますErrorProvider

于 2012-09-08T01:06:31.267 に答える
2

簡単な方法を使用させてください。現在、暗黙的な検証アプローチを使用しています...コントロールをすぐに検証します。

いくつかのアクションを実行する前に、フォーム内のすべてのコントロールが検証されているかどうかを確認したいので、すべての子コントロールが検証されていることを確認してください。明示的な検証アプローチを使用して

使用できる各コントロールの検証イベントで:-

    Private Sub ProductIDTextBox_Validating(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles ProductIDTextBox.Validating
    If ProductIDTextBox.Text = "" Then
        ErrorProvider1.SetError(ProductIDTextBox, "you have to enter text")
        e.Cancel = True

        Return

    End If
    ErrorProvider1.SetError(ProductIDTextBox, "")

End Sub

次に、次の方法ですべてのコントロールを確認できます:-

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    If ValidateChildren() Then
        MessageBox.Show("Validation succeeded!")
    Else
        MessageBox.Show("Validation failed.")
    End If
End Sub

適切な方法を見つけるのに何時間も費やしているので、これが役立つことを願っています

于 2014-10-26T18:16:46.523 に答える
0

ここでのいくつかの 回答は、拡張メソッドで静的カウント変数を共有しているため、非常にエラーが発生しやすいものです。いいえ!

私の拡張メソッドは、Nuget パッケージOverby.Extensions.Attachmentsを使用して関連するコントロールを保存し、ErrorProviderエラーの数を数えられるようにします。

using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using Overby.Extensions.Attachments; // PM> Install-Package Overby.Extensions.Attachments

namespace MyApp
{
    public static class ErrorProviderExtensions
    {
        public static void TrackControl(this ErrorProvider ep, Control c)
        {
            var controls = ep.GetOrSetAttached(() => new HashSet<Control>()).Value;
            controls.Add(c);
        }

        public static void SetErrorWithTracking(this ErrorProvider ep, Control c, string error)
        {
            ep.TrackControl(c);          
            ep.SetError(c, error);
        }

        public static int GetErrorCount(this ErrorProvider ep)
        {
            var controls = ep.GetOrSetAttached(() => new HashSet<Control>()).Value;

            var errControls = from c in controls
                              let err = ep.GetError(c)
                              let hasErr = !string.IsNullOrEmpty(err)
                              where hasErr
                              select c;

            var errCount = errControls.Count();
            return errCount;
        }

        public static void ClearError(this ErrorProvider ep, Control c)
        {            
            ep.SetError(c, null);
        }
    }
}
于 2016-10-27T15:09:26.440 に答える