Как программно в dataGridView сделать поле ComboBox?

175
17 февраля 2019, 15:20

Как программно в dataGridView сделать поле ComboBox?

Ниже приведённый код к результату не приводит.

DataTable dt;        
OleDbConnection connection;
OleDbDataAdapter adapter;
OleDbCommandBuilder commandBuilder;

        static string catBD = @"z:\vs\csharp\prb\db_GridVAccess.accdb";
        string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", catBD);
        string sql = "SELECT * FROM tbl_01_Combox";
        public Form5()
        {
            InitializeComponent();

            using (OleDbConnection cn = new OleDbConnection())
            {
                connection = new OleDbConnection(connectionString);
                connection.Open();
                adapter = new OleDbDataAdapter(sql, connection);
                commandBuilder = new OleDbCommandBuilder(adapter);
                // На соновании DataTable
                dt = new DataTable();
                adapter.Fill(dt);
                dataGridView1.DataSource = dt;
            }
        }
        private void Form5_Load(object sender, EventArgs e)
        {
            // Ширина поля            
            dataGridView1.Columns[0].Width = 50;
            // Комбокс
            string[] countrys = new string[] { "США", "ОАЭ", "ЮАР" };
            (dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DataSource = countrys;
        }
Answer 1

Как-то так:

string[] countrys = new string[] { "США", "ОАЭ", "ЮАР" };            
var oldcol = dataGridView1.Columns[1];
var newcol = new DataGridViewComboBoxColumn();
newcol.HeaderText = oldcol.HeaderText;
newcol.Name = oldcol.Name;
newcol.DataSource = countrys;
newcol.DataPropertyName = oldcol.DataPropertyName;  
dataGridView1.Columns.RemoveAt(1);
dataGridView1.Columns.Insert(1,newcol);

Недостаток: если значение в таблице отсутствует в списке для ComboBox, при каждом нажатии на DataGridView валится ошибка (необходимо обработать событие DataError).

Чтобы ComboBox раскрывался по первому клику, добавьте такой обработчик для события CellClick в DataGridView:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewCell cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
    if (cell is DataGridViewComboBoxCell)
    {                
        dataGridView1.BeginEdit(false);
        (dataGridView1.EditingControl as DataGridViewComboBoxEditingControl).DroppedDown = true;                
    }
}
READ ALSO
Необработанное исключение типа “System.InvalidOperationException” в EntityFramework.dll

Необработанное исключение типа “System.InvalidOperationException” в EntityFramework.dll

пишу приложение WPF с веб сервисом wfc, в веб сервесе модель базы данных entity framework, когда пытаюсь передать запрос из клиента на добавление записи...

124
XamlParseException. Ошибка в коде

XamlParseException. Ошибка в коде

Скажите как исправить ошибку

179
Ресайз Bitmap в пропорции

Ресайз Bitmap в пропорции

Как правильнее ресайзить изображение в формате Bitmap, с учётом:

122