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 SubPara 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