2011-09-21 46 views
0

我有一個類,如下所示:ASP.NET數據網格 - 顯示嵌套陣列數據

public class ApplicationInformation 
{ 
    public string ApplicationName { get; set; } 
    public List<UserInformation> Users { get; set; } 
} 

我想顯示在數據網格中的List<ApplicationInformation>。所以我試過這個:

.aspx: 
<asp:DataGrid ID="tbl" runat="server"> 
</asp:DataGrid> 

.aspx.cs: 
protected void Page_Load(object sender, EventArgs e) 
{ 
    tbl.DataSource = Global.Data; 
    tbl.DataBind(); 
} 

但是那張表只有一個標題爲ApplicationName的專欄。我想爲ApplicationInformationUserInformation中的每個媒體資源分列一個列,並在List<ApplicationInformation>的列表中爲每個UserInformation分開一行。

我希望我看着成有意義......

模板了一點,但無法弄清楚如何做到這一點。我想我總是可以循環遍歷所有東西,並創建一個包含我需要的所有數據的單獨數組,但是我必須創建另一個類,而且這看起來並不是最好的方法。

編輯

舉例來說,如果我有一個List<ApplicationInformation>像這樣:

{ 
    { ApplicationInformation 
     ApplicationName = "App 1" 
     { UserInformation 
      UserName = "John Smith" 
      ApplicationHost = "JOHN-PC" 
     } 
     { UserInformation 
      UserName = "Mindy from the network" 
      ApplicationHost = "MINDY-PC" 
     } 
    } 
    { ApplicationInformation 
     ApplicationName = "App 2" 
     { UserInformation 
      UserName = "John Smith" 
      ApplicationHost = "JOHN-PC" 
     } 
     { UserInformation 
      UserName = "Bob Jones" 
      ApplicationHost = "BOB-PC" 
     } 
    } 
} 

然後我想表出現這樣的:

Application Name | User Name | Application Host 
------------------------------------------------------- 
    App 1    | John Smith | JOHN-PC 
    App 1    | Mindy fro...| MINDY-PC 
    App 2    | John Smmith | JOHN-PC 
    App 2    | Bob Jones | BOB-PC 

回答

0

你可以要麼處理ItemDataBound事件,要麼使用linq創建一個匿名對象並綁定它Ø數據網格

0

您可以通過LINQ的構建anonymoustyped列表:

if (!IsPostBack) 
     { 
      List<ApplicationInformation> app = new List<ApplicationInformation>() 
      { 
        new ApplicationInformation() 
        { 
         ApplicationName="App 1", 
         Users=new List<UserInformation>() 
         { 
          new UserInformation() 
          { 
            UserName = "John Smith", 
            ApplicationHost = "JOHN-PC" 
          }, 
          new UserInformation() 
          { 
           UserName = "Mindy from the network", 
           ApplicationHost = "MINDY-PC" 
          } 
         } 
        }, 
        new ApplicationInformation() 
        { 
         ApplicationName="App 2", 
         Users=new List<UserInformation>() 
         { 
          new UserInformation() 
          { 
            UserName = "John Smith", 
            ApplicationHost = "JOHN-PC" 
          }, 
          new UserInformation() 
          { 
           UserName = "Bob", 
           ApplicationHost = "BOB-PC" 
          } 
         } 
        } 
      }; 

      var result = from ele in app 
          from user in ele.Users 
         select new 
         { 
           ApplicationName=ele.ApplicationName, 
           UserName=user.UserName , 
           ApplicationHost=user.ApplicationHost 
         }; 

      GridView1.DataSource = result.ToList(); 
      GridView1.DataBind(); 
     } 
+0

但後來我就不用爲每'ApplicationInformation' /'UserInformation'組合的另一列... – Entity

+0

我的問題不是很清楚;用一個例子編輯Q :) – Entity

0

您需要處理的RowDataBound作爲朱奈德建議,但你需要有一個模板列,這本身可能是另一個數據網格或列表一些排序List<UserInformation>它。

例如(未測試的代碼):

void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e) 
    { 

    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 

     //find nested grid 
     GridView nestedGrid = e.FindControl("NestedGridID") as GridView; 
     nestedGrid.DataSource = DataBinder.Eval(e.DataItem,"Users"); 
     nestedGrid.DataBind(); 

    } 
} 
+0

雖然每個'ApplicationInformation' /'UserInformation'組合只有一列...我的描述相當抽象;我會用一個例子來編輯Q. – Entity