2011-08-02 7 views
2

は、私は次のように変数が定義されている:私はまた、リストのリストにそれを変換してきたグリッドビューをダイナミック列にバインドする簡単な方法は何ですか?

Dim iRows As List(Of String()) 

だけでは動作しやすくするために。

Dim iRows As List(Of IList(Of String)) 

私は動的に列を定義するためにネストされた配列/リストの内容を使用してGridViewコントロールにそのリストをバインドしたいと思います。私はあらかじめ列がいくつあるのかは分かりませんが、リスト全体ですべて同じであることはわかります。

私はそれについてどうなるべきか本当に確信していません。思考?

+4

代わりにDataTableを使用することを検討してください。 – SLaks

+0

バインドするデータテーブルを動的に構築することはそれほど悪くないと思います。私はちょっとだけ簡単な方法があると思った。 –

+0

まだ何もありませんか? –

答えて

3

データソースがどのように見えるか/各列がいくつあるかわからなくても、各列を別のgridview列に入れる方法はありません。

つまり、固定マークアップはできません=> AutoGenerateColumnsプロパティをtrueに設定する必要があります。

あなたが異なる

あなたがに興味があるかもしれないもう一つの解決策を使用する場合は、GridViewコントロールのHeaderCollecionにアクセスすることにより、各列のHeaderTextを設定することができれば、まったくのGridViewを使用しないことになりますあなたはデータの表示のみに興味があります(編集や削除のボタンを意味しません)。提案されているように、Reflectionを使用して、列と行を含むHTMLテーブルにデータをレンダリングすることができます。

+0

興味深い...本当に良い点だと思います。結局それがそこにあるのです。私はボタンのような私の列の他のプロパティを定義しているので、あまり「自動化された」方法を探していました。それはあなたが正しいと言いました。それは基本を行い、残りの部分を扱う別の方法があります。私は質問をうまく表現したとは思わない。 –

1

私はC#でこのようなことをしている可能性があります。

私はの宛先のリストをGridViewに取り込みます。

宛先オブジェクトは直列化可能でなければならず、NULL値を持つことはできません。これは私の例です:

[Serializable] 
public class destination 
{ 
    private int idDestination; 
    public int IDDestination { get; set; } 

    private string name; 
    public string Name { get; set; } 

    private string type; 
    public string Type { get; set; } 

    private string ringingTime; 
    public string RingingTime { get; set; } 

    private int priority; 
    public int Priority { get; set; } 

    private int huntBusy; 
    public int HuntBusy { get; set; } 

    public destination() { } 
} 

あなたがGridViewコントロールを移入するたびに次の操作を実行する必要があります。

ConvertArrayListToDataTableは以下の通りです
GridViewDestination.DataSource = ConvertArrayListToDataTable(listSelectedDestinations); 
GridViewDestination.DataBind(); 

public static DataTable ConvertArrayListToDataTable(ArrayList arrayList) 
    { 
     DataTable dt = new DataTable(); 

     if (arrayList.Count != 0) 
     { 
      dt = ConvertObjectToDataTableSchema(arrayList[0]); 
      FillData(arrayList, dt); 
     } 

     return dt; 
    } 

public static DataTable ConvertObjectToDataTableSchema(Object o) 
    { 
     DataTable dt = new DataTable(); 
     PropertyInfo[] properties = o.GetType().GetProperties(); 
     if (o.GetType() == typeof(destination)) 
     { 
      foreach (PropertyInfo property in properties) 
      { 
       DataColumn dc = new DataColumn(property.Name); 
       dc.DataType = property.PropertyType; dt.Columns.Add(dc); 
      } 
     } 

     return dt; 
    } 

private static void FillData(ArrayList arrayList, DataTable dt) 
    { 
     foreach (Object o in arrayList) 
     { 
      DataRow dr = dt.NewRow(); 
      PropertyInfo[] properties = o.GetType().GetProperties(); 
      if (o.GetType() == typeof(destination)) 
      { 
       foreach (PropertyInfo property in properties) 
       { 
        dr[property.Name] = property.GetValue(o, null); 
       } 
      } 

      dt.Rows.Add(dr); 
     } 
    } 

限り私が知っているように、これは反射を使用しています:宛先のarraylistを使ってgridviewにバインドします。

一方、あなたのGridViewは次のように定義する必要があります。

<asp:GridView ID="GridViewDestination" runat="server" Visible="False" Width="98%" CssClass="GridView" AutoGenerateColumns="False"> 
      <Columns> 
       <asp:TemplateField HeaderText="Name"> 
        <ItemTemplate> 
         <asp:Label ID="idNonAnsweredCreating" runat="server" Text='<%# bind("idDestination") %>' Visible="false"></asp:Label> 
         <asp:Label Visible="true" runat="server" ID="destinationLabelCreating" Text='<%# bind("name") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Type"> 
        <ItemTemplate> 
         <asp:Label Visible="true" runat="server" ID="destinationTypeLabelCreating" Text='<%# bind("type") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
</asp:GridView> 

あなたが見ることができるようにGridViewコントロールの各列に、必要に応じて、あなたはできるだけ多くプロパティをバインドします。

これが役に立ちます。

+1

マークアップでわかるように、固定マークアップとAutoGenerateColumns = "False"を使用します。私はOPを理解しているので、このデータソースにはどの列が含まれていませんか? – citronas

+0

申し訳ありませんが、OPとはどういう意味ですか?私はこの質問を理解することはできません: "彼はこのデータソースにどの列が含まれないのですか?"あなたはそれを再調整できますか?乾杯 – aleafonso

+0

OP =元のポスター=質問をしたユーザー。申し訳ありませんが、私は言葉を忘れました。私は書いたかったのです:OPを理解しているので、彼はこのデータソースにどの列があるのか​​わかりません。 – citronas

関連する問題