2011-09-21 73 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