Управление колонками в DataGridView
От: kamakama  
Дата: 26.01.10 12:16
Оценка:
Доброе время суток. Ниже приведен код из мелкософтового примера, который грузит данные по запросу из БД. Он работает корректно.
        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-ой по порядку). С чем это связано и как ее вернуть на место?
datagridview columns
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.