Доброе время суток. Ниже приведен код из мелкософтового примера, который грузит данные по запросу из БД. Он работает корректно.
DataGridView1.DataError += new DataGridViewDataErrorEventHandler(DataGridView1_DataError);
DataGridView1.VirtualMode = true;
DataGridView1.AutoSize = true;
DataGridView1.AutoGenerateColumns = true;
DataGridView1.DataSource = Populate("SELECT * FROM Employees");
DataGridView1.TopLeftHeaderCell.Value = "Employees";
DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
DataGridView1.AllowUserToAddRows = false;
DataGridView1.AllowUserToDeleteRows = false;
DataGridViewComboBoxColumn comboboxColumn = new DataGridViewComboBoxColumn();
comboboxColumn.DataPropertyName = ColumnName.TitleOfCourtesy.ToString();
comboboxColumn.HeaderText = ColumnName.TitleOfCourtesy.ToString();
comboboxColumn.DropDownWidth = 160;
comboboxColumn.Width = 90;
comboboxColumn.MaxDropDownItems = 3;
comboboxColumn.FlatStyle = FlatStyle.Flat;
comboboxColumn.DataSource = Populate("SELECT TitleOfCourtesy,TitleOfCourtesyID FROM TitleOfCourtesy");
comboboxColumn.ValueMember = ColumnName.TitleOfCourtesyID.ToString();
comboboxColumn.DisplayMember = ColumnName.TitleOfCourtesy.ToString();
comboboxColumn.DataPropertyName = ColumnName.TitleOfCourtesyID.ToString();
comboboxColumn.HeaderText = "TitleOfCourtesy (via DataSource property)";
DataGridView1.Columns.Insert(2, comboboxColumn);
private DataTable Populate(string sqlCommand)
{
OleDbConnection northwindConnection = new OleDbConnection(connectionString);
northwindConnection.Open();
OleDbCommand command = new OleDbCommand(sqlCommand, northwindConnection);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = command;
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);
return table;
}
У меня возникла задача сделать такое же, используя DataGridView1.AutoGenerateColumns = false; и генерируя колонки вручную перед загрузкой данных.
for (int i = 0; i < _columnNames.Length; i++)
{
DataGridViewColumn dgc = null;
if (_columnNames[i] == "Название")
dgc = new DataGridViewTextBoxColumn();
if (_columnNames[i] == "Описание")
dgc = new DataGridViewTextBoxColumn();
if (_columnNames[i] == "Цена")
dgc = new DataGridViewTextBoxColumn();
if (_columnNames[i] == "Валюта")
dgc = new DataGridViewComboBoxColumn();
if (_columnNames[i] == "_Валюта")
dgc = new DataGridViewTextBoxColumn();
if (_columnNames[i] == "_ID")
dgc = new DataGridViewTextBoxColumn();
if (dgc != null)
{
DataGrid.Columns.Add(dgc);
DataGrid.Columns[DataGrid.Columns.Count-1].Name = _columnNames[i];
DataGrid.Columns[_columnNames[i]].HeaderText = _columnNames[i];
DataGrid.Columns[_columnNames[i]].MinimumWidth = 80;
DataGrid.Columns[_columnNames[i]].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
DataGrid.Columns[_columnNames[i]].DataPropertyName = _columnNames[i];
}
}
В принципе все работает, но есть одно НО: когда я заполняю эти колонки adapter.Fill(table); их порядок меняется, в начало таблицы переносится колонка с комбо боксом, хотя об этом ее никто не просит (так она стоит 4-ой по порядку). С чем это связано и как ее вернуть на место?