Мне нужна помощь в добавлении двух разных строк (с одинаковыми столбцами) в одну и ту же таблицу данных

#c# #datagridview #datatable #row #datagridviewcolumn

#c# #datagridview #таблица данных #строка #datagridviewcolumn

Вопрос:

Работаю над приложением Windows form, которое считывает данные из CSV-файлов и добавляет данные в Datagridview. Я столкнулся с проблемой, связанной со всеми строками, добавляемыми в таблицу данных и отображаемыми в datagridview. Datagridview отображает потоки данных из первых двух условий if и только из условия OneRow if. Это не добавит строки из условия twoRow if, если строки datable и datagridview заполнены строками условия OneRow if. Но я хочу, чтобы отображались строки как из OneRow, так и из TwoRow. Также строки из TwoRow заполняют datatable и datagridview, когда я комментирую (/** /) условие OneRow if. Но мне нужны обе для заполнения таблицы. Заранее спасибо!

         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('"')) amp;amp; ((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;
  

Комментарии:

1. Вам действительно следует сохранить результат Split(',') в переменную, а не разбивать строку на массив практически в каждой строке!!

Ответ №1:

Не могу добавить комментарий, потому что у меня недостаточно кармы, поэтому я задаю свои вопросы здесь: Итак, если я понял вашу проблему, вы не можете добавить данные из одного файла .csv, если в нем больше одной строки? Почему вы используете 2 разных условия if для строки в файле .csv?

Если у вас есть пустые данные в строке, неважно, вы все равно можете поместить их в свой столбец DataTable, поэтому вы можете использовать цикл для добавления данных из .csv в свой DataTable. Попробуйте что-нибудь вроде этого:

     public static DataTable CsvToDataTable(string csv)
    {
        DataTable dt = new DataTable();
        string[] lines = csv.Split(new[] { "rn", "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.
Вы можете попробовать скомпилировать этот код здесь и посмотреть, как это работает с данными .csv с разными данными (пустые столбцы, текст в кавычках, запятые в кавычках)

UPD: Если вам нужно заполнить таблицу данных из двух разных файлов .csv, вы все равно можете использовать приведенный выше код. Просто вызовите это дважды для обоих файлов, а затем объедините две таблицы данных, вот так:

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