none
Error en al dar clic en la lista de DataGridViewComboBox RRS feed

  • Pregunta

  • Hola buen día.

    Tengo una columna en un datagridview de combobox, cuando doy clic en un combobox de mi columna de combobox y elijo cualquier item de la lista que despliega el combo se llenan las columnas ph, n, vsr status, osea todo correcto hasta aqui, pero al dar clic en cualquier conbobox nuevamente ya no me despliega la lista y se traba el form voy a poner imagen de lo que estoy haciendo:

    como se darán cuenta las celdas dentro del cuadro rojo se llenan bien pero cuando elijo otro combobox me manda error.

    El codigo es este:

     Private dgvCombo As DataGridViewComboBoxEditingControl
    
      
        Private Sub dataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles Grilla_Refuerzo2.EditingControlShowing
    
            dgvCombo = TryCast(e.Control, DataGridViewComboBoxEditingControl)
    
            If dgvCombo IsNot Nothing Then
                AddHandler dgvCombo.SelectedIndexChanged, New EventHandler(AddressOf dvgCombo_SelectedIndexChanged)
            End If
    
        End Sub
    
        Private Sub dvgCombo_SelectedIndexChanged(sender As Object, e As EventArgs)
            Try
               
                Dim row As New DataGridViewRow
                row = Grilla_Refuerzo2.CurrentRow
    
                Dim ph As DataGridViewTextBoxCell = TryCast(row.Cells("ph"), DataGridViewTextBoxCell)
                Dim n As DataGridViewTextBoxCell = TryCast(row.Cells("η"), DataGridViewTextBoxCell)
                Dim Vsr As DataGridViewTextBoxCell = TryCast(row.Cells("Vsr"), DataGridViewTextBoxCell)
                Dim Status As DataGridViewTextBoxCell = TryCast(row.Cells("Status"), DataGridViewTextBoxCell)
                ph.Value = 1
                n.Value = 2
                Vsr.Value = 3
                Status.Value = 4
            Catch ex As Exception
                MsgBox("Error")
            End Try
        End Sub
    
        Private Sub Grilla_Refuerzo2_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles Grilla_Refuerzo2.CellEndEdit
    
            If dgvCombo IsNot Nothing Then
                RemoveHandler dgvCombo.SelectedIndexChanged, New EventHandler(AddressOf dvgCombo_SelectedIndexChanged)
            End If
        End Sub
    

    Espero me puedan ayudar a saber el por que manda el error.

    Saludos


    DikerJARP

    jueves, 26 de mayo de 2016 23:03

Respuestas

  • "DIKERJARP" escribió:

    > ... elijo cualquier item de la lista que despliega el combo se llenan las columnas
    > ph, n, vsr status, osea todo correcto hasta aqui, pero al dar clic en cualquier
    > conbobox nuevamente ya no me despliega la lista y se traba el form ...
    >
    > No se controló StackOverflowException
    > Excepción no controlada del tipo 'System.StackOverflowException" en ...
    >

    Hola:

    Que yo sepa, una excepción del tipo System.StackOverflowException no se produce por el mero hecho de asignar los valores a las columnas del control DataGridView que estás indicando, si no que "algo" está haciendo que se ejecuten llamadas reentrantes a algún método que lo que está provocando es un desbordamiento de la pila, de ahí la excepción que estás obteniendo. ¿El que es ese "algo" que está provocando el error? Pues sin ver todo el código fuente que tienes escrito en ese formulario, me inclinaría a decir que puede que el "culpable" sea el mismo procedimiento dvgCombo_SelectedIndexChanged que tienes implementado en el mismo, el cual es muy fácil que se ejecute numerosas veces.

    En lugar de ejecutar el procedimiento dvgCombo_SelectedIndexChanged cuando se desencadena el evento SelectedIndexChanged del control ComboBox, hazlo cuando se desencadene su evento SelectionChangeCommitted. Tan solo tienes que modificar en tu código la siguiente línea:

        Private Sub dataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles Grilla_Refuerzo2.EditingControlShowing
    
            dgvCombo = TryCast(e.Control, DataGridViewComboBoxEditingControl)
    
            If (dgvCombo IsNot Nothing) Then
    
                ' AddHandler dgvCombo.SelectedIndexChanged, New EventHandler(AddressOf dvgCombo_SelectedIndexChanged)
    
                ' Primero eliminamos cualquier otro controlador que se haya instalado previamente.
                RemoveHandler dgvCombo.SelectionChangeCommitted, AddressOf dvgCombo_SelectedIndexChanged
    
                ' Y después volvemos a instalar el controlador
                AddHandler dgvCombo.SelectionChangeCommitted, AddressOf dvgCombo_SelectedIndexChanged
     
            End If
    
        End Sub

    Como estamos eliminando primero el controlador, ya no te hace falta hacerlo en el siguiente procedimiento, por lo que lo puedes eliminar del formulario:

        Private Sub Grilla_Refuerzo2_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles Grilla_Refuerzo2.CellEndEdit

            ' If dgvCombo IsNot Nothing Then
            '     RemoveHandler dgvCombo.SelectedIndexChanged, New EventHandler(AddressOf dvgCombo_SelectedIndexChanged)
            ' End If
       
        End Sub

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 29 de mayo de 2016 8:58
    Moderador

