none
Cargar Datagridviewcombocell con valores estáticos RRS feed

  • Pregunta

  • Hola, necesito cargar un combobox en un DataGridView con valores estaticos que no provienen de un origen de datos, se visualiza correctamente, pero al momento de grabar o actualizar me muestra el siguiente error:

    ¡El valor de Datagridviewcombocell no es válido!

    Si cargo los valores desde un dataset, funciona perfectamente.

    Este es el código

    Dim column As DataGridViewComboBoxColumn = DirectCast(DataGridView1.Columns(0), DataGridViewComboBoxColumn)

     

                Dim alItems As ArrayList = New ArrayList()

                alItems.Add(New cValue("EFECTIVO", 1))

                alItems.Add(New cValue("CREDITO", 2))

                alItems.Add(New cValue("DEBITO", 3))

                With column

                    .DataSource = alItems

                    .DisplayMember = "Display"

                    .ValueMember = "Value"

                End With

     

     

     With DataGridView1

                    .Columns(0).DataPropertyName = "TIPO" 'esta es el campo de la tabla

                End With

     

    cvalue es una clase para almacenar en variables los datos correspondientes.

    Gracias.

    • Cambiado Enrique M. Montejo martes, 17 de julio de 2012 15:06 Controles de Windows Forms (De:Lenguaje VB.NET)
    domingo, 4 de septiembre de 2011 22:16

