0

データ バインド コントロールの場合、 ( のような単純なコントロールでは)data text fieldとを提供するのが一般的なシナリオですが、 のようなコントロールではより多くのフィールドを提供します。通常、データソースのタイプはです。data value fieldDropdownlistGridviewIEnumerable

  • コントロールがこれらの値を内部で処理する方法、または、処理しているデータ ソースの種類を知らずにデータ ソースから値を取得する方法。

  • コントロールがデータ ソースからこれらのフィールドを評価する方法をコードで説明できますか。

4

2 に答える 2

0
  1. DataControlField通常、データ バインド コントロール (またはGridViewなどの関連コンポーネント ) は、 DataBindingイベントを処理します。

  2. イベント ハンドラー内で、現在バインドされているデータ項目 (DataRowViewエンティティ インスタンスなど) が取得されます。これは、実際のコントロールまたはコントロールのNamingContainerを渡すDataBinder.GetDataItemを介して行われます。たとえば、高レベルのデータ バインド コントロールなどの低レベル コントロールを実装している場合、セル コントロールのデータ バインディングを処理するため、セルの名前付けコンテナーを使用して、現在のデータ バインディングを使用するメソッドに渡します。同じものを取得するコンテキスト。DataControlFieldGridViewDataBinder.GetDataItem

  3. データ項目オブジェクトが取得されたら、指定されたデータバインディング式をそれに対して評価して実際の値を取得し、コントロール/コンポーネントに設定されたさまざまなプロパティに従ってフォーマットを適用する必要があります。最も簡単な方法は、DataBinder.Evalオーバーロードを使用することです。ただし、より効率的な方法を使用することもできます。たとえば、DataField文字列がプロパティ名のみになる場合は、プロパティ記述子を調べてキャッシュし、異なるデータ項目に対して同じものを使用できます。

Reflector などのツールを使用して、関連するコントロールのコードを調べて、より良いアイデアを得ることをお勧めします。

于 2012-02-29T09:18:59.720 に答える
0

この情報を簡単に見つけることができるとは知りませんでした。実際、LLyod はリフレクションを使用してデータソースからデータを見つけるのが間違っていました。私が調べたとき、どのデータコントロールもそれを使用しませんReflector;(

問題を解決したリンク

http://msdn.microsoft.com/en-us/library/ms366540.aspx

あなたはそれを行う方法は以下のとおりです

protected override void PerformDataBinding(IEnumerable retrievedData)
        {
            base.PerformDataBinding(retrievedData);

            // Verify data exists.
            if (retrievedData != null)
            {

                string dataStr = String.Empty;

                foreach (object dataItem in retrievedData)
                {
                    if (DataTextField.Length > 0)
                    {
                        dataStr = DataBinder.GetPropertyValue(dataItem,
                            DataTextField, null);
                    }
                    else
                    {
                        PropertyDescriptorCollection props =
                                TypeDescriptor.GetProperties(dataItem);
                        if (props.Count >= 1)
                        {
                            if (null != props[0].GetValue(dataItem))
                            {
                                dataStr = props[0].GetValue(dataItem).ToString();
                            }
                        }
                    }
                }

            }
        }

上記のコードがギリシャ語やラテン語のように見える場合は、何が行われているかを理解するために asp.net コントロール開発のコースを受講する必要があります。

于 2012-02-29T10:09:56.010 に答える