Datagridviewcomboboxcolumn Добавление различных элементов к каждой строке -- c# поле с участием winforms поле с участием datagridview пол Связанный проблема

DataGridViewComboBoxColumn adding different items to each row


14
vote

проблема

русский

Я создаю таблицу, используя datagridview, где пользователь может выбрать элементы из раскрывающегося списка в каждой ячейке. Чтобы упростить проблему, давайте скажем, у меня есть 1 столбец. Я использую datagridviewcomboboxcolumn в дизайнере. Я пытаюсь поддержать каждый ряд в этой колонке иметь другой список элементов на выбор.

Это возможно?

Английский оригинал

I am building a table using the DataGridView where a user can select items from a dropdown in each cell. To simplify the problem, lets say i have 1 column. I am using the DataGridViewComboBoxColumn in the designer. I am trying to support having each row in that column have a different list of items to choose from.

Is this possible?

</div
        

Список ответов

19
 
vote
vote
Лучший ответ
 

Да. Это можно сделать с помощью DataGridViewComboboxcell.

Вот пример способа добавления элементов на одну ячейку, а не весь столбец.

 <код> private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, object[] itemsToAdd) {     DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell) dataGrid.Rows[rowIndex].Cells[colIndex];     // You might pass a boolean to determine whether to clear or not.     dgvcbc.Items.Clear();     foreach (object itemToAdd in itemsToAdd)     {         dgvcbc.Items.Add(itemToAdd);     } }   
 

Yes. This can be done using the DataGridViewComboBoxCell.

Here is an example method to add the items to just one cell, rather than the whole column.

private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, object[] itemsToAdd) {     DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell) dataGrid.Rows[rowIndex].Cells[colIndex];     // You might pass a boolean to determine whether to clear or not.     dgvcbc.Items.Clear();     foreach (object itemToAdd in itemsToAdd)     {         dgvcbc.Items.Add(itemToAdd);     } } 
</div
 
 
 
 
3
 
vote
 <код> InputStream0  
 
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {     if (e.ColumnIndex == DataGridViewComboBoxColumnNumber)     {         setCellComboBoxItems(myDataGridView, e.RowIndex, e.ColumnIndex, someObj);     } } 
</div
 
 
1
 
vote

На всякий случай, если кто-нибудь находит эту тему, это мое решение в VB 2008. Преимущество этих предложений заключается в том, что он позволяет назначить удостоверение личности каждому значению в Combobox.

 <код> InputStream1  
 

Just in case anyone finds this thread, this is my solution in VB 2008. The advantage this offers is that it allows you to assign an ID to each value in the combobox.

  Private Sub FillGroups()     Try         'Create Connection and SQLCommand here.          Conn.Open()         Dim dr As SqlDataReader = cm.ExecuteReader          dgvGroups.Rows.Clear()          Dim PreviousGroup As String = ""          Dim l As New List(Of Groups)          While dr.Read              Dim g As New Groups             g.RegionID = CheckInt(dr("cg_id"))             g.RegionName = CheckString(dr("cg_name"))             g.GroupID = CheckInt(dr("vg_id"))             g.GroupName = CheckString(dr("vg_name"))             l.Add(g)          End While         dr.Close()         Conn.Close()          For Each a In (From r In l Select r.RegionName, r.RegionID).Distinct              Dim RegionID As Integer = a.RegionID 'Doing it this way avoids a warning              dgvGroups.Rows.Add(New Object() {a.RegionID, a.RegionName})              Dim c As DataGridViewComboBoxCell = CType(dgvGroups.Rows(dgvGroups.RowCount - 1).Cells(colGroup.Index), DataGridViewComboBoxCell)             c.DataSource = (From g In l Where g.RegionID = RegionID Select g.GroupID, g.GroupName).ToArray             c.DisplayMember = "GroupName"             c.ValueMember = "GroupID"         Next      Catch ex As Exception     End Try End Sub  Private Class Groups      Private _RegionID As Integer     Public Property RegionID() As Integer         Get             Return _RegionID         End Get         Set(ByVal value As Integer)             _RegionID = value         End Set     End Property      Private _RegionName As String     Public Property RegionName() As String         Get             Return _RegionName         End Get         Set(ByVal value As String)             _RegionName = value         End Set     End Property      Private _GroupName As String     Public Property GroupName() As String         Get             Return _GroupName         End Get         Set(ByVal value As String)             _GroupName = value         End Set     End Property      Private _GroupID As Integer     Public Property GroupID() As Integer         Get                         Return _GroupID         End Get         Set(ByVal value As Integer)             _GroupID = value         End Set     End Property  End Class 
</div
 
 
0
 
vote

Это пример с GridView, который имеет 2 ComboboxColumns, и когда выбранный индекс ComboboxColumns1 изменился, затем загрузите ComboboxColumns2 с данными из двух разных столбцов из базы данных.

 <код> InputStream2  
 

this is an example with gridView which have 2 comboboxColumns and when a comboBoxColumns1 selected index changed then load comboBoxColumns2 with data from from two different columns from database .

 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)         {               if (dataGridView1.Rows[e.RowIndex].Cells[0].Value != null && dataGridView1.CurrentCell.ColumnIndex == 0)             {                  SqlConnection conn = new SqlConnection("data source=.;initial catalog=pharmacy;integrated security=true");                 SqlCommand cmd = new SqlCommand("select [drugTypeParent],[drugTypeChild] from [drugs] where [drugName]='" + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString() + "'", conn);                 conn.Open();                 SqlDataReader dr = cmd.ExecuteReader();                 while (dr.Read())                 {                      object[] o = new object[] { dr[0].ToString(),dr[1].ToString() };                     DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1];                      dgvcbc.Items.Clear();                     foreach (object itemToAdd in o)                     {                         dgvcbc.Items.Add(itemToAdd);                     }                 }                 dr.Close();                 conn.Close();                }             } 
</div
 
 
0
 
vote

Установка ComboboxCell Сразу после настройки DataSource не работает для меня . Это должно быть сделано после завершения операций связывания. Я выбрал CellbegegedItit

Пример пустых раскрывающихся списка:

 <код> InputStream3  

Рабочий пример:

 <код> InputStream4  
 

setting the comboboxcell right after setting datasource doesnt work for me. it has to be done after binding operations completed. i choosed CellBeginEdit

example of empty dropdowns:

dgv1.datasource = datatable1; dgv1.columns.add ( "cbxcol"  , typeof(string) );  //  different source for each comboboxcell in rows var dict_rowInd_cbxDs = new Dictionary<int, object>(); dict_rowInd_cbxDs[1] = new list<string>(){"en" , "us"}; dict_rowInd_cbxDs[2] = new list<string>(){ "car", "bike"};  // !!!!!! setting comboboxcell after creating doesnt work here foreach( row in dgv.Rows.asEnumerable() ) {     var cell = res_tn.dgv.CurrentCell as DataGridViewComboBoxCell;    cell.DataSource = dict_dgvRowI_cbxDs[res_tn.dgv.CurrentCell.RowIndex];  } 

working example:

dgv1.datasource = datatable1; dgv1.columns.add ( "cbxcol"  , typeof(string) );  //  different source for each comboboxcell in rows var dict_rowInd_cbxDs = new Dictionary<int, object>(); dict_rowInd_cbxDs[1] = new list<string>(){"en" , "us"}; dict_rowInd_cbxDs[2] = new list<string>(){ "car", "bike"};   // cmboboxcell datasource Assingment Must be done after  BindingComplete (not tested )  or cellbeginEdit  (tested by me)     res_tn.dgv.CellBeginEdit += (s1, e1) => {     if (res_tn.dgv.CurrentCell is DataGridViewComboBoxCell) {         if (dict_dgvRowI_cbxDs.ContainsKey(res_tn.dgv.CurrentCell.RowIndex))          {             var cll = res_tn.dgv.CurrentCell as DataGridViewComboBoxCell;             cll.DataSource = dict_dgvRowI_cbxDs[res_tn.dgv.CurrentCell.RowIndex];             // required if it is  list<mycustomClass>            // cll.DisplayMember = "ColName";            // cll.ValueMember = "This";         }     }  }; 
</div
 
 
-1
 
vote
 <код> InputStream5  
 
    //Populate the Datatable with the Lookup lists     private DataTable typeDataTable(DataGridView dataGridView, Lookup<string, Element> type_Lookup, Dictionary<Element, string> type_dictionary, string strNewStyle, string strOldStyle, string strID, string strCount)     {         int row = 0;          DataTable dt = new DataTable();          dt.Columns.Add(strOldStyle, typeof(string));         dt.Columns.Add(strID, typeof(string));         dt.Columns.Add(strCount, typeof(int));         dt.Columns.Add("combobox", typeof(DataGridViewComboBoxCell));            //Add All Doc Types to ComboBoxes         DataGridViewComboBoxCell CmBx = new DataGridViewComboBoxCell();         CmBx.DataSource = new BindingSource(type_dictionary, null);         CmBx.DisplayMember = "Value";         CmBx.ValueMember = "Key";           //Add Style Comboboxes         DataGridViewComboBoxColumn Data_CmBx_Col = new DataGridViewComboBoxColumn();         Data_CmBx_Col.HeaderText = strNewStyle;         dataGridView.Columns.Add(addDataGrdViewComboBox(Data_CmBx_Col, type_dictionary));          setCellComboBoxItems(dataGridView, 1, 3, CmBx);          //Add style Rows         foreach (IGrouping<string, Element> StyleGroup in type_Lookup)         {             row++;             //Iterate through each group in the Igrouping             //Add Style Rows             dt.Rows.Add(StyleGroup.Key, row, StyleGroup.Count().ToString());           }         return dt;     }         private void setCellComboBoxItems(DataGridView dataGrid, int rowIndex, int colIndex, DataGridViewComboBoxCell CmBx)     {         DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)dataGrid.Rows[rowIndex].Cells[colIndex];         // You might pass a boolean to determine whether to clear or not.         dgvcbc.Items.Clear();         foreach (DataGridViewComboBoxCell itemToAdd in CmBx.Items)         {             dgvcbc.Items.Add(itemToAdd);         } 