Todas las respuestas

  • cuando defines "cValue" esto que seria ? es una clase que tu has definido ?

    - has validado que en campo "tipo" del datatble que asignas al datasource del grid contien valores del con 1, 2 y 3 ?

    - podrias poner un breakpoint donde cargas el datatable he inspeccionar usando DataSet Visualizer, con este podrias inspeccionar el datatable que asignas al grid para ver si la info del campo es la que espera el combo

     

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 4 de septiembre de 2011 22:27
  • Leandro, cvalue es una clase definida por mi. Los valores se encuentran. Para darte una pista más, cuando grabo, en lugar de seguir visualizandose en pantalla el texto, se carga en el combobox el id correspondiente. Voy a probar el Dataset Visualizer.
    domingo, 4 de septiembre de 2011 22:38
  • Leandro, he intentado las técnicas que me has sugerido, y los datos están correctos, si deshabilito la asignación del campo de la tabla al combobox, puedo observar que el displaymember esta correcto, si cargo el mismo se reemplaza por el campo del origen de datos y en ese momento muestra el error, si hago foco en el combobox el error se muestra infinitamente y la aplicación termina por colgarse.

    Public Class Form19
        Dim DataSet As New DataSet
        Dim DataSet2 As New DataSet
        Dim Adaptador As New SqlDataAdapter()
        Dim comando As New SqlCommand
        Private Sub Form9_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            MonthCalendar1.SelectionRange.Start = Today.Date
            dvMaestro.AutoGenerateColumns = False
            dvDetalle.AutoGenerateColumns = False
            Adaptador = New SqlDataAdapter("SELECT COD_EMPLEADO, NOMBRE_USUARIO FROM EMPLEADOS", CN)

            Dim column As DataGridViewComboBoxColumn = DirectCast(dvMaestro.Columns(2), DataGridViewComboBoxColumn)
            Dim dt As New DataTable()
            Adaptador.Fill(dt)

            With column
                .DataSource = dt
                .DisplayMember = "NOMBRE_USUARIO"
                .ValueMember = "COD_EMPLEADO"
            End With

            Dim Tipos As New ArrayList()
            Tipos.Add(New FORMAS(1, "EFECTIVO"))
            Tipos.Add(New FORMAS(2, "T/CRÉDITO"))
            Tipos.Add(New FORMAS(3, "T/DÉBITO"))
            Tipos.Add(New FORMAS(4, "DESC. PUNTOS"))

            column = DirectCast(dvDetalle.Columns(7), DataGridViewComboBoxColumn)
            With column
                .DataSource = Tipos
                .DisplayMember = "str_FORMA"
                .ValueMember = "str_COD_FORMA"
            End With

            With dvMaestro
                .Columns(0).DataPropertyName = "COD_VENTA"
                .Columns(1).DataPropertyName = "COD_CLIENTE"
                .Columns(2).DataPropertyName = "COD_EMPLEADO"
                .Columns(3).DataPropertyName = "FECHA"
                .Columns(4).DataPropertyName = "EDITAR"
                .Columns(5).DataPropertyName = "SUPERVISAR"
            End With

            With dvDetalle
                .Columns(0).DataPropertyName = "COD_DETALLE"
                .Columns(1).DataPropertyName = "COD_VENTA"
                .Columns(2).DataPropertyName = "COD_PRODUCTO"
                .Columns(3).DataPropertyName = "CANTIDAD"
                .Columns(4).DataPropertyName = "DESCUENTO"
                .Columns(5).DataPropertyName = "PRECIO"
                .Columns(6).DataPropertyName = "SUBTOTAL"
                .Columns(7).DataPropertyName = "FORMA" 'Si deshabilito esta línea puede verse que los datos en el combo se cargaron bien
            End With

        End Sub

        Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
            Try
                With comando
                    .CommandText = "SELECT COD_VENTA, COD_CLIENTE, COD_EMPLEADO, FECHA, EDITAR, SUPERVISOR FROM VENTAS WHERE CAST(DATEDIFF(DAY, 0, FECHA) AS DATETIME) ='" & Format(MonthCalendar1.SelectionRange.Start, "dd-MM-yyyy").ToString & "' ORDER BY FECHA"
                    .Connection = CN
                End With

                With Adaptador
                    .SelectCommand = comando
                    Adaptador.Fill(DataSet, "VENTAS")
                End With

                With dvMaestro
                    .DataMember = "VENTAS"
                    .DataSource = DataSet
                    .Refresh()
                End With

                'With CN
                'If .State = ConnectionState.Open Then
                '.Close()
                'End If
                '.Dispose()
                'End With

            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try
        End Sub

        Private Sub dvMaestro_RowEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dvMaestro.RowEnter
            With comando
                .CommandText = "SELECT * FROM DETALLE WHERE COD_VENTA =" & dvMaestro(0, e.RowIndex).Value
                .Connection = CN
            End With

            With Adaptador
                .SelectCommand = comando
                Adaptador.Fill(DataSet2, "DETALLE")
            End With

            With dvDetalle
                .DataMember = "DETALLE"
                .DataSource = DataSet2
                .Refresh()
            End With
        End Sub
    End Class
    Public Class FORMAS
        Private COD_FORMA As SByte
        Private FORMA As String

        Public Sub New(ByVal strcodigo As SByte, ByVal strforma As String)
            Me.COD_FORMA = strcodigo
            Me.FORMA = strforma
        End Sub

        Public ReadOnly Property str_COD_FORMA() As SByte
            Get
                Return COD_FORMA
            End Get
        End Property

        Public ReadOnly Property str_FORMA() As String
            Get
                Return FORMA
            End Get
        End Property

    End Class

    Si no puedo resolverlo estimo que crearé una tabla con los tipos, ya que en el maestro recupero los nombres de usuario desde la base y funciona perfectamente.

    Muchas gracias de antemano por la ayuda!!

     

    lunes, 5 de septiembre de 2011 12:15
  • Hola Enrique, intenté como me sugeriste (con byte, integer y short) y sigue visualizando el mismo error, la base de datos que utilizo es SQL Server Express 2005. El momento en que me muestra error, es cuando refresco el DataGridView Detalle mediante el siguiente código:

     Dim oComando As SqlCommand = New SqlCommand("SELECT * FROM DETALLE WHERE COD_VENTA =" & dvMaestro(0, e.RowIndex).Value, CN)
                    Dim oDataAdapter As SqlDataAdapter = New SqlDataAdapter(oComando)
                    Dim oDataSet As DataSet
                    oDataSet = New DataSet()
                    oDataAdapter.Fill(oDataSet, "DETALLE")
                    dvDetalle.DataSource = oDataSet
                    dvDetalle.DataMember = "DETALLE"

    Mil gracias por tu ayuda!

    viernes, 9 de septiembre de 2011 23:54