0

基本的に、オプションの組み込みバリデーターを備えた単なるTextBoxであるUserControlがあります。現時点では、これは単なるRequiredFieldValidatorおよびRegexValidatorです。これらのバリデーターに渡されるUserControlのプロパティを公開するだけで、たとえばRegExを設定するのは簡単です。

ここで、CustomValidatorを追加し、ユーザーがサーバー側の検証関数を追加できるようにしたいのですが、これにより問題が発生します。このための適切な構文は何ですか?ServerValidateEventHandlerプロパティを追加しようとしましたが、これを使用しようとすると、ランタイムエラーが発生します。

Cannot create an object of type 'System.Web.UI.WebControls.ServerValidateEventHandler' from its string representation 'valState_ServerValidate' for the 'ServerValidate' property.

他の方法でデリゲートを公開する必要がありますか?これは簡単なはずです...私は1つの小さな鍵がありません。UserControlを使用するページにCustomValidatorを追加しようとしていることに注意してください...ユーザーがusercontrol自体のカスタム検証用のハンドラーを指定する必要があります。(はい、それは少しフランケンコントロールです)

4

1 に答える 1

1

簡単な解決策があります。公共の財産の代わりに、公共のイベントを使用してください!

public delegate void ServerValidateHandler(object sender, EventArgs e);
public event ServerValidateHandler ServerValidate;

ASP.NETは、プレフィックスが「On」のイベントを公開するため、「ServerValidate」は「OnServerValidate」になります

たとえば、ASPXまたはASCXでは、次のように入力します。OnServerValidate = "MyMethod"ここで、MyMethodは実行するカスタムメソッドであり、ServerValidateHandlerデリゲートによって定義された署名があります。

protected void MyMethod(Object sender, EventArgs e)
{
    // do something...
}

ハンドラーに特別な情報を渡したい場合は、独自のeventargsクラス(例:MyEventArgs:EventArgs)を作成し、EventArgsの代わりにそのタイプを渡すようにデリゲートを更新できます。

自分でハンドラーにアクセスする必要がある場合は、次のようにすることができます(このコードは、コールバックメソッドが最大で1つしかないことを前提としていますが、代わりにハンドラーのコレクションを使用してさらに許可するように変更できます)。

    public delegate void ServerValidateHandler(object sender, EventArgs e);
    private ServerValidateHandler _handler;
    public event ServerValidateHandler ServerValidate
    {
        add { _handler = value; }
        remove { _handler = null; }
    }

もちろん、これらの追加機能が必要ない場合は、次のように簡略化されます。

public event EventHandler ServerValidate;
于 2011-03-09T16:46:54.170 に答える