извините - я нашел решение непосредственно в ответах, где я нашел решение для выбора ComboBox для заголовков столбцов.
После изменения кода, приведенного в этом обсуждении MSDN, он должен работать для меня.
Я пытаюсь создать форму для импорта данных из 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,