.net行转列实现(动态列)

 protected void SubtotalCalculate()
        {
            string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();

            MySqlConnection cn = new MySqlConnection(connectionString);          
            cn.Open();

            string sqlstr = @"
                            select a.*,
                                stuff((select ',' + t.task from table2 as t where t.name = a.name for xml path('')),
                                    1,1,'') as task
                            from table1 as a

                         ";
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = cn;
            cmd.CommandText = sqlstr;
            MySqlDataReader reader = cmd.ExecuteReader();

            DataTable dt = ReaderToTable(reader);
            dt = DealTable(dt);
            string htmlStr = GetHtmlStrByDataTable(dt);
            //lblTable.Text = htmlStr;

        }
        protected DataTable ReaderToTable(MySqlDataReader dr)
        {
            DataTable dt = new DataTable();

            for (int i = 0; i < dr.FieldCount; i++)
            {
                dt.Columns.Add(dr.GetName(i), dr.GetFieldType(i));
            }

            object[] objValues = new object[dr.FieldCount];
            while (dr.Read())
            {
                dr.GetValues(objValues);
                dt.LoadDataRow(objValues, true);
            }
            dr.Close();

            return dt;
        }
        protected DataTable DealTable(DataTable dt)
        {
            //获取task列数据,存入list
            List<string[]> list = new List<string[]>();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                string[] strs = dt.Rows[i]["task"].ToString().Split(',');
                list.Add(strs);
            }
            //取得strs中最长的长度
            int maxlen = 0;
            foreach (string[] strs in list)
            {
                if (strs.Length > maxlen)
                {
                    maxlen = strs.Length;
                }
            }
            //删除task列
            dt.Columns.Remove("task");
            //添加maxlen个列
            for (int i = 0; i < maxlen; i++)
            {
                dt.Columns.Add("task" + (i + 1).ToString());
            }
            //给新添加的列赋值数据
            int newColStart = dt.Columns.IndexOf(dt.Columns["name"]) + 1;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = newColStart; j < newColStart + maxlen; j++)
                {
                    int newColNo = j - newColStart;
                    if (list[i].Length > newColNo)
                    {
                        dt.Rows[i][j] = list[i][newColNo];
                    }
                }
            }

            return dt;
        }
        protected string GetHtmlStrByDataTable(DataTable dt)
        {
            StringBuilder sb = new StringBuilder();

            //表头
            sb.Append("<tr>");
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sb.Append("<td>" + dt.Columns[i].ColumnName + "</td>");
            }
            sb.Append("</tr>");

            //数据
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                sb.Append("<tr>");
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    sb.Append("<td>" + dt.Rows[i][j].ToString() + "</td>");
                }
                sb.Append("</tr>");
            }

            return sb.ToString();
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值