C # - «Динамический» DataGridView - PullRequest
0 голосов
/ 24 августа 2018

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

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

CSVФайл может иметь различное количество «столбцов».В нем может быть больше или меньше столбцов, чем в нашей таблице БД.CSV_COL_AMOUNT = Y

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

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

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

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

Я хочу это, чтобы назначить столбец 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 - но выбор будет создан только для первого столбца.

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

1 Ответ

0 голосов
/ 24 августа 2018

извините - я нашел решение непосредственно в ответах, где я нашел решение для получения выбора ComboBox для заголовков столбцов.

После изменения кода, указанного в этого обсуждения MSDN это должно работать для меня.

...