DataGrid-ComboBox

[Poner una ComboBox en un DataGrid]

Fecha: 5 de Septiembre a las 2  (22/Sep/2003)
Autor: Fernando "NewHang" Rodriguez [email protected]


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