Colabora
 

Columnas ComboBox en el DatagridView

Haciendo uso de la Columnas del dataGridview tipo ComboBox

 

Fecha: 29/Ene/2007 (28-01-07)
Autor: Erik Dueñas - erikorn83@hotmail.com

 


Introducción

Tiempo 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 problema

Un 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
System.Data

 


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: eduenas_datagridview_combobox_VB2005.zip - 111 KB

(MD5 checksum: F4DB1FECEA29BA0BA4E2AE63DE63AAF7)

 


Ir al índice principal de el 
Guille