</div
 
 
 
 

Связанный проблема

0  Обновление данных с той же первичным ключом  ( Updating data with same primary key ) 
Я читаю данные из файла CSV и добавление данных в базу данных. Во время вставки данных в базу данных я хочу обновить данные с той же первичной клавишей. e.g...

0  Каркас экспорта данных или инструменты  ( Data export framework or tools ) 
Есть ли какие-либо данные экспорта данных в .NET или что-то. Мне нужно устройство набора инструментов для экспорта наследие и данных из более старых / устарев...

8  Почему я не могу удалить это cookie?  ( Why cant i delete this cookie ) 
Хорошо, вот 411 - у меня есть следующий обработчик событий в моем файле Global.Asax.cs: <код> private void Global_PostRequestHandlerExecute(object sender, E...

1  Как получить доступ к конкретной группе в CollectionSourceSource.View.Groups  ( How to access a specific group within collectionviewsource view groups ) 
У меня есть .NET Имя Свойство. Я хотел бы знать, есть ли способ выбрать определенную подгруппу на достаточно высоком уровне без необходимости оценивать н...

0  C # Исключение, где емкость ниже, чем количество  ( C sharp exception where capacity is lower than count ) 
Я ударю исключение со списком в C #, когда добавляю элемент в списке. Я не могу видеть ничего конкретного там. <Код> tempList.ForEach(tempDis => alloc.ListD...

0  WCF Post Method Получить ошибку 400 плохой запрос  ( Wcf post method get error 400 bad request ) 
Я использую метод WCF Post, как только я добавил PARAMETER POST на службу, его ошибка возврата 400 плохой запрос, если я оставил параметр пустой, он может пол...

0  Причина определенных ограничений на преобразования дисперсии в C #  ( Reason for certain restrictions on variance conversions in c sharp ) 
У меня есть несколько вопросов о том, как неявные преобразования между методом делегатов в отношении ковариации и контравариации реализуются в C #. <код> de...

1  WCF Callback Doblocks даже с «iSineynchronInationContext = False»  ( Wcf callback deadlocks even with usesynchronizationcontext false ) 
Я застрял с проблемой, которую я не могу понять. Проблема связана с синхронизацией между потоками на стороне клиента, но я не могу найти корневую причину эт...

1  EntityFramework 5 CodeFirst Rice родитель одного типа не обновляет / сохранение  ( Entityframework 5 codefirst child parent of the same type not updating saving ) 
У меня есть <код> class называется раздел <код> public class Section { public Section() { construct(0); } public Section(int order) { construct(ord...

105  Почему C # реализует методы как не виртуальные по умолчанию?  ( Why c sharp implements methods as non virtual by default ) 
В отличие от Java, почему C # методы лечения как не виртуальные функции по умолчанию? Скорее всего, это проблема производительности, а не на других возможных ...

9  DataTable не выпускает память  ( Datatable does not release memory ) 
У меня есть процесс загрузки данных, который загружает большую сумму данных в DataTable, затем выполняет некоторые данные, но каждый раз, когда задание заверш...

-1  Какой поток Nibernate Pure? [закрыто]  ( What is the flow of nhibernate pure ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос должен быть больше Фокусированный . В настоя...

5  Объект к сопоставлению объекта  ( Object to object mapping utility ) 
Мне нравится чисто разделить публику и домен объекты (Итак, nhibernate не поможет здесь) друг от друга, которые заставляют меня писать много кода, чтобы ото...

0  Получить объект атрибута из inamedtypesymbol.getttributes () I.e. Объект Attribradate?  ( Get attribute object from inamedtypesymbol getattributes i e attributedata ob ) 
Я определил следующий атрибут <код> [AttributeUsage(AttributeTargets.Class)] class DemoAttribute : Attribute { public string SomeInfo { get; } public D...

0  Ресурс кастинга COSMOS БД в интерфейс  ( Cosmos db casting resource to interface ) 
Если я хочу вернуть объект на основе интерфейса в Cosmodb, как бы я это сделал? Мой интерфейс: <код> namespace Test { public interface IPerson { ...