Asp.net 将DataTable显示数据格式转换为二维格式
我必须准备一份报告,根据性别显示老客户和新客户的数量。因此,报告的顶层是性别,然后是客户类型。但问题在于DataTable,我得到的是普通表数据格式。如何以二维格式格式化数据表 数据表格式 所需格式 如何使用DataTable、GridView显示此报告信息?试试这段代码 在这里,datatable的形状为透视网格,并绑定到gridview ASPX:Asp.net 将DataTable显示数据格式转换为二维格式,asp.net,gridview,datatable,Asp.net,Gridview,Datatable,我必须准备一份报告,根据性别显示老客户和新客户的数量。因此,报告的顶层是性别,然后是客户类型。但问题在于DataTable,我得到的是普通表数据格式。如何以二维格式格式化数据表 数据表格式 所需格式 如何使用DataTable、GridView显示此报告信息?试试这段代码 在这里,datatable的形状为透视网格,并绑定到gridview ASPX: <asp:GridView ID="gv2" OnDataBound="gv2_DataBound" runat="server" B
<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>
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);
}
CS:
<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>
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);
}
受保护的无效页面加载(对象发送方,事件参数e)
{
数据表dt=新数据表(“tbl”);
Add(newdatacolumn(){DataType=typeof(string),ColumnName=“USER”});
Add(newdatacolumn(){DataType=typeof(string),ColumnName=“GENDER”});
Add(newdatacolumn(){DataType=typeof(int),ColumnName=“NCNT”});
Add(newdatacolumn(){DataType=typeof(int),ColumnName=“OCNT”});
dt.行。添加(“测试”、“男性”,6,1);
添加(“TEST1”,“MALE”,3);
添加(“TEST2”,“MALE”,4);
dt.行。添加(“测试”、“女性”,1);
添加(“测试1”,“女性”,1);
DataTable dtpivot=新DataTable();
var ik=dt.AsEnumerable().Select(i=>i.Field(“用户”)).Distinct();
int-cnt=0;
foreach(ik中的变量项)
{
if(dtpivot.Columns[“USER”]==null){dtpivot.Columns.Add(“USER”);}
dtpivot.Rows.Add(项);
var il=dt.AsEnumerable()。其中(i=>i.Field(“USER”).Equals(item))。选择(j=>j.Field(“GENDER”)).Distinct();
foreach(il中的var项目1)
{
var im=dt.AsEnumerable()。其中(i=>i.Field(“性别”).Equals(item1)和&i.Field(“用户”).Equals(item))。选择(j=>new{newcol=j.Field(“NCNT”),oldcol=j.Field(“OCNT”);
foreach(im中的var项目2)
{
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();
}
受保护的void gv2_数据绑定(对象发送方,事件参数e)
{
GridViewRow行=新的GridViewRow(0,0,DataControlRowType.Header,DataControlRowState.Normal);
TableHeaderCell单元格=新建TableHeaderCell();
cell.BackColor=Color.White;
行.控件.添加(单元格);
TableHeaderCell 1=新的TableHeaderCell();
cell1.Text=“男性”;
单元格1.2,跨度=2;
cell1.BackColor=ColorTranslator.FromHtml(“#F2DDDC”);
行.控件.添加(单元格1);
TableHeaderCell 2=新的TableHeaderCell();
cell2.Text=“女性”;
cell2.ColumnSpan=2;
cell2.BackColor=ColorTranslator.FromHtml(“#F2DDDC”);
行.控件.添加(单元格2);
gv2.HeaderRow.Parent.Controls.AddAt(0,行);
}
在“关于代码”中,如果我们想动态获取列,只需从gridview中删除列和,并设置AutoGenerateColumns=“true”引用此url的另一种方法是,您也可以尝试使用纯LINQ查询。是的,您也可以使用LINQ,通过将用户和性别列分组,从select子句生成四列。