2016-08-15 19 views
1

Genderを基準にして、Old Customer &新規顧客の数を示すレポートを作成する必要があります。したがって、レポートのトップレベルは性別、顧客タイプです。しかし、問題はDataTableにあり、私はプレーンテーブルのデータ形式を取得しています。 DataTableを2次元フォーマットでどのようにフォーマットできますか?私はDataTableの、GridViewコントロールを使用して、このレポートの情報を表示する方法をDataTableの表示データ形式を2次元形式に変換する

のDataTable形式

enter image description here

必要な形式

enter image description here

+0

このURLを参照するhttp://stackoverflow.com/questions/21646195/pivoting-gridview-in-asp-net –

答えて

1

このコードを試す ここで、datatableはピボットグリッドとして整形され、gridviewにバインドされます。

ASPX:

<asp:GridView ID="gv2" OnDataBound="gv2_DataBound" runat="server" BackColor="White" BorderStyle="Solid" 
     BorderWidth="1px" AutoGenerateColumns="false"> 
     <HeaderStyle BackColor="#95B3D7"/>   
    <Columns> 
     <asp:BoundField DataField="USER" HeaderText="USER" /> 
     <asp:BoundField DataField="MALE_NEW" HeaderText="NEW CUSTOMER COUNT" ItemStyle-HorizontalAlign="Right" /> 
     <asp:BoundField DataField="MALE_OLD" HeaderText="OLD CUSTOMER COUNT" ItemStyle-HorizontalAlign="Right"/> 
     <asp:BoundField DataField="FEMALE_NEW" HeaderText="NEW CUSTOMER COUNT" ItemStyle-HorizontalAlign="Right"/> 
     <asp:BoundField DataField="FEMALE_OLD" HeaderText="OLD CUSTOMER COUNT" ItemStyle-HorizontalAlign="Right"/> 
    </Columns> 
</asp:GridView> 

CS:についてのコードで

protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable("tbl"); 
     dt.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = "USER" }); 
     dt.Columns.Add(new DataColumn() { DataType = typeof(string), ColumnName = "GENDER" }); 
     dt.Columns.Add(new DataColumn() { DataType = typeof(int), ColumnName = "NCNT" }); 
     dt.Columns.Add(new DataColumn() { DataType = typeof(int), ColumnName = "OCNT" }); 

     dt.Rows.Add("TEST", "MALE", 6, 1); 
     dt.Rows.Add("TEST1", "MALE", 3); 
     dt.Rows.Add("TEST2", "MALE", 4); 
     dt.Rows.Add("TEST", "FEMALE", 1); 
     dt.Rows.Add("TEST1", "FEMALE", 1); 

     DataTable dtpivot = new DataTable(); 
     var ik = dt.AsEnumerable().Select(i => i.Field<string>("USER")).Distinct(); 
     int cnt = 0; 
     foreach (var item in ik) 
     { 
      if (dtpivot.Columns["USER"] == null) { dtpivot.Columns.Add("USER"); } 
      dtpivot.Rows.Add(item); 
      var il = dt.AsEnumerable().Where(i => i.Field<string>("USER").Equals(item)).Select(j => j.Field<string>("GENDER")).Distinct(); 
      foreach (var item1 in il) 
      { 
       var im = dt.AsEnumerable().Where(i => i.Field<string>("GENDER").Equals(item1) && i.Field<string>("USER").Equals(item)).Select(j => new { newcol = j.Field<int?>("NCNT"), oldcol = j.Field<int?>("OCNT") }); 
       foreach (var item2 in im) 
       { 
        if (dtpivot.Columns[item1 + "_NEW"] == null) { dtpivot.Columns.Add(item1 + "_NEW"); } 
        if (dtpivot.Columns[item1 + "_OLD"] == null) { dtpivot.Columns.Add(item1 + "_OLD"); } 
        dtpivot.Rows[cnt][item1 + "_NEW"] = item2.newcol; 
        dtpivot.Rows[cnt][item1 + "_OLD"] = item2.oldcol; 
       } 
      } 
      cnt++; 
     } 

     gv2.DataSource = dtpivot; 
     gv2.DataBind(); 

    } 
    protected void gv2_DataBound(object sender, EventArgs e) 
    { 
     GridViewRow row = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal); 

     TableHeaderCell cell = new TableHeaderCell(); 
     cell.BackColor = Color.White; 
     row.Controls.Add(cell); 

     TableHeaderCell cell1 = new TableHeaderCell(); 
     cell1.Text = "MALE"; 
     cell1.ColumnSpan = 2; 
     cell1.BackColor = ColorTranslator.FromHtml("#F2DDDC"); 
     row.Controls.Add(cell1); 

     TableHeaderCell cell2 = new TableHeaderCell(); 
     cell2.Text = "FEMALE"; 
     cell2.ColumnSpan = 2; 
     cell2.BackColor = ColorTranslator.FromHtml("#F2DDDC"); 
     row.Controls.Add(cell2); 

     gv2.HeaderRow.Parent.Controls.AddAt(0, row); 
    } 

我々は動的に列を取得したい場合は、単純に列を削除し、GridViewのからと= "真AutoGenerateColumnsを設定"

+0

別の方法として、純粋なLINQクエリを試すこともできます。 –

+0

LINQを使ってどうすればいいですか、私に説明してください。ありがとうございました!!! – user4221591

+0

はい、ユーザーと性別の列をグループ化してselect句から4つの列を生成できるLINQを使用して行うこともできます。 –

関連する問題