1

私はカスタマイズされたgridviewを持っています。私のグリッドは、ヘッダーを1回クリックするだけで、ユーザー(プログラマー)によるソートなどの設定やオーバーロードの方法なしで、各列をソートできます。(私はこれを正常に実行し、正常に動作します)ユーザー(プログラマー) テンプレート フィールド、ハイパーリンク フィールド、バインド フィールドなど、グリッドに各列を追加できます。ソートするには、列のデータフィールドにアクセスする必要があります。私はこのコードでバインドされたフィールド列にアクセスできます.私はデータフィールドとヘッダーテキストにアクセスできます.サンプル:

for (int j = 0; j < this.Columns.Count; j++)
                {
                    BoundField bf;
                    bf = this.Columns[j] as BoundField;
                        if (bf != null)
                        {
                            string ht = bf.HeaderText;
                            string df = bf.DataField;
                        }
                 }

ただし、ColumnBound などの templateField でコントロールにアクセスできます。サンプル:

  <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>

アクセス "Name" (Bind ("Name") または Eval ("Name")) が必要です。どうやって?ポイントがあります: テンプレートフィールドのコントロールの ID (この場合は「Label1」) がわかりません。特別な感謝

4

1 に答える 1

1

テンプレート フィールドでの並べ替えは実​​行できない可能性があります。テンプレート フィールドは複数のデータ フィールドにバインドされている可能性があり、正しい並べ替えフィールドを決定することは困難です。

ラベルやアンカーがデータ フィールドにバインドされている場所で、これらのテンプレート フィールドのみを並べ替えることができるなど、制約のあるビューを使用する場合、アプローチは次のようになります。

  1. 列がテンプレート フィールドかどうかを確認する ( var tf = this.Columns[j] as TemplateField)
  2. はいの場合は、テンプレートを使用します (ItemTemplateプロパティを使用)
  3. テンプレートの子コントロールを介して再帰的に反復し、ラベル (またはアンカー) を見つけた場合は、データ バインディング式のテキスト プロパティを調べ、データ フィールドを取得します。

しかし、このアプローチは のようなテンプレートでは失敗し<img src="Some Icon" /><span><%# Eval("Name") %></span>ます。

上記の手法の別のバリエーションは、フィールドの項目テンプレートRenderを取得し、メソッドを呼び出してテンプレート html を取得し、それを解析してデータ バインド式を検索し、データ フィールドを決定することです。ただし、このアプローチには落とし穴があります。たとえば、上記のようなテンプレートでは、おそらくNameフィールドではなくIconTypeフィールドで<img src='<%# Eval("IconType") %>' /><span><%# Eval("Name") %></span>ソートするロジックが作成されます。

IMO、より堅牢なアプローチは、テンプレート列の並べ替えフィールド (存在する場合) を受け入れるプロパティ/メソッドを gridview コントロールに含めることです。

于 2010-12-31T08:49:49.650 に答える