Todas las respuestas

  • ¿Qué error te da?

    Saludos, Javier J

    viernes, 27 de mayo de 2016 7:46
  • Hola Javier, este es el error que me manda.


    DikerJARP

    viernes, 27 de mayo de 2016 14:33
  • tengo una pergunta, cuando cambias el valor de la celda ph sucede algun evento? por ejemplo DataGridView.CellValueChanged o algo asi que a su vez cambie el valor de tu combobox?

    lo que quiero decir es si no tienes un bucle que cuando el valor de tu combo cambie, tambien el valor de la celda ph y que este desencadene un evento donde el valor del combo cambie

    viernes, 27 de mayo de 2016 17:11
  • Hola RHCRD.

    me preguntas: lo que quiero decir es si no tienes un bucle que cuando el valor de tu combo cambie, también el valor de la celda ph y que este desencadene un evento donde el valor del combo cambie.

    Cuando doy click por primera vez en cualquier combobox, lo único que estoy haciendo es mandar directamente valores a las columnas ph,n,Vsr y Status y estas se llenan. con esto quiero decir que no tengo ningún bucle o ninguna funcion

    De antemano agradezco tu atencion


    DikerJARP


    • Editado DIKERJARP viernes, 27 de mayo de 2016 17:26
    viernes, 27 de mayo de 2016 17:25
  • y si intentas cambiar esto

                Dim ph As DataGridViewTextBoxCell = TryCast(row.Cells("ph"), DataGridViewTextBoxCell)
                Dim n As DataGridViewTextBoxCell = TryCast(row.Cells("η"), DataGridViewTextBoxCell)
                Dim Vsr As DataGridViewTextBoxCell = TryCast(row.Cells("Vsr"), DataGridViewTextBoxCell)
                Dim Status As DataGridViewTextBoxCell = TryCast(row.Cells("Status"), DataGridViewTextBoxCell)
                ph.Value = 1
                n.Value = 2
                Vsr.Value = 3
                Status.Value = 4

    por esto

                GrillaRefuerzo2.Item(10,row.Index).Value = 1
                GrillaRefuerzo2.Item(11,row.Index).Value = 2
                GrillaRefuerzo2.Item(12,row.Index).Value = 3
                GrillaRefuerzo2.Item(13,row.Index).Value = 4

    viernes, 27 de mayo de 2016 18:29
  • Hola de nuevo, fijate que el problema no esta en poner los valores si no q se cicla y no entiendo por que para que te des una idea mejor del codigo me estoy basando en este link:

    http://ltuttini.blogspot.mx/2010/03/datagridview-parte-6-combobox-y-evento.html

    Leandro Tuttinni tambien es forista de msdn


    DikerJARP

    viernes, 27 de mayo de 2016 22:23
  • "DIKERJARP" escribió:

    > ... elijo cualquier item de la lista que despliega el combo se llenan las columnas
    > ph, n, vsr status, osea todo correcto hasta aqui, pero al dar clic en cualquier
    > conbobox nuevamente ya no me despliega la lista y se traba el form ...
    >
    > No se controló StackOverflowException
    > Excepción no controlada del tipo 'System.StackOverflowException" en ...
    >

    Hola:

    Que yo sepa, una excepción del tipo System.StackOverflowException no se produce por el mero hecho de asignar los valores a las columnas del control DataGridView que estás indicando, si no que "algo" está haciendo que se ejecuten llamadas reentrantes a algún método que lo que está provocando es un desbordamiento de la pila, de ahí la excepción que estás obteniendo. ¿El que es ese "algo" que está provocando el error? Pues sin ver todo el código fuente que tienes escrito en ese formulario, me inclinaría a decir que puede que el "culpable" sea el mismo procedimiento dvgCombo_SelectedIndexChanged que tienes implementado en el mismo, el cual es muy fácil que se ejecute numerosas veces.

    En lugar de ejecutar el procedimiento dvgCombo_SelectedIndexChanged cuando se desencadena el evento SelectedIndexChanged del control ComboBox, hazlo cuando se desencadene su evento SelectionChangeCommitted. Tan solo tienes que modificar en tu código la siguiente línea:

        Private Sub dataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles Grilla_Refuerzo2.EditingControlShowing
    
            dgvCombo = TryCast(e.Control, DataGridViewComboBoxEditingControl)
    
            If (dgvCombo IsNot Nothing) Then
    
                ' AddHandler dgvCombo.SelectedIndexChanged, New EventHandler(AddressOf dvgCombo_SelectedIndexChanged)
    
                ' Primero eliminamos cualquier otro controlador que se haya instalado previamente.
                RemoveHandler dgvCombo.SelectionChangeCommitted, AddressOf dvgCombo_SelectedIndexChanged
    
                ' Y después volvemos a instalar el controlador
                AddHandler dgvCombo.SelectionChangeCommitted, AddressOf dvgCombo_SelectedIndexChanged
     
            End If
    
        End Sub

    Como estamos eliminando primero el controlador, ya no te hace falta hacerlo en el siguiente procedimiento, por lo que lo puedes eliminar del formulario:

        Private Sub Grilla_Refuerzo2_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles Grilla_Refuerzo2.CellEndEdit

            ' If dgvCombo IsNot Nothing Then
            '     RemoveHandler dgvCombo.SelectedIndexChanged, New EventHandler(AddressOf dvgCombo_SelectedIndexChanged)
            ' End If
       
        End Sub

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 29 de mayo de 2016 8:58
    Moderador
  • Agradezco tu respuesta Enrique M. Montejo ya no marca error over flow y era exactamente como tu lo comentaste.

    Saludos Cordiales!!!


    DikerJARP

    lunes, 6 de junio de 2016 14:56