Как запрограммировать Combox в dataGridView? - PullRequest
0 голосов
/ 14 октября 2018

Как запрограммировать Combox в dataGridView?
Следующий код не приводит к результату.

Таблицы данных парсятся в Datatable.
Я хочу, чтобы «поле» отображалось для поля «Тип»

enter image description here Код

  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;

        }

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Отредактировано:

Если вы установили DataGridView.AutoGenerateColumns = true и столбцы генерируются автоматически, тип столбца «тип» не является ComboBox.в этом случае вы можете создать новый столбец, настроить его, а затем заменить на него старый столбец:

DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
int i = 0;
column.DataPropertyName = "type";
column.DataSource = countrys.Select(x => new { Key = i++, Value = x }).ToList();
column.DisplayMember = "Value";
column.ValueMember = "Key";
dataGridView1.Columns.RemoveAt(1);
dataGridView1.Columns.Insert(1, column);

предыдущий код не работал, поскольку column[1] не удалось преобразовать в DataGridViewComboBoxColumnпоэтому (dataGridView1.Columns[1] as DataGridViewComboBoxColumn) вернет ноль, и поскольку вы поместили код в Form_Load, исключение было опущено.

Оригинал:

попробуйте это:

int i = 0;
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DataSource = countrys.Select(x=> new {Key = i++, Value = x}).ToList();
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn).DisplayMember = "Value";
(dataGridView1.Columns[1] as DataGridViewComboBoxColumn).ValueMember = "Key";
0 голосов
/ 14 октября 2018

Я считаю, что проблема в том, что ваши "страны" не поддаются наблюдению, плюс это должна быть собственность.Рассмотрим следующий код:

private ObservableCollection<string> _Countries;    
public ObservableCollection<string> Countries
{
    get { return _Countries; }
    set { _Countries = value; }
}

Инициализируйте и установите его содержимое в Form5_Load и посмотрите, работает ли он.

EDIT 1:

Мне было любопытно, так что я на самом делесоздал проект и попытался воссоздать проблему, и я считаю, что реальная проблема заключается в том, что ваш DataGridView заполняется в соответствии с информацией, которую вы получаете из БД.Я посмотрел на это немного дальше и нашел этот пост на SO:

C # Заменить текстовое поле по умолчанию в DataGridView на Combobox

Согласно этому, вы не можетеизмените тип столбца на DataGridView ComboBox Столбец, после того как он уже был создан как DataGridView TextBox Столбец в соответствии с данными, полученными из БД.Он также предлагает два разных подхода к делу, которые звучат реалистично.Я надеюсь, что вы можете понять это, удачи.

РЕДАКТИРОВАТЬ 2:

В соответствии с вашим запросом, я постараюсь найти способ сделать это путем изменения данных, которые вы получаете из БД.

В следующем фрагменте кода у вас есть объект "dt", который содержит данные, которые вы хотите отобразить в вашем DataGridView.

dt = new DataTable();    
adapter.Fill(dt);
dataGridView1.DataSource = dt;

Я сам никогда этого не делал, иЯ не могу по-настоящему быстро воссоздать его, но я предлагаю вам попробовать поиграть с содержимым объекта "dt".Я полагаю, что код, который происходит в "adapter.Fill" создает DataTable в соответствии с данными из базы данных, вы можете попробовать добавить туда некоторый код, который добавит список вместо строки для столбца "type" (это поможетнасколько я понимаю, создайте ComboBoxColumn вместо TextBoxColumn.Я на самом деле проверил это прямо сейчас, и это выглядит немного сложным, но я действительно не знаю, что там происходит в вашей программе, это может быть так же просто, как и получается.

В любом случае, я попытался сделать это по-другому, вместо того, чтобы изменить существующий тип столбца, я добавил новый собственный DataGridViewComboBoxColumn в конец автоматически заполненного DataGridView:

enter image description here

DataTable dt = new DataTable();
dataGridView2.DataSource = dt;

DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn();

newColumn.DataSource = new List<string> { "asd", "qwe", "zxc" };

dataGridView2.Columns.Add(newColumn);

Затем вы можете просто удалить / удалить несоответствующий столбец типа, полученный из базы данных.Но на этом пути вы столкнетесь с некоторыми другими проблемами, такими как подключение выбранного объекта в выпадающем списке к другим данным в строке.Это не сложно, но может стать относительно уродливым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...