DataGrid-ComboBox

[Poner una ComboBox en un DataGrid]

Fecha: 5 de Septiembre a las 2  (22/Sep/2003)
Autor: Fernando "NewHang" Rodriguez NewHang@menta.net


Espero que el guille no se enfade con tanta colaboracion...

Pues esto, ya veis para lo que es, Porque me lo ha preguntado una persona y nada, pos la solución está aquí, porque yo también la he buscado por ahí y no la he encontrado (como siempre, habrá una más fácil, pero bueno)

Aqui esta el código:

 

Private Sub DG_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles DG.CurrentCellChanged
        If Combo.Visible = True Then Combo.Visible = False
        If DG.CurrentCell.ColumnNumber <> 2 Then Exit Sub
        Dim CeldaAlto As Integer = DG.GetCellBounds(DG.CurrentCell.RowNumber, DG.CurrentCell.ColumnNumber).Height
        Dim CeldaAncho As Integer = DG.GetCellBounds(DG.CurrentCell.RowNumber, DG.CurrentCell.ColumnNumber).Width
        Dim PosicionX As Integer = DG.GetCellBounds(DG.CurrentCell.RowNumber, DG.CurrentCell.ColumnNumber).X + DG.Left
        Dim PosicionY As Integer = DG.GetCellBounds(DG.CurrentCell.RowNumber, DG.CurrentCell.ColumnNumber).Y + DG.Top
        Combo.Left = PosicionX
        Combo.Top = PosicionY
        Combo.Height = CeldaAlto
        Combo.Width = CeldaAncho
        Combo.Visible = True
        Combo.DroppedDown = True
End Sub
Private Sub Combo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Combo.SelectedIndexChanged
        DG.Text = Combo.Text
        Combo.Visible = False
End Sub

Para que este código funcione, en el formulario ha de haber un DataGrid (si no estuviera, dónde pondríamos la comboBox???) y una ComboBox (si no que pondríamos???) En este caso en particular yo he llamdo al DataGrid con el nombre DG y a la ComboBox, Combo (original...) Como veis, hace uso del método GetCellBounds para obtener el alto y el ancho de una celda, pero como estamos interesados en la celda seleccionada, utilizamos las propiedades DataGrid.CurrentCell.RowNumber y DataGrid.CurrentCell.ColumNumber para especificarle al método GetCellBounds a que celda nos estamos refiriendo.

 

Otra cosa a tener en cuenta es que el métedo GetCellBounds nos da todos los datos relativos al rectángulo que forma la celda en referencia al DataGrid. Así, la propiedad Height y Width nos da la altura y anchura de la celda, y las propiedades X e Y nos dan la posicion de la celda en referencia a los bordes del DataGrid. Esto hay que tenerlo en cuenta a la hora de situar la Combo donde nos interesa, porque la situación de la Combo se refiere a los bordes del formulario... Así, las propiedades Top y Left de la la ComboBox tendran los mismos valores que las propiedades Top y Left del DataGrid, para luego sumarle los valores de posicion de la celda en referencia al DataGrid.

 

Por ultimo, decir que para colocar la combo hay que colocar el codigo en el evento CurrentCellChanged para que cada vez que cambiamos de celda, la posicion de la ComboBox cambie. Si os fijais, la segunda linea pone:

If DG.CurrentCell.ColumnNumber <> 2 Then Exit Sub

 

Esto sirve para mostrar solo la ComboBox en aquelllas columnas que nosotros queramos.
Asi, en este caso si la celda seleccionada no pertenece a la columna 2 sale del procedimiento y no muestra la combo.

 

Espero que os sirva de ayuda.

 

Fernando


ir al índice