【问题标题】:Dynamic generate GridView - Pivot or return anonymous Type动态生成 GridView - Pivot 或返回匿名类型
【发布时间】:2014-01-22 15:59:58
【问题描述】:

我需要一些帮助, 我正在使用网格视图

<asp:GridView ID="gridMatrizes" runat="server" AutoGenerateColumns="true" AllowPaging="true"
    OnRowDataBound="gridMatrizes_RowDataBound" OnRowCommand="gridMatrizes_RowCommand" OnPageIndexChanging="gridMatrizes_PageIndexChanging"
    PageSize="20" class="table table-bordered table-striped table-hover ">
    <Columns>
    </Columns>
    <PagerSettings Mode="Numeric" PageButtonCount="20" Position="Bottom" />
    <PagerStyle CssClass="center" VerticalAlign="Bottom" HorizontalAlign="Center" />
</asp:GridView>

并在代码隐藏中生成列:

qsBll qsBll = new qsBll();
BaseRequest<Model.Propriedades> request_propriedades = new BaseRequest<Model.Propriedades> { };

var response = qsBll.Select_Propriedade(request_propriedades).Items;

foreach (var item in response)
{
    BoundField bfield = new BoundField();
    bfield.HeaderText = item.Propriedade;
    bfield.DataField = item.Propriedade;
    gridMatrizes.Columns.Add(bfield);
}

所以我需要从我的数据库中获取所有值并放入相关的标题中...... 例如,我的数据库是这样的:

Matriz_id Propriedade Valor_id 1 Codigo 1
1 Sabor 4
我需要将“Codigo”放在标题中,并将值 1 放在数据绑定字段中。

如果我的 Matriz_id 在数据库中有 9 个值,我的 gridview 将有 9 个列,如果它有 2 个它将有 2 个列,依此类推... 我尝试作为支点或创建列表,但我失败了......

【问题讨论】:

    标签: c# asp.net gridview pivot-table anonymous-types


    【解决方案1】:

    你可以做类似的事情

        gridMatrizes.DataSource = response;
        gridMatrizes.DataBind();
    

    当您将 AutoGenerateColumns 设置为 true 时,这应该会自动生成您的列标题

    编辑:

    因此,如果您想拆分列并有时使用标题,有时使用数据,我会使用自定义持有者类;

        public class RepsonseHolder()
        {
    
             public string Valor {get;set;}
             public string Codigo {get;set;}
        }
    
    
    
        var myList = new List<RepsonseHolder>();
    
        foreach (var item in response)
        {
             var newHolder = new RepsonseHolder();
             newHolder.Valor = item.Column(5);  // Or however you can get at your Ids
             newHolder.Cordigo = item.Column(7);
             myList.Add(newHolder);
        }
    

    如果你不能在你的项目中获取列,你将不得不进行字符串拆分,或者使用固定宽度之类的东西。

    然后

        gridMatrizes.DataSource = myList;
        gridMatrizes.DataBind();
    

    无论如何,标题将是您声明的属性的名称,因此其中不能有空格。如果你想要空格,你需要手动更改标题,这很麻烦

    对,最终更新; 这只有在数据部分开始时有偶数列时才有效。

        var sb = new StringBuilder();
         sb.Append("<table>");
         int columnCounter;
          sb.Append("<tr>");
         var firstRow = response[0]; // Use the first row to get the headers
        for(int i = 2; i < firstRow.Columns; i = i + 2)  //Start at your first HeaderDataPair
        {
             sb.Append("<td>" + firstRow.Column[i] + "</td>");
              columnCounter++;
       }
       sb.Append("</tr>");
    
        foreach (var item in response)
        {
             sb.Append("<tr>");
             for(int i = 3; i < columnCounter; i = i + 2) //Start one after the first Pair
             {
                   sb.Append("<td>" +item.Column[i] + "</td>");
              }
              sb.Append("</tr>");
        }
         sb.Append("</table>");
    

    然后数据绑定 sb.ToString(); 请注意,这只是一个粗略的想法。编码很粗略,请勿复制粘贴。

    【讨论】:

    • 我需要将“Propriedade”列绑定为gridview的列标题,并将Valor_id绑定为该列的值...
    • 我们越来越近了,但我的问题之一是我不知道我的网格会有多少列,例如:Matriz_id Propriedade Valor 1 Código 10 1 Tipo 1 1 Classe 3 1 Cor 4 1 Teor 4 2 Estilo 3 2 Bebida de Origem 3 2 Sabor 5 2 teste 1 2 Código 1 2 Cor 4 我需要在我的网格中显示所有具有“valor”值的“propedades”,例如:Código Tipo Classe Cor Teor 10 1 3 4 4 所以我不能创建一个包含所有“专有”值的类,因为它们是变量
    • 该死的,你需要和向你发送这些数据的人谈谈......这是一个糟糕的工作,我会再更新一次我的答案
    • 好吧,我走了,我敢肯定还有更优雅的方法可以做到这一点,但我得去过夜了。
    • 谢谢你,我正在尝试这样做,如果我成功了,我会通知。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多