动态生成GridView - Pivot或返回匿名类型

时间:2014-01-22 15:59:59

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

我需要一些帮助, 我正在使用gridview

<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列,依此类推...... 我尝试作为一个支点或创建一个列表,但我失败了......

1 个答案:

答案 0 :(得分:0)

你可以做一些像

这样的事情
    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(); 请注意,这只是一个粗略的想法。编码非常粗略,不要尝试复制和粘贴它。