Home  >  Article  >  Backend Development  >  How to implement row-column conversion in DataTable in C#

How to implement row-column conversion in DataTable in C#

高洛峰
高洛峰Original
2017-01-18 09:39:431631browse

The example of this article describes the method of realizing row-column conversion in DataTable in C#. Share it with everyone for your reference. The specific implementation method is as follows:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
   DataTable tt = GetCrossTable(CreateDT());
   GridView1.DataSource = tt;
   GridView1.DataBind();
  }
}
//创建DataTable
protected DataTable CreateDT()
{
  DataTable tblDatas = new DataTable("Datas");
  //数据列
  tblDatas.Columns.Add("姓名", Type.GetType("System.String"));
  tblDatas.Columns.Add("科目", Type.GetType("System.String"));
  tblDatas.Columns.Add("分数", Type.GetType("System.Int32"));
  tblDatas.Rows.Add(new object[] { "张三", "语文", 89 });
  tblDatas.Rows.Add(new object[] { "张三", "数学", 90 });
  tblDatas.Rows.Add(new object[] { "张三", "英语", 79 });
  tblDatas.Rows.Add(new object[] { "张三", "地理", 70 });
  tblDatas.Rows.Add(new object[] { "张三", "生物", 95 });
  tblDatas.Rows.Add(new object[] { "李四", "语文", 87 });
  tblDatas.Rows.Add(new object[] { "李四", "英语", 86 });
  tblDatas.Rows.Add(new object[] { "李四", "地理", 82 });
  tblDatas.Rows.Add(new object[] { "王五", "语文", 81 });
  tblDatas.Rows.Add(new object[] { "王五", "数学", 70 });
  tblDatas.Rows.Add(new object[] { "王五", "英语", 88 });
  tblDatas.Rows.Add(new object[] { "王五", "生物", 96 });
  return tblDatas;
}
/// <summary>
/// 将DataTable的第二列的值转化为列
//(即将原来的行表,转化成交叉表,没有对应值则默认"0")
/// </summary>
/// <param name="dt">必须三列,第三列为值</param>
/// <returns></returns>
public static DataTable GetCrossTable(DataTable dt)
{
  if (dt == null || dt.Columns.Count != 3 || dt.Rows.Count == 0)
  {
   return dt;
  }
  else
  {
   DataTable result = new DataTable();
   result.Columns.Add(dt.Columns[0].ColumnName);
   DataTable dtColumns = dt.DefaultView.ToTable("dtColumns", true, dt.Columns[1].ColumnName);
   for (int i = 0; i < dtColumns.Rows.Count; i++)
   {
    string colName;
    if (dtColumns.Rows[1][0] is DateTime)
    {
     colName = Convert.ToDateTime(dtColumns.Rows[i][0]).ToString();
    }
    else
    {
     colName = dtColumns.Rows[i][0].ToString();
    }
    result.Columns.Add(colName);
    result.Columns[i + 1].DefaultValue = "0";
   }
   DataRow drNew = result.NewRow();
   drNew[0] = dt.Rows[0][0];
   string rowName = drNew[0].ToString();
   foreach (DataRow dr in dt.Rows)
   {
    string colName = dr[1].ToString();
    double dValue = Convert.ToDouble(dr[2]);
    if (dr[0].ToString().Equals(rowName, StringComparison.CurrentCultureIgnoreCase))
    {
     drNew[colName] = dValue.ToString();
    }
    else
    {
     result.Rows.Add(drNew);
     drNew = result.NewRow();
     drNew[0] = dr[0];
     rowName = drNew[0].ToString();
     drNew[colName] = dValue.ToString();
    }
   }
   result.Rows.Add(drNew);
   return result;
  }
}

I hope this article will be helpful to everyone’s C# programming.

For more related articles on how to implement row-column conversion in DataTable in C#, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn