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


Автор: v_enom 29.3.2009, 16:50
Есть такой код (динамически создаются закладки tabControl, каждой закладке соответствует свой запрос к базе и полученные из нее данные):


Код

TabPage newPage = new TabPage(tableName);

                newPage.BackColor = System.Drawing.Color.White;
               

            //-------------------- таблица из базы данных
            DataGridView dataGrid = new DataGridView();
            
               dataGrid.Anchor = ((System.Windows.Forms.AnchorStyles)(
                                       (System.Windows.Forms.AnchorStyles.Top) | (System.Windows.Forms.AnchorStyles.Left)
                                                         | (System.Windows.Forms.AnchorStyles.Right) | (System.Windows.Forms.AnchorStyles.Bottom))
                                  );                
                             
            dataGrid.Location = new System.Drawing.Point(0,0);                
            dataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
            newPage.Text = connection.GetNewPageTextByTableName(tableName);

            tabControl1.TabPages.Insert(0,newPage); // вставляем новую страницу с выборкой      
            
                       
            newPage.Controls.Add(dataGrid);
               tabControl1.SelectedIndex = 0;      // и выбираем данную закладку. (она всегда нулевая в списке будет)            

            


               dataGrid.DataSource = dataTable;
               // this.Column1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.ColumnHeader;
               dataGrid.AutoResizeColumns(); // выравнивание колонок по содержимому

               //dataGrid.Rows[1].Cells[6] = new DataGridViewComboBoxCell();    ВОТ ТАК РУГАЕТСЯ УЖЕ ПРИ рисовании формы.
               

               if (tableName == "order_ordesrs")
               {
                   AddComboboxSelectionForState(dataGrid);
               }


В итоге получается таблица dataGrid. Но в этой dataGrid  для 6ой колонки надо сделать все ячейки как  combobox чтобы потом можно было выбирать параметр и отправлять его в базу для редактрования.

Возможно из-за того, что уже идет привязка к dataSource, у меня не поулчается поменять тип ячейки на combobox. 
как это сделать???? мануалы читал, но не помогло. Создавать руками для каждого запроса колонки и потом их заполнять считаю нерациональным, когда надо поменять только 1 параметр.

Автор: v_enom 29.3.2009, 18:19
и еще один вопрос:
как предать в обработчик событий параметры???

вот событие:
Код

 tabControl1.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tabControl1_Selecting);

private void tabControl1_Selecting(object sender)
        {            
          
            FormEditorMenu(dataGrid, this.splitContainer1);    // надо чтобы тут можно было обрабатывать dataGrid
        }

Автор: Partizan 29.3.2009, 18:39
v_enomМодератор: Пожалуйста, один топик - один вопрос.

Автор: -Mikle- 29.3.2009, 18:52
В дизайнере создайте колонку с нужным вам типом (ComboBox) и задайте привязку этой колонки к соответствующему полю БД

Автор: v_enom 29.3.2009, 19:00
Цитата(-Mikle- @  29.3.2009,  18:52 Найти цитируемый пост)
В дизайнере создайте колонку с нужным вам типом (ComboBox) и задайте привязку этой колонки к соответствующему полю БД 


Я не использую дизайнер. Страницы генерируются динамически. Как делать привязку? что вы имеете ввиду?  smile 

Автор: -Mikle- 29.3.2009, 19:47
Код

            DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
            // для заполнения раскрывающегося списка ComboBox 
            // значениями из БД используйте эти свойства:
            //    column.DataSource
            //    column.DisplayMember
            //    column.ValueMember
            // или вручную
            //    column.Items.Add(...)
            // для привязки ComboBox к данным DataGridView, используйте
            //    column.DataPropertyName
            dataGridView1.Columns.Add(column);


Попробуйте...

Автор: v_enom 29.3.2009, 21:36
-Mikle-, спасибо, но немного не то, что надо мне.....
я могу добавить колонку с комбобоксами, но это не то,что мне надо!!!! мне надо заменить уже существующую колонку где сейчас текстбокс на комбобокс + получить данные в эти комбобоксы из 2ой таблицы. Как это сделать?!!!

* заменить в dataGrid  конкретную колонку на колонку с комбобоксами (данные из dataTable)
* для нее сделать источник данных, чтобы выпадающий список выдавал результат  запроса (данные из dataTable2) к таблице 
* Как получить доступ к параметрам конкретного столбца из выборки dataTable 
* как присвоить значения по-умолчанию для недавно созданных кобобоксов в dataGrid 



