【问题标题】:ASP.NET DataGrid - Display nested array dataASP.NET DataGrid - 显示嵌套数组数据
【发布时间】:2011-09-21 15:03:12
【问题描述】:

我有这样的课:

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

我想在 DataGrid 中显示 List&lt;ApplicationInformation&gt;。所以我尝试了这个:

.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&lt;ApplicationInformation&gt; 列表中的每个UserInformation 都有一个单独的行。

我希望这是有道理的......

我研究了一些模板,但不知道该怎么做。我想我总是可以遍历所有内容并使用我需要的所有数据创建一个单独的数组,但我必须创建另一个类,这似乎不是最好的方法。

编辑

例如,如果我有这样的List&lt;ApplicationInformation&gt;

{
    { 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

【问题讨论】:

    标签: asp.net datagrid


    【解决方案1】:

    您可以处理 ItemDataBound 事件或使用 linq 创建一个匿名对象并将其绑定到 DataGrid

    【讨论】:

      【解决方案2】:

      您需要按照 Junaid 的建议处理 RowDataBound,但您需要有一个模板列,该列本身可以是另一个 Datagrid 或某种列表,以将 List&lt;UserInformation&gt; 绑定到它。

      例如(未经测试的代码):

      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();
      
          }
       }
      

      【讨论】:

      • 每个ApplicationInformation/UserInformation 组合只有一列...我的描述相当抽象;我将用一个例子来编辑 Q。
      【解决方案3】:

      您可以通过 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();
              }
      

      【讨论】:

      • 但是我不会为每个 ApplicationInformation/UserInformation 组合设置另一列...
      • 我的问题不是很清楚;用一个例子编辑了 Q :)
      猜你喜欢
      • 2011-04-10
      • 2023-01-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 2019-01-06
      • 2016-07-24
      • 2020-11-06
      相关资源
      最近更新 更多