<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<asp:Button ID="Button1" runat="server" Text="行转列" οnclick="Button1_Click" />
</div>
</form>
</body>
</html>
后台代码:
public partial class RowTOColumn : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
#region 添加一个表
DataTable _dt = new DataTable();
_dt.Columns.Add(new DataColumn("ID", typeof(int)) { DefaultValue = 1 });
_dt.Columns.Add(new DataColumn("Date", typeof(DateTime)) { DefaultValue = DateTime.Today });
_dt.Columns.Add(new DataColumn("ItemName", typeof(string)) { DefaultValue = "0" });
_dt.Columns.Add(new DataColumn("Count", typeof(int)) { DefaultValue = 0 });
_dt.Rows.Add(1,"2013-01-23", "ip", 60);
_dt.Rows.Add(2,"2013-01-23", "pv", 50);
_dt.Rows.Add(3,"2013-01-23", "um", 74);
_dt.Rows.Add(4,"2013-01-24", "ip", 41);
_dt.Rows.Add(5,"2013-01-24", "pv", 58);
_dt.Rows.Add(6,"2013-01-24", "um", 47);
_dt.Rows.Add(7,"2013-01-25", "ip", 89);
_dt.Rows.Add(8,"2013-01-25", "pv", 25);
_dt.Rows.Add(9,"2013-01-25", "um", 85);
#endregion
ViewState["dt"] = _dt;
GridView1.DataSource = _dt;
GridView1.DataBind();
}
}
private void DisplayTable(DataTable dt)
{
//输出列的标题
dt.Columns.Cast<DataColumn>().ToList().ForEach(x => Response.Write(x + "\t"));
//输出每行的信息
dt.Rows.Cast<DataRow>().ToList().ForEach(x =>
{
x.ItemArray.ToList().ForEach(y => Response.Write(y.ToString() + "\t\t"));
});
}
protected void Button1_Click(object sender, EventArgs e)
{
DataTable dt = (DataTable)ViewState["dt"];
dt = ConvertToTable(dt);
GridView1.DataSource = dt;
GridView1.DataBind();
}
#region 转换表
private DataTable ConvertToTable(DataTable source)
{
DataTable dt = new DataTable();
//前两列是固定的加上
dt.Columns.Add("ID");
dt.Columns.Add("Date");
//以staff_TiCheng 字段为筛选条件 列转为行 下面有图
var columns = (from x in source.Rows.Cast<DataRow>() select x[2].ToString()).Distinct();
//把 staff_TiCheng 字段 做为新字段添加进去
foreach (var item in columns) dt.Columns.Add(item).DefaultValue = 0;
// x[1] 是字段 staff_Name 按 staff_Name分组 g 是分组后的信息 g.Key 就是名字 如果不懂就去查一个linq group子句进行分组
var data = from x in source.Rows.Cast<DataRow>()
group x by x[1] into g
select new { Key = g.Key.ToString(), Items = g };
data.ToList().ForEach(x =>
{
//这里用的是一个string 数组 也可以用DataRow根据个人需要用
string[] array = new string[dt.Columns.Count];
//array[1]就是存名字的
array[1] = x.Key;
//从第二列开始遍历
for (int i = 2; i < dt.Columns.Count; i++)
{
if (array[0] == null)
array[0] = x.Items.ToList<DataRow>()[0]["ID"].ToString();
array[i] = (from y in x.Items
where y[2].ToString() == dt.Columns[i].ToString()
select y[3].ToString()
).SingleOrDefault();
}
dt.Rows.Add(array); //添加到table中
});
return dt;
}
#endregion
}