2008-09-18 24 views
12

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.DataGridViewComboBoxColumn agregando diferentes elementos a cada fila.

¿Esto es posible?

Respuesta

16

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

Este código funcionó muy bien para un proyecto que estoy trabajando actualmente. –

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

Por si acaso alguien encuentra este hilo, este es mi solución en VB 2008. La ventaja que esto ofrece es que permite asignar un 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 
0

Este es un ejemplo con GridView que tienen 2 comboboxColumns y cuando un índice de comboBoxColumns1 seleccionado cambió después cargue comboBoxColumns2 con datos de a partir 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(); 
       } 
      } 
-1
//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); 
     } 
+1

Le recomendaría que brinde una explicación para su muestra de código. – Wtower

Cuestiones relacionadas