Colabora |
Columnas ComboBox en el DatagridViewHaciendo uso de la Columnas del dataGridview tipo ComboBox
Fecha: 29/Ene/2007 (28-01-07)
|
IntroducciónTiempo atras, un gran dolor de cabeza para muchos desarrolladores era el incluir estilos en el DataGrid. Hoy en dia con la aparicion del DatagridView muchas de estas dificultades han desaparecido...pero a su vez aparecen muchos pequeños desafios que a veces por falta de exploracion, nos hacen retornar a nuestros antiguos y tediosos codigos. En esta oportunidad les presento una aplicacion en donde haremos uso del DataGridView y algunas _de sus posibles combinaciones con ComboBoxes(Columnas,Dependencia,etc)
El enunciado del problemaUn agente necesita realizar una serie de viajes a diferentes lugares del mundo. Para esto el necesita_ conocer la cantidad de dinero que necesita juntar para empezar dicha travesia. Lo que el desea es _ tener una aplicacion que al seleccionar un Pais mediante un ComboBox, filtre la columna de Ciudades_ de un DataGridView y que a su vez Filtre la columna de Localidad en funcion de la Ciudad seleccionada_ en el DataGridView.Una vez realizadas estas acciones se mostrara el precio que cuesta llegar a esa _ localidad.
El código:A continuación sigue código en Visual Basic .Net 2005: Imports System.Data.SqlClient Imports System.Data Public Class Form1 'Conectandonos a la base de datos Dim cn As New SqlConnection("user=sa;pwd=;database=Paises;server=(local)") Public Sub Estilos_Grilla() 'Aqui se dan los estilos a la Grilla 'Este es una columna de ComboBoxes Dim CboCiudadesColumn As New DataGridViewComboBoxColumn CboCiudadesColumn.Name = "Ciudad" Me.DGV_Detalle.Columns.Add(CboCiudadesColumn) Dim CboLocalidadesColumn As New DataGridViewComboBoxColumn CboLocalidadesColumn.Name = "Distrito" Me.DGV_Detalle.Columns.Add(CboLocalidadesColumn) 'Este es una columna de texBoxes Dim TxtPrecioColumn As New DataGridViewTextBoxColumn TxtPrecioColumn.Name = "Precio" Me.DGV_Detalle.Columns.Add(TxtPrecioColumn) End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System _ .EventArgs) Handles MyBase.Load ' Al iniciar el formulario abrimos la conexion y pasamos ' la consulta al primer combobox Dim objda As New SqlDataAdapter("select * from Pais", cn) Dim objds As New DataSet() 'Pasamos las columnas que deseamos al dataset objda.Fill(objds, "IdPais") objda.Fill(objds, "Nombre") 'Finalmente pasamos al comboBox, hasta aqui nada del otro mundo Me.cbo_Paises.DataSource = objds.Tables(0).DefaultView Me.cbo_Paises.DisplayMember = "Nombre" Me.cbo_Paises.ValueMember = "IdPais" End Sub Public Sub New() ' Llamada necesaria para el Diseñador de Windows Forms. InitializeComponent() 'Inicializa el estilo de las columnas de la grilla Estilos_Grilla() ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). End Sub Private Sub cbo_Paises_SelectedIndexChanged(ByVal sender As Object, ByVal _ e As System.EventArgs) Handles cbo_Paises.SelectedIndexChanged Dim my_IdPais As String Dim my_strsql As String Dim my_DGVCboColumn As New DataGridViewComboBoxColumn Dim c_objds As New DataSet() 'Cuando seleccionamos un pais generamos la consulta 'para poder obtener las ciudades de un determinado pais my_IdPais = Me.cbo_Paises.SelectedValue.ToString my_strsql = "select * from Ciudad where IdPais='" & my_IdPais.ToString & "'" Dim objda As New SqlDataAdapter(my_strsql, cn) 'De la misma forma pasamos la consulta al dataset objda.Fill(c_objds, "IdCiudad") objda.Fill(c_objds, "Nombre") 'Ahora esta consulta la pasamos a un DataGridViewComboBoxColumn my_DGVCboColumn.DataSource = c_objds.Tables(0).DefaultView my_DGVCboColumn.Name = "Ciudad" my_DGVCboColumn.DisplayMember = "Nombre" my_DGVCboColumn.ValueMember = "IdCiudad" 'Finalmente removemos la columna actual de ciudades y 'la reemplazamos por la nueva Me.DGV_Detalle.Columns.RemoveAt(0) Me.DGV_Detalle.Columns.Insert(0, my_DGVCboColumn) End Sub Private Sub DGV_Detalle_CellValueChanged(ByVal sender As Object, ByVal e _ As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV_Detalle. _ CellValueChanged Dim my_IdPais As String Dim my_strsql As String Dim r As Integer Dim c As Integer Dim dgrow As New DataGridViewComboBoxCell Dim d_objds As New DataSet() Dim pr_objds As New DataSet() Dim my_DGVColumn As New DataGridViewColumn Dim my_DGVCboColumn As New DataGridViewComboBoxColumn r = e.RowIndex c = e.ColumnIndex ' my_IdPais = Me.cbo_Paises.SelectedValue.ToString Try ' Solo por este ejemplo inhabilito del combobox al seleccionar el datagrid. ' Esto ya queda a la imaginacion de cada persona..por ejemplo se pueden lim_ ' todos los datos del grid ,pero esto ya queda fuera del articulo Me.cbo_Paises.Enabled = False Catch ex As Exception End Try Select Case c Case 0 'Una vez que seleccionamos la columna de Ciudad , generamos una consulta 'para determinar que distritos pertenecen a ella my_strsql = "select * from Distrito where IdPais='" & my_IdPais.ToString _ & "' and IdCiudad='" & Me.DGV_Detalle.Item("Ciudad", r).Value & "'" Dim objda As New SqlDataAdapter(my_strsql, cn) objda.Fill(d_objds, "IdDistrito") objda.Fill(d_objds, "Nombre") 'Finalmente gracias al datagridViewComboBoxCell almacenamos esta 'consulta como si fuese en un comboBox Normal dgrow.DataSource = d_objds.Tables(0).DefaultView dgrow.DisplayMember = "Nombre" dgrow.ValueMember = "IdDistrito" Try 'Aqui viene lo bueno: Tanto como la celda de la columna Distrito y el 'dgrow son practicamente comboBoxes... entonces podemos pasarle los 'datos del uno al otro. Me.DGV_Detalle.Item("Distrito", Me.DGV_Detalle.CurrentCell.RowIndex) _ = dgrow Catch ex As Exception MessageBox.Show("Aqui un error: " & ex.ToString) End Try Case 1 'Finalmente como algo extra al seleccionar el distrito realizao una 'consulta para obtenr el precio depasaje my_strsql = "select * from Distrito where IdPais='" & my_IdPais.ToString _ & "' and IdCiudad='" & Me.DGV_Detalle.Item("Ciudad", r).Value & _ "' and IdDistrito='" & Me.DGV_Detalle.Item("Distrito", r).Value & "'" Dim objda As New SqlDataAdapter(my_strsql, cn) objda.Fill(pr_objds, "Pasaje") 'Aqui le paso el valor al DataGridView Me.DGV_Detalle.Item("Precio", r).Value = pr_objds.Tables(0).Rows(0). _ Item("Pasaje") End Select End Sub End Class
Espacios de nombres usados en el código de este artículo:
System.Data.SqlClient
|
Código de ejemplo (comprimido): |
Fichero con el código de ejemplo:
eduenas_datagridview_combobox_VB2005.zip - 111 KB
|