Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как заполнить DataGridViewComboBoxColumn ?


Автор: avg 17.12.2007, 12:24
Имеется вот такая база данных из таблиц
user posted image
Нужно сделать форму с dataGridView1 для таблицы сотрудников
Причём колонка профессия должна состоять из DataGridViewComboBoxColumn (должна представлять из себя ComboBox),
в которых можно выбрать название профессии.
ComboBox каким-то образом должен содержать столбцы из таблицы профессии "ИД" и "название". Тоесть когда
выбирается нужное название профессии -> в таблице сотрудники обновляется запись в поле профессия_ид кодом
данной профессии, который соответствует названию данной выбранной профессии.

Автор: 1stain 17.12.2007, 17:21
загоняешь эти таблицы в датасет, для грида выбираешь DataSource = таблица "Сотрудники", меняешь тип колонки профессия на DataGridViewComboBoxColumn, для него ставишь DataSource = таблица "Профессии", DisplayMember = Title, ValueMember = ID

Автор: cASSAndra 25.1.2008, 16:57
а можно ли заполнять DataGridViewComboBoxColumn без использования dataSet и т.п.? У меня в DataGridView всего одна строка и несколько колонок в виде ComboBox (можно было бы просто наставить комбобоксов, но с датагрид выглядит красивее  smile ). Как зашить возможные значения не в программном коде я нашла:
DataGridView Task -> Edit Columns -> выбираем колонку из списка -> Column Type ставим DataGridViewComboBoxColumn -> добавляем возможные значения в Items Collection.
Но у меня ситуация такая: из файла в класс считываются все возможные для колонки значения (список допустимых значений редактируется в др. месте). 
класс ListParamPatch с полями, которые представляют из себя массивы возможных значений для ячеек таблицы:
            RecordTypes 
            NameSystems
            PasswordSystems и т.д.

мне обязательно создавать dataSet и т.п. или можно сделать проще? smile 

Автор: IApple 25.1.2008, 17:27
Почитать лучше сначала здесь:

http://www.rsdn.ru/article/dotnet/DataGridView20.xml
и
http://www.rsdn.ru/article/dotnet/DataGridView20part2.xml

Автор: cASSAndra 25.1.2008, 17:33
спасибо, почитаем  smile 

Автор: cASSAndra 4.2.2008, 18:25
а как сделать, чтобы в comboBox, который встроен в dataGridView можно было вводить кроме значений из списка что-то ещё? как это у обычного comboBox - можно выбрать, а можно и с клавиатуры значение ввести.  smile 

Автор: cASSAndra 5.2.2008, 11:36
нашла  smile 

Код

private void dataGridViewPatchData_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            {
                ComboBox c = e.Control as ComboBox;
                if (c != null)
                {
                    c.DropDownStyle = ComboBoxStyle.DropDown;
                }
            }
        }

        private void dataGridViewPatchData_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (e.ColumnIndex == dataGridViewPatchData.Columns[0].Index)
            {
                object eFV = e.FormattedValue;
                DataGridViewComboBoxCell cBoxCell = dataGridViewPatchData.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
                if (cBoxCell.Items.Contains(eFV) == false)                    
                {
                    cBoxCell.Items.Add(eFV);
                }                
            }
        }

Автор: cASSAndra 5.2.2008, 15:39
возник другой вопрос  smile :
при создании новой записи в comboBox (процедура dataGridViewPatchData_CellValidating) если написать

Код

cBoxCell.Value = eFV;


в ячейке всё равно стоит старое значение, а чтобы получить только что созданное значение, надо выбирать из списка.
нельзя ли сделать, чтобы сразу же ячейке присваивалось только что созданное значение?

Автор: cASSAndra 5.2.2008, 16:04
получается вот так  smile :


объявляем переменные

Код

    public partial class PatchForm : Form
    {
        string cellValue;   // то что надо занести в ячейку
        bool flagFillCell;  // 
        flagFillCell = false;




Код

        private void dataGridViewPatchData_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (e.ColumnIndex == dataGridViewPatchData.Columns[0].Index)
            {
                object eFV = e.FormattedValue;                
                DataGridViewComboBoxCell cBoxCell = dataGridViewPatchData.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
                if (cBoxCell.Items.Contains(eFV) == false)                    
                {
                    cBoxCell.Items.Add(eFV);
                    cellValue = eFV.ToString();   // запоминаем значение
                    flagFillCell = true;   // 
                }                
            }
        }


и по окончанию редактирования ячейки 

Код

        private void dataGridViewPatchData_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (flagFillCell == true)
            {
                dataGridViewPatchData.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = cellValue;
                flagFillCell = false;
            }
        }        


вроде работает smile , но больно уж громоздко расписано. может как нибудь поизящнее можно?

Автор: MaxWave 5.4.2008, 22:18
sorry

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)