Lokesh Zende Ответов: 2

Присвоить значение столбцу combobox в datagridview


Привет,
Я не очень хорошо знаком с приложениями winform.
У меня есть представление datagrid, в котором я добавляю столбец combobox.
Я хочу установить значение combobox для каждой строки.

Вот что я делаю:
private void BindGrid(DataTable Table)
        {
            dgvSchemaMapped.AutoGenerateColumns = false;
            dgvSchemaMapped.Columns[0].Name = "COLUMN_NAME";
            dgvSchemaMapped.Columns[0].HeaderText = "Column";
            dgvSchemaMapped.Columns[0].DataPropertyName = "COLUMN_NAME";

            dgvSchemaMapped.Columns[1].Name = "ALIAS_COLUMN";
            dgvSchemaMapped.Columns[1].HeaderText = "Alias Column";
            dgvSchemaMapped.Columns[1].DataPropertyName = "ALIAS_COLUMN";

            dgvSchemaMapped.Columns[2].Name = "TYPE_NAME";
            dgvSchemaMapped.Columns[2].HeaderText = "Data Type";
            dgvSchemaMapped.Columns[2].DataPropertyName = "TYPE_NAME";

            dgvSchemaMapped.DataSource = Table;

            //Add combobox column to gird
            DataGridViewComboBoxColumn AliasDataTypeCombo = new DataGridViewComboBoxColumn();
            FillDataTypeCombo(AliasDataTypeCombo);
            dgvSchemaMapped.Columns.Add(AliasDataTypeCombo);

            // Set default value to aliasDataType combobox
            SetDefaultDataType();
        }


private void SetDefaultDataType()
        {
            for (int i = 0; i < dgvSchemaMapped.Rows.Count - 1; i++)
            {
                string dataType = dgvSchemaMapped.Rows[i].Cells["TYPE_NAME"].Value.ToString();
                switch (dataType.ToLower())
                {
                    case "int":
                    case "tinyint":
                    case "smallint":
                        (dgvSchemaMapped.Rows[i].Cells[3]).Value = ((KeyValuePair<string, int>)(((dgvSchemaMapped.Rows[i].Cells[3] as DataGridViewComboBoxCell).Items[3]))).Value;
                        break;
                    case "char":
                    case "nchar":
                    case "varchar":
                    case "nvarchar":
                        (dgvSchemaMapped.Rows[i].Cells[3]).Value = ((KeyValuePair<string, int>)((dgvSchemaMapped.Rows[i].Cells[3] as DataGridViewComboBoxCell).Items[18])).Value;
                        break;
                    case "real":
                    case "decimal":
                        (dgvSchemaMapped.Rows[i].Cells[3]).Value = ((KeyValuePair<string, int>)((dgvSchemaMapped.Rows[i].Cells[3] as DataGridViewComboBoxCell).Items[12])).Value;
                        break;
                    case "datetime":
                        (dgvSchemaMapped.Rows[i].Cells[3]).Value = ((KeyValuePair<string, int>)((dgvSchemaMapped.Rows[i].Cells[3] as DataGridViewComboBoxCell).Items[22])).Value;
                        break;
                }
            }
        }

private void FillDataTypeCombo(DataGridViewComboBoxColumn AliasDataTypeCombo)
       {
           Dictionary<string, int> lstDataTypes = new Dictionary<string, int>();

           GetBuilInDataTypes(lstDataTypes);

           AliasDataTypeCombo.DataSource = new BindingSource(lstDataTypes, null);
           AliasDataTypeCombo.ValueMember = "value";
           AliasDataTypeCombo.DisplayMember = "key";
       }


Комбо-боксы действительно имеют значения в них, когда сетка привязана. Но я не могу установить значение по умолчанию для каждого combobox.
Что я делаю не так?

Любая помощь будет оценена по достоинству.
Спасибо,
Лок.

Что я уже пробовал:

Я попытался привести ячейку сетки к ячейке combobox и присвоить ей значение.
Но это не дает мне никакого результата.

2 Ответов

Рейтинг:
1

RickZeeland

Если BindingSource не работает, попробуйте вот так:

AliasDataTypeCombo.Items.AddRange("One", "Two", "Three", "Four");
Также может возникнуть проблема с областью действия при назначении BindingSource непосредственно попробуйте использовать общедоступную переменную BindingSource.


Lokesh Zende

Я вижу элементы в каждом выпадающем списке в столбце. Так что я не думаю, что это имеет какое-то отношение к BindingSource. Или не так?

RickZeeland

Я бы сказал, Просто попробуйте, это легко реализовать ...

Lokesh Zende

Спасибо за предложение. Я попробовал и это. Иметь никакого значения

Рейтинг:
1

Alan N

Если comboboxes пусты после выполнения метода SetDefaultType (), то наиболее вероятной причиной является то, что каждому combobox было присвоено либо неправильное, либо никакое значение. Возникает вопрос, как это могло произойти?

Ваш код для получения значений по умолчанию из коллекции элементов кажется правильным, поэтому у меня есть эти простые вопросы (не обижайтесь)

1) является ли это условие цикла правильным, поскольку оно исключает последнюю строку в DGV?

for (int i = 0; i < dgvSchemaMapped.Rows.Count - 1; i++)

2) используете ли вы DataGridView.Событие DataError. Это почти необходимо во время отладки, так как DGV имеет неприятную привычку глотать исключения, и событие часто является единственным способом выявить проблему с данными. Например
comboboxCell.Value = SomethingNotInTheItemsList;
это ошибка данных и даст пустую ячейку.

3)в коммутаторе находится тип данных.ToLower () допустимое значение. Я спрашиваю, выполняется ли какой-либо из разделов коммутатора (случаев). Возможно, добавьте случай по умолчанию с инструкцией exception throw, чтобы выделить неожиданные значения в типе данных.

Два комментария о коде

Этот сложный индекс / cast/index/cast/assign one liner действительно трудно понять, и разделение его на отдельные части поможет отладке. Только последние две линии должны быть внутри переключателя.
DataGridViewRow row = grid.Rows[i];

DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells[3];
DataGridViewComboBoxCell.ObjectCollection items = cell.Items;

KVP defaultItem = (KVP)items[18];  // KVP is an alias for the full KeyValuePair<>
cell.Value = defaultItem.Value;

Почему словарь для элементов combobox в качестве BindingSource должен выполнять неявное преобразование в IBindingList.

Алан.