3

メソッドをプロパティとして公開したいカスタムコントロールがあります(例:カスタム検証用)。

public Func<bool> ValidateMatrixFunc { get; set; }

次に、このカスタム コントロールを含むページで、デリゲートまたはラムダ exp を使用して、ページのOnPreInitイベントに割り当てることができます。

 protected override void OnPreInit(EventArgs e)
 {
    base.OnPreInit(e);

    ucMatrixTable.ValidateMatrixFunc = ValidateMatrix;
 }

これは機能します。

ただし、次のように aspx でこれを行う方が便利だと思います。

<uc1:MatrixTable ID="ucMatrixTable" runat="server" ValidateMatrixFunc="ValidateMatrix" />

しかし、これは次のメッセージでクラッシュします。

'ValidateMatrixFunc' プロパティの文字列表現 'ValidateMatrix' から、タイプ 'System.Func`1[[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' のオブジェクトを作成できません。

だから、私はただ不思議に思っています...そして私は..忍者がこれに対する答えを知っているのだろうか.

4

4 に答える 4

2

代わりに、「ValidateMatrixFunc」プロパティをイベントとして公開することをお勧めします。なんで?コントロールが通常どのように実装されるかにより一貫性があります。また、イベントを使用すると、1 つのイベントに対して複数のサブスクライバー (イベント ハンドラー) を持つことができます。これは典型的な使用例ではないかもしれませんが、時々発生します。

これをイベントとして実装する方法を以下に説明しました。

イベントを「ValidatingMatrix」と呼びましょう。

次に、次のように ASPX マークアップを記述できます。

<uc1:MatrixTable ID="ucMatrixTable" runat="server" OnValidatingMatrix="ValidateMatrix" />

CancelEventHandlerまた、代わりにデリゲートを使用しましょうFunc<bool>。これは、コード ビハインドの ValidateMatrix メソッド シグネチャが次のようになる必要があることを意味します。

protected void ValidateMatrix(object sender, System.ComponentModel.CancelEventArgs e)
{
    // perform validation logic

    if (validationFailed)
    {
        e.Cancel = true;
    }
}

MatrixTable カスタム コントロール内で、次のようなものを実装します。

    const string ValidatingMatrixEventKey = "ValidatingMatrix";

    public event System.ComponentModel.CancelEventHandler ValidatingMatrix
    {
        add { this.Events.AddHandler(ValidatingMatrixEventKey, value); }
        remove { this.Events.RemoveHandler(ValidatingMatrixEventKey, value); }
    }

    protected bool OnValidatingMatrix()
    {
        var handler = this.Events[ValidatingMatrixEventKey] as System.ComponentModel.CancelEventHandler;
        if (handler != null)
        {
            // prepare event args
            var e = new System.ComponentModel.CancelEventArgs(false);

            // call the event handlers (an event can have multiple event handlers)
            handler(this, e);

            // if any event handler changed the Cancel property to true, then validation failed (return false)
            return !e.Cancel;
        }

        // there were no event handlers, so validation passes by default (return true)
        return true;
    }

    private void MyLogic()
    {
        if (this.OnValidatingMatrix())
        {
            // validation passed
        }
        else
        {
            // validation failed
        }
    }
于 2011-11-18T19:30:15.257 に答える
1

関数名をリテラルとして解釈しています。データバインディング式 http://msdn.microsoft.com/en-us/library/bda9bbfx(v=vs.71).aspxを使用してみてください

あなたはそれで遊ぶ必要がありますが、ここに可能な例があります:

<uc1:MatrixTable ID="ucMatrixTable" runat="server" ValidateMatrixFunc="<%# ValidateMatrix %>" />
于 2011-10-13T11:13:46.527 に答える
1

そのアプローチは機能しませんが、根本的な目標は非常に一般的です: Funcs の代わりに EventHandlers を使用します。詳細については、次の MSDN 記事を参照してください: http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx

代わりに、イベント ハンドラーで「リターン」ブールを実装する必要があります。

public void GetCurrentRecords(object sender, EventArgs e)
{
    var obj  = sender as Lcmp.Website.Data.Controls.AFTO95ViewerControl;
    obj.ValidateMatrixFunc = whatever;
}
于 2011-11-18T18:36:14.373 に答える
1

ASP.NET は、マークアップを介して割り当てられたプロパティ値TypeConvertersの表現を変換して、プロパティの正しい型に変換するために使用します。エラーは、タイプに登録されていないことを示しています。Aはクラス自体に登録する必要があるため、それはできません。いずれにせよ、とにかくやりたいことを達成できるとは思いません。stringstringTypeConverterFuncTypeConverter

于 2011-10-13T11:36:59.087 に答える