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