7R903 发表于 2022-3-27 21:47

c# 动态创建DataTable

有个题卡住了,

我想在循环内去创建一个DataTable,创建列,行之类的
现在生成的都是同一列(见下图),在列数不确定的情况下,如何能在写完一列后,将数据写在另一列?

static void Main(string[] args)
      {
            var dt = Create();
            Console.ReadKey();
      }

      static DataTable Create()
      {
            DataTable dt = new DataTable();
            for (int i = 0; i < 5; i++)
            {
                dt.Columns.Add("A" + i);
                dt.Rows.Add((i + 1).ToString());
         

            }
            return dt;
      }

https://s3.bmp.ovh/imgs/2022/03/9aebf70bb0005ecc.png

xiaovssha 发表于 2022-3-27 22:00

            dt_detail = new DataTable();
            dt_detail.Columns.Add(new DataColumn("type", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("uid", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("douyin", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("nickname", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("gender", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("fans", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("follow", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("city", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("qrcode", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("count", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("time", typeof(string)));
            dt_detail.Columns.Add(new DataColumn("remark", typeof(string)));

            var dr = dt_detail.NewRow();
            dr["type"] = u.type;
            dr["uid"] = u.uid;
            dr["douyin"] = u.douyin;
            dr["nickname"] = u.nickname;
            dr["gender"] = u.gender;
            dr["fans"] = u.fans;
            dr["follow"] = u.follow;
            dr["city"] = u.city;
            dr["count"] = 1;
            dr["time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            dr["remark"] = u.remark;
            dt_detail.Rows.Add(dr);

7R903 发表于 2022-3-27 22:05

xiaovssha 发表于 2022-3-27 22:00
            dt_detail = new DataTable();
            dt_detail.Columns.Add ...

我觉得我的想法可能有点复杂,我的DataTable需求是一列一列生成的,而不是一行一行生成的

unmask 发表于 2022-3-27 22:05

dt.Rows.Add((i + 1).ToString());

这句话的意思是增加一个新行,并且每行的第一列是i+1。
所以,你应该将这句话移出for循环,然后这么添加一行数据:
dt.Rows.Add("1","2","3","4","5");

7R903 发表于 2022-3-27 22:08

unmask 发表于 2022-3-27 22:05
dt.Rows.Add((i + 1).ToString());

这句话的意思是增加一个新行,并且每行的第一列是i+1。

是这个意思,但是后面怎么写进去呢,数量未知的情况下,我有可能是1,2,3,4,5,也有可能是1,2,3

unmask 发表于 2022-3-27 22:13

cn005897 发表于 2022-3-27 22:08
是这个意思,但是后面怎么写进去呢,数量未知的情况下,我有可能是1,2,3,4,5,也有可能是1,2,3

DataRow dr = dt.NewRow();
for (int i = 0; i < 5; i++)
{
    dr = (i + 1).ToString();
}

TakeKeyEasy 发表于 2022-3-28 00:20

循环的方式按照列来试下

xiaovssha 发表于 2022-3-28 00:38

你直接说,初始数据=>期望数据,这样才能给你源码啊

wu0o0pj 发表于 2022-3-28 10:34

DataTable Create(int dataCount, int maxRow)
      {
            DataTable dt = new DataTable();

            int rows = dataCount < maxRow ? dataCount : maxRow;
            int i = 0;

            // 生成行
            for (i = 0; i < rows; i++) { dt.Rows.Add(); }

            // 填充数据
            int row = maxRow - 1, col = -1;
            for (i = 0; i < dataCount; i++)
            {
                row++;

                if (row >= maxRow) // 换列
                {
                  col++;
                  row = 0;
                  dt.Columns.Add();
                }

                dt.Rows = i.ToString();
            }

            return dt;
      }
页: [1]
查看完整版本: c# 动态创建DataTable