C # - «Динамический» DataGridView

Я пытаюсь создать форму для импорта данных из CSV в базу данных. Теперь я борюсь со следующими задачами:

в зависимости от таблицы, в которую необходимо импортировать данные, у нас есть несколько столбцов в БД: DB_COL_AMOUNT = X

Файл CSV может иметь другое количество столбцов. Он может иметь больше или меньше столбцов, чем наша таблица DB. CSV_COL_AMOUNT = Y

Теперь я хочу иметь DataGridView, который должен отображать содержимое файла CSV. Эта часть прекрасна и работает, как ожидалось.

Если у меня есть три «столбца» в моем CSV-файле, я получу три столбца в моем DataGrid, а также в зависимости, если CSV-файл имеет строку заголовка или нет, я возьму значения Header в качестве заголовка столбца для DataGridView ,

Теперь мне нужна магия:

Я выяснил, как я мог бы объединить элемент ComboBox с ColumnHeder в представлении DataGrid - получить список имен столбцов.

Я хочу это, чтобы назначить столбец DataGridView столбцу в моей БД.

Fe:

База данных:

name | surename | birthdate | postalcode |

DataGridView:

col1 | col2 | col3 | col4 |

на этом этапе структура файла CSV может отличаться от структуры в нашей базе данных -> мне нужно указать, какой столбец следует вставить в какой столбец таблицы.

Теперь у меня есть имена таблицы и можно выполнить назначение:

col1 => surename, col2 => name, col3 => postalcode, col4 => birthdate

Для этого я нашел следующий код:

List<string> ColumnHeaders = new List<string>();

using (SQLiteConnection dbConnection = new SQLiteConnection("Data Source=" + GetDBFile))
{
   try
   {
      dbConnection.Open();
   }
   catch (Exception ex)
   { }

   string SQL = "PRAGMA table_info (`contacts`)";

   using (SQLiteCommand command = new SQLiteCommand(SQL, dbConnection))
   {
      try
      {
         SQLiteDataReader reader = command.ExecuteReader();

         while (reader.Read())
         {
            if(reader.GetString(1) != "id")
            {
               ColumnHeaders.Add(reader.GetString(1));
            }
         }
      }
      catch (Exception ex)
      {
         MessageBox.Show(ex.Message);
      }
   }
}

ComboBox comboBoxHeaderCell = new ComboBox();
comboBoxHeaderCell.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxHeaderCell.Visible = true;

foreach (string Header in ColumnHeaders)
{
    comboBoxHeaderCell.Items.Add(Header);
    comboBoxHeaderCell.Text = Header;
 }

dataGridView1.Controls.Add(comboBoxHeaderCell);
comboBoxHeaderCell.Location = this.dataGridView1.GetCellDisplayRectangle(0, -1, true).Location;
comboBoxHeaderCell.Size = this.dataGridView1.Columns[0].HeaderCell.Size;

Это абсолютно нормально работает: ЕСЛИ я знаю, сколько столбцов мне нужно создать. Но так как я не знаю, сколько столбцов DataGridView будет иметь, пока Пользователь не импортирует файл csv.

У кого-нибудь есть идея, как я могу заставить это работать?

Я попытался вставить эту часть

ComboBox comboBoxHeaderCell = new ComboBox();
comboBoxHeaderCell.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxHeaderCell.Visible = true;

foreach (string Header in ColumnHeaders)
{
    comboBoxHeaderCell.Items.Add(Header);
    comboBoxHeaderCell.Text = Header;
 }

 dataGridView1.Controls.Add(comboBoxHeaderCell);
 comboBoxHeaderCell.Location = this.dataGridView1.GetCellDisplayRectangle(0, -1, true).Location;
 comboBoxHeaderCell.Size = this.dataGridView1.Columns[0].HeaderCell.Size;

в цикл for и подсчет номера столбца сгенерированного DataGrid - но выбор будет создан только для первого столбца.

Я думаю, мне нужно изменить имя элемента ComboBox, но я не могу этого сделать, используя counter-Var или что-то вроде этого.

c#,datagridview,combobox,datagrid,csv-import,

0
Яндекс.Метрика