2009-03-11 14 views
3

私はGridViewをあまり使いすぎていないし、それを掘り下げた後、必要以上に複雑だと思っていますが、基本的な能力が不足していると思います。特にこれを宣言的に行うときに、データセットにバインドされる時間の90%の目的を考えると、その実装は意味がありますが、コード内でIEnumerable<T>にバインドするつもりです。私は必要なもの独自のGridView実装を作成する必要がありますか?

は簡単に次の操作を行うことができることである

  • a)の列はタイプの特定のプロパティのみに制限することができIEnumerable<T>にバインドさT
  • b)は返すように照会することが
  • セルがバインドされたプロパティによって各行がセルを参照できる行のコレクション

基本的には次のインターフェイスを実装するものはいい

public interface IEasyGridBinder { 
    void Bind<T>(IEnumerable<T> bindableObjects, params string[] propertiesToBind); 
    IList<IDictionary<string, string>> Values {get;} 
} 

これを取得するには、GridViewを継承し、このインターフェイスを実装する独自のカスタムEasyGridBinderを記述するか、まったく慣れていないこれらの作業を行う簡単な方法がありますか?

P.S.

フォローアップ質問のボーナスポイントは、私が

myGrid.Bind(myEntities, e=>{e.Id; e.Name; e.Customer.Name;}); 

のようなものを書くことができればしかし、私は表現

にまで読んだ後に自分自身をそれを把握することができたとします
は元のデータを取得する方法がないことグリッドビューに入力され、htmlに変換されていませんか?フィールドが空文字列を入力として受け取った場合、セルには「 」が含まれているように見えるので、空の文字列と空白の入力を区別する方法はありませんか?これが本当に当てはまる場合、おそらくほとんどのGridViewの機能を再実装することになります。

+0

私は実際に誰もこの問題の良い解決策を持っていないことにショックを受けています。私は今夜​​私の前で仕事をしていると思います。これは数日間私のデモをブロックしています。私はおそらく後でGoogleのコードでそれを解放するでしょう –

答えて

0

拡張メソッドを使用して必要な動作を追加することをお勧めします。唯一の欠点は、プロパティとして「値」を追加できないことです。

+0

ええ、私は拡張機能を書く場合は、これらのことを行うのは本当に簡単な方法があります。もし3行以上言わなければ、おそらく他のこともしなければならないので、私はサブクラスにするかもしれません。 –

+0

これは間違いなく3行以上になります。ただし、拡張メソッドを使用する利点は、 "GridView"を "EasyGridBinder"に置き換えるために既存のASPXマークアップを変更する必要がないことです。 – David

+0

ええ、これは私が始めたものですが、私は、拡張メソッドは便利なショートカット以外のものでなければならないというルールを持っています。実際の動作はコードミスの傾向があります。 –

1

GridViews AutoGenerateColumnsプロパティをfalseに設定すると、指定した列のみが生成されます。これを行うには、BoundFieldsを作成し、Gridview Columnsコレクションに追加します。

GridView gv = new GridView(); 
gv.AutoGenerateColumns = false; 

BoundField bf = new BoundField(); 
bf.DataField = "Id"; 
bf.HeaderText = "ID"; 
gv.Columns.Add(bf); 

BoundField bf = new BoundField(); 
bf.DataField = "Name"; 
bf.HeaderText = "Name"; 
gv.Columns.Add(bf); 

BoundField bf = new BoundField(); 
bf.DataField = "Customer.Name"; 
bf.HeaderText = "Customer Name"; 
gv.Columns.Add(bf); 

gv.DataSource = IEnumerable<T>; 
gv.DataBind(); 

私はコメントでこの説明を書き込んだが、私はそれがより見えていた場所にそれを移動し、コード例を追加したい考え出した:

上記ダイナミックがどのGridViewDisplayAttributeクラスを作成するようにするにはAttributeから継承します。 GridViewDisplayAttributeにHeaderTextプロパティを指定します。 HeaderTextを指定するTのプロパティを飾ります。 HeaderTextを使用して装飾された各プロパティのBoundFieldを作成するTのプロパティを繰り返します。

クイックテストされていないコードの例:

using System; 
public class GridViewDisplayAttribute : Attribute 
{ 
public GridViewDisplayAttribute(string headerText) 
{ 
     HeaderText = headerText; 
} 
    public readonly bool HeaderText; 
} 

GridView gv = new GridView(); 
gv.AutoGenerateColumns = false; 

Type t = <T>.GetType(); 
PropertyInfo[] pis = t.GetProperties(); 

foreach (PropertyInfo pi in pis) 
{ 
    GridViewDisplayAttribute[] gvdaArray = pi.GetCustomAttributes(
     typeof(GridViewDisplayAttribute), true); 

    foreach (GridViewDisplayAttribute gvda in gvdaArray) 
    { 
     BoundField bf = new BoundField(); 
     bf.DataField = pi.Name; 
     bf.HeaderText = gvda.HeaderText; 
    } 

    gv.Columns.Add(bf); 
} 

gv.DataSource = IEnumerable<T>; 
gv.DataBind(); 
+0

ええと、それはかなり役に立つでしょう、私はDataKeyNamesで多くの運がなかった。ありがとう! –

+0

動的に作成するには、GridViewDisplayAttribute:Attributeクラスを作成します。 GridViewDisplayAttributeにHeaderTextプロパティを与えると、HeaderTextを指定するTのプロパティを飾ることができます。 HeaderTextを使用して装飾された各プロパティのBoundFieldを作成するTのプロパティを繰り返します。 – ahsteele

2

LinqDataSourceは、データソースのバッキングストアとして、あなたのオブジェクトを指定することができます。次に、GridViewをそのデータソースにバインドします。これは.aspxでもう少し宣言されていますが、後で機能を拡張するためのコードが少なくて、GridViewの再実装に近づくことができます。

+0

悪くないが、どこでも弦!リファクタリングがサポートされます。 –

+0

私はそれが私だけであるか、またはこれらの操作は私がGridViewから欲しいと思うことが非常に標準的であるべきことを議論していることを意味しますか?最も驚くべきことの原理 - 失敗 –

+0

私の経験では、このような種類の問題を攻撃するMSの方法は、決して最も驚異的な方法ではありませんが、最終的には、(1)既にそこにあるもの(2)は、私が望んだと思ったよりむしろ、私が実際に望んでいたものになります。 –

関連する問題