recorrer llenar datagridviewcomboboxcolumn c# winforms datagridview

c# - llenar - DataGridViewComboBoxColumn agregando diferentes elementos a cada fila.



llenar datagridviewcomboboxcolumn c# (5)

Estoy construyendo una tabla usando DataGridView donde un usuario puede seleccionar elementos de un menú desplegable en cada celda. Para simplificar el problema, digamos que tengo 1 columna. Estoy usando DataGridViewComboBoxColumn en el diseñador. Estoy tratando de admitir que cada fila en esa columna tenga una lista diferente de elementos para elegir.

es posible?


Sí. Esto se puede hacer usando DataGridViewComboBoxCell.

Aquí hay un método de ejemplo para agregar los elementos a una sola celda, en lugar de a la columna completa.

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); } }


private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == DataGridViewComboBoxColumnNumber) { setCellComboBoxItems(myDataGridView, e.RowIndex, e.ColumnIndex, someObj); } }


En caso de que alguien encuentre este hilo, esta es mi solución en VB 2008. La ventaja que esto ofrece es que le permite asignar una ID a cada valor en el cuadro combinado.

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


este es un ejemplo con gridView que tiene 2 comboboxColumns y cuando un índice seleccionado comboBoxColumns1 cambió, luego carga comboBoxColumns2 con datos de dos columnas diferentes de la base de datos.

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(); } }


//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); }