2012-02-14 17 views
6

Web Formsプロジェクトでは、Sqlクエリの結果をDataTableにロードしています。実行時のカスタムビジネスオブジェクトへの動的バインド

これらのDataTableは、私たちがRepeaterウェブコントロールにバインドするフロントエンドに渡されます。

これは素晴らしいです。しかし今、DataTableの代わりに独自のカスタムクラスにバインドしたいと考えています。残念ながら、私が思ったのは明らかな答えがうまくいかなかったことです(私たちのクラスでIDictionary<string, object>を実装しています)。

すべてのバインディングに対して具体的なプロパティを作成せずに、EvalをDatumにバインドするにはどうすればよいですか?明らかに、DataRowはバインドするすべてのプロパティを具体的に実装する必要はありません。だから、どういうわけか、EvalはDataRowの名前でプロパティ値を参照できるように思えます。ここで

は、DataSourceが

rptTags.DataSource = new[] { new Datum { {"Count", 1} }, new Datum { {"Count", 2 } }; 

ファイルaspx.csに設定されている

ここ
public class Datum: IDictionary<string, object> 
{ 
    private Dictionary<string, object> _entries; 

    public Datum() 
    { 
     _entries = new Dictionary<string, object>(); 
    } 

    public object this[string s] 
    { 
     get 
     { 
      return this._entries[s]; 
     } 
    } 

    ... 
} 

があるカスタムクラスであり、ここでのaspxファイルに結合され

<asp:Repeater ID="rptTags" runat="server"> 
    <ItemTemplate> 
     <%# (int)Eval("Count") > 
    </ItemTemplate> 
</asp:Repeater> 

上記の例を使用すると、問題のプロパティが存在しないというエラーが表示されます。これは真ですが、d DataRowにも存在しません。どうすればSystem.Data.DataRowのようにバインドできますか?

+0

あなたはあなたのデータモデルクラスとevalの表現を共有することができ、それは希望助けをより簡単にする。 –

+0

「これは何かを試して試してみると悪夢になる」例えば? –

+0

@mark私はそれを得ると思う... – Aristos

答えて

1

私は今朝、新鮮な目で来て、ILSpyを使って.Net Frameworkを通過するのに数時間を費やしました。私はついにこのパズルを理解し、実用的なソリューションを実装することができました。私は解決策に関連することを私が学んだことを列挙し、私の実装を詳述します。

  • あなたは私が期待ように各RepeaterItemは、のDataRowに結合しないリピータへのDataTableをバインド

    が、DataRowViewへ。これは、DataRowViewが私たちのクラスに実装する必要があるICustomTypeDescriptorインターフェイスを実装している点を除いて、実際には重要ではありません。
  • Evalメソッドがリフレクションを使用してレイトバインディングを実行し、式がパブリックプロパティに評価されなければならないと言っていますが、これは単に真ではありません。 Evalステートメントは、ICustomTypeDescriptorのGetProperties()メソッドを使用して式を評価します。

これを念頭に置いて、DataTableのように動的にバインドできる独自のカスタムタイプを作成するための手順があります。

  1. PropertyDescriptorから継承する独自のカスタムクラスを作成します。
  2. PropertyDescriptorのすべての抽象メンバを実装します。動的バインディングの場合、最も重要なものはGetValue()です。ここでは、バインディングするクラスから値を取得する方法を定義します。
  3. バインディングするクラスで、CustomTypeDescriptorから継承します。これは、ICustomTypeDescriptorを実装する汎用クラスです。
  4. CustomTypeDescriptorのGetProperties()メソッドをオーバーライドし、バインドできる値ごとにPropertyDescriptors(手順1-2で作成)のリストを返します。
  5. PropertyDescriptionsのNameプロパティが設定されていることを確認してください。これはプロパティです.Netは、バインディング時に使用するPropertyDescriptionを決定するために、評価式を比較します。それに結合する
  6. WebBrowserコントロールのデータソースとして(ステップ3-5で作成した)あなたのCustomTypeDescriptorオブジェクトを設定し、評価を(使用)を動的
0

バインド可能なデータソースは、IEnumerableまたはIListSourceのいずれかを実装する必要があります。

ダイナミックアスペクトについて:データバインディングの魔法の一部は、反射を使用して行われることに注意してください。

+0

答えをありがとう。はい、MSDNのドキュメントでは、レイトバインディングを行うためにリフレクションを使用しています。しかし、DataRowは何とかダイナミックなデータバインディングを手に入れることができます。そのため、私も同様にできるはずです。 –

関連する問題