C#行转列文本

<!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
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值