【问题标题】:I need helping adding two different rows(with same columns) to the same datatable我需要帮助将两个不同的行(具有相同的列)添加到同一个数据表中
【发布时间】:2019-03-12 19:02:43
【问题描述】:

使用从 csv 文件中读取数据并将数据添加到 Datagridview 的 Windows 窗体应用程序。我遇到了将所有行添加到数据表并显示在数据网格视图上的问题。 datagridview 仅显示前两个 if 条件和 OneRow if 条件的数据行。如果 dataable 和 datagridview 行填充了 OneRow if 条件行,它将不会添加 twoRow if 条件中的行。但我希望显示 OneRow 和 TwoRow 中的行。当我在 OneRow if 条件中注释(/**/)时,来自 TwoRow 的行也会填充数据表和 datagridview。但我需要两者来填充表格。提前致谢!

        Construct.MainDataTable.Columns.Add("Date", typeof(DateTime));
        Construct.MainDataTable.Columns.Add("Time");
        Construct.MainDataTable.Columns.Add("Serial");
        Construct.MainDataTable.Columns.Add("Type");
        Construct.MainDataTable.Columns.Add("level");
        Construct.MainDataTable.Columns.Add("price");
        Construct.MainDataTable.Columns.Add(" Limit");
        Construct.MainDataTable.Columns.Add("last Limit");
        Construct.MainDataTable.Columns.Add("Data");
        ..........................
    ...............................................
        DataRow oneRow = Construct.MainDataTable.NewRow();
        DataRow twoRow = Construct.MainDataTable.NewRow();
        dataGridView2.AllowUserToAddRows = false;

        if (line.Split(',')[2].Equals("Time"))
        {
         time = line.Split(',')[3];
         date = line.Split(',')[1];
         }
        if (line.Split(',')[2].Equals("Level"))
        {
         level = line.Split(',')[3];

         }
        //OneROw(IF condition)
        if ((Convert.ToDecimal(line.Split(',')[8])) < (Convert.ToDecimal     (line.Split(',')[12]))) 
        {

          type = line.Split(',')[1];
          serial = line.Split(',')[7];
          price = line.Split(',')[3];
          Limit = line.Split(',')[8];
          lastLimit = line.Split(',')[10];
          Data = line.Split(',')[12];

          oneRow["Date"] = date;
          oneRow["Time"] = time;
          oneRow["Serial"] = serial;
          oneRow["Type"] = type;
          oneRow["level"] = level;
          oneRow["price"] = price;
          oneRow[" Limit"] = Limit;
          oneRow["last Limit"] = lastlimit;
          oneRow["Data"] = Data;
          Construct.MainDataTable.Rows.Add(oneRow);
         }  
       //TwoROw(IF condition)                             
        if ((line.Contains('"')) && ((line.Contains("NG"))))
        {
          price = line.Split(',')[3];
          type = line.Split(',')[1];
          serial = line.Split(',')[7];
          Limit = line.Split('"')[7];
          var valLimit = Limit.Split(',').Select(a => Convert.ToInt32(a, 16));
          var limitJoin = String.Join(",", valLimit);
          lastlimit = line.Split('"')[1];
          var vallastLimit = lastlimit.Split(',').Select(d => Convert.ToInt32(d, 16));
          var lastJoin = String.Join(",", vallastLimit);
          Data = line.Split('"')[5];
          var valDatas = Data.Split(',').Select(s => Convert.ToInt32(s, 16));
          var dataJoin = String.Join(",", valDatas);
          twoRow["Date"] = date;
          twoRow["Time"] = time;
          twoRow["Serial"] = serial;
          twoRow["Type"] = type;
          twoRow["level"] = level;
          twoRow["price"] = price;
          twoRow["Limit"] = limitJoin;
          twoRow["last Limit"] = lastJoin;
          twoRow["Data"] = dataJoin;
          Construct.MainDataTable.Rows.Add(twoRow);
          }
         dataGridView2.DataSource = Construct.MainDataTable;

【问题讨论】:

  • 您真的应该将Split(',') 的结果保存到一个变量中,而不是在几乎每一行都将行拆分为一个数组!!

标签: c# datagridview datatable row datagridviewcolumn


【解决方案1】:

无法添加评论,因为我没有足够的业力,所以我在这里问我的问题:所以,如果我理解你的问题,你不能从一个 .csv 文件中添加数据,如果它有超过一行?为什么对 .csv 文件中的行使用 2 种不同的 if 条件?

如果行中有空数据,请不要介意,您仍然可以将它们放置到 DataTable 列中,这样您就可以使用循环将 .csv 中的数据添加到 DataTable 中。试试这样的事情:

    public static DataTable CsvToDataTable(string csv)
    {
        DataTable dt = new DataTable();
        string[] lines = csv.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
        Regex onlyDeimiterComma = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");

        for (int i = 0; i < lines.Length; i++)
        {
            DataRow row = dt.NewRow();
            string[] cells = onlyDeimiterComma.Split(lines[i]);

            for (int j = 0; j < cells.Length; j++)
            {
                if (i == 0)
                { 
                    if (j == 0)
                    {
                        dt.Columns.Add(cells[j], typeof(DateTime));
                    }
                    else
                    {
                        dt.Columns.Add(cells[j]);
                    }                   
                }
                else
                {
                    row[j] = cells[j];
                }
            }

            dt.Rows.Add(row);
        }

        return dt;
    }

只需在代码中的任何位置调用此方法,然后从 .csv 文件中读取字符串即可。 您可以尝试编译此代码 here 并查看它如何处理具有不同数据(空列、引用文本、引用逗号)的 .csv 数据

UPD:如果您需要从两个不同的 .csv 文件填充 DataTable,您仍然可以使用上面的代码。只需为两个文件调用两次,然后合并两个 DataTable,如下所示:

DataTable dt = CsvToDataTable(csvFileOne);
DataTable dtTwo = CsvToDataTable(csvFileTwo);
dt.Merge(dtTwo);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 2022-06-10
    • 2022-01-26
    • 1970-01-01
    • 2014-02-21
    相关资源
    最近更新 更多