2010-12-31 13 views
3

グリッドビューのグリッドをカスタマイズすることができます。グリッドビューでは、ユーザーがソートなどを設定やオーバーロードすることなくヘッダーを1回クリックするだけで各列を並べ替えることができます)(私はこれを正常に実行し、正常に動作します) ユーザ(プログラマ)は、おそらくgrid.suchの各列をテンプレートフィールド、hyperlinkfield、boundfield ...として追加します。並べ替えのために 、私は列のデータフィールドにアクセスする必要があります。 私はこのcode.iによってboundfieldカラムにアクセスすることができるデータフィールドと、ヘッダ・テキストにアクセスし、... 試料ができる:カスタムコントロールのTemplatefield Gridviewでアクセスするには

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.suchにコントロールにアクセスすることができます。 サンプル:

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

は、私がアクセス "名前" したい(バインド( "名前")やeval( "名前"))。 どうすればいいですか? ここにポイントがあります:私は今テンプレートフィールドのコントロールのID(この場合 "Label1")は何ですか? 特別なお礼

答えて

1

テンプレートフィールドの並べ替えが実現できない - テンプレートフィールドが複数のデータフィールドにバインドされ、正しい並べ替えフィールドを決定するのが難しい場合があります。

あなたが取る場合は、そのようなもののみテンプレートフィールドなど、いくつかの制約ビューはラベルおよび/またはアンカーがいくつかのデータフィールドにバインドされた場合、その後のアプローチは

  1. 列がテンプレートフィールド(var tf = this.Columns[j] as TemplateField)であるかどうかを確認してくださいだろうソートすることができますはい、テンプレートを取る場合
  2. 、データバインディング式のためにそのtextプロパティを検査します(アンカーまたは言う)ラベルを見つけた場合、テンプレートの子コントロールを経由して
  3. 反復再帰的(ItemTemplateプロパティを使用)し、データを取得しますフィールド。

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

上記の手法のもう1つのバリエーションは、フィールドのアイテムテンプレートを取得し、Renderメソッドを呼び出してテンプレートhtmlを取得し、それを解析してデータバインド式を検索し、データフィールドを決定することです。しかし、このアプローチには独自の落とし穴があります。例えば、<img src='<%# Eval("IconType") %>' /><span><%# Eval("Name") %></span>などのテンプレートは、の代わりにIconTypeフィールドを並べ替えるロジックを作成します。フィールド。

IMOより強力なアプローチは、テンプレート列の並べ替えフィールド(ある場合)を受け入れるグリッドビューコントロールにプロパティ/メソッドを持たせることです。

+0

はい。有用な投稿をいただきありがとうございます。 –

関連する問題