Ну неужели я спрашиваю столь редкую операцию, что ли ни кто не может внятно с примером ответить????????????????????!!!!!!!!!!!!!!!!!  smile 


Еще раз: Надо  отдельный столбец таблицы dataGrid, получающей значения из источника  dataTable заполнить значениями из другой таблицы базы дынных, лежащей например в dataTable2


PS вот этот http://www.rsdn.ru/article/dotnet/DataGridView20.xml даже не рекомендуйте. фигня фигней. Примеры все "детские" и не из той оперы.

Автор: -Mikle- 30.3.2009, 14:58
Ну вот смотри:
Тебе надо чтобы после установки DataSource заменялся тип колонки. Верно?

Ниже я заменяю тип колонки col2 на тип ComboBox'а
Код

        private void button1_Click(object sender, EventArgs e)
        {
            // this.GetDataTable() - метод возвращает тестовые данные, он есть ниже
            dataGridView1.DataSource = this.GetDataTable();

            // запомним индекс удаляемой колонки (col2)
            int oldColIndex = dataGridView1.Columns["col2"].Index;
            // удаляем колонка col2
            dataGridView1.Columns.RemoveAt(oldColIndex);

            // вставим новую колонку (см.ниже метод this.GetCol2_DataGridViewColumn)
            dataGridView1.Columns.Insert(oldColIndex, this.GetCol2_DataGridViewColumn());
        }

        DataGridViewColumn GetCol2_DataGridViewColumn()
        {
            DataGridViewComboBoxColumn comboColumn = new DataGridViewComboBoxColumn();
            // this.GetCol2Table() - возвращает второй источник данных для ComboBox (см. ниже)
            comboColumn.DataSource = this.GetCol2Table();
            comboColumn.DataPropertyName = "col2";
            comboColumn.DisplayMember = "col2Display";
            comboColumn.ValueMember = "col2Value";
            return comboColumn;
        }

        // ниже, методы чисто для тестов (для примера)
        DataTable GetDataTable()
        {
            DataTable table = new DataTable();
            table.Columns.Add("col1", typeof(int));
            table.Columns.Add("col2", typeof(int));
            table.Columns.Add("col3", typeof(int));
            table.Rows.Add(1, 2, 3);
            table.Rows.Add(4, 5, 6);
            table.Rows.Add(7, 8, 9);
            return table;
        }

        DataTable GetCol2Table()
        {
            DataTable table = new DataTable();
            table.Columns.Add("col2Value", typeof(int));
            table.Columns.Add("col2Display", typeof(string));
            table.Rows.Add(0, "Zero");
            table.Rows.Add(1, "One");
            table.Rows.Add(2, "Two");
            table.Rows.Add(3, "Three");
            table.Rows.Add(4, "Four");
            table.Rows.Add(5, "Five");
            table.Rows.Add(6, "Six");
            table.Rows.Add(7, "Seven");
            table.Rows.Add(8, "Eight");
            table.Rows.Add(9, "Nine");
            return table;
        }


Только вот не понимаю зачеме тебе нужно именно заменить колонку, не лучше ли просто заранее ее создать таким образом:
Код

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Columns.Add(this.GetCol2_DataGridViewColumn());
            dataGridView1.DataSource = this.GetDataTable();
        }


А еще, лучше использовать Relations для связки родительских таблиц и дочерних... Впрочем, смотри сам...

Надеюсь, это помогло?

Автор: v_enom 30.3.2009, 21:43
Цитата(-Mikle- @  30.3.2009,  14:58 Найти цитируемый пост)
А еще, лучше использовать Relations для связки родительских таблиц и дочерних... Впрочем, смотри сам...


Возможно и проще. Это набор функций специальных или что? где про релейшенс почитать? Ведь по сути у меня действительно связаны 2 таблицы.

А заменить мне надо колонку потому что у меня результат выборки - имя одного статуса. А мне надо в этом поле весь список статусов...чтобы поменять было можно.


Автор: -Mikle- 30.3.2009, 22:39
Ну про замену я написал, надеюсь вы хотя бы попробовали код...
А про релэйшнс полно инфы, не так уж это и сложно...

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