none
¿Cómo obtengo en el evento EditingControlShowing del control DataGridView el tipo control de la columna, de la celda actual?

    Pregunta

  • Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing

           '...¿cómo obtendría aquí el tipo de control que aloja la columna actual?

    End Sub

    o, en todo caso cómo obtengo el tipo de control de la celda actual.



    • Editado James-2016 sábado, 8 de octubre de 2016 6:09
    sábado, 8 de octubre de 2016 5:59

Respuestas

  • "James-2016" preguntó:

    > Private Sub DataGridView1_EditingControlShowing(...) Handles DataGridView1.EditingControlShowing
    >
    >       '...¿cómo obtendría aquí el tipo de control que aloja la columna actual?
    >
    > End Sub
    >
    > o, en todo caso cómo obtengo el tipo de control de la celda actual.

    Para obtener el tipo de control subyacente que alberga una columna del control DataGridView, basta con obtener el System.Type de la propiedad Control del parámetro 'e' del evento EditingControlShowing:

        Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    
            ' Obtenemos el tipo de control subyacente de la celda actual.
            '
            Dim ty As Type = e.Control.GetType()
    
            MessageBox.Show(ty.FullName)
    
       End Sub
    

    Pero si conoces de antemano el tipo de control de la celda, entonces en el mismo evento los referenciarías de la siguiente manera:

        ' Referenciamos el control TextBox subyacente en la celda actual.
        '
        Dim tb As DataGridViewTextBoxEditingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
        MessageBox.Show(tb.Text)
    


    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.

    • Marcado como respuesta James-2016 sábado, 8 de octubre de 2016 6:22
    sábado, 8 de octubre de 2016 6:13
    Moderador
  • "James-2016" preguntó:

    > y suponiendo que quiero referenciar solo los controles de texto como en
    > el segundo ejemplo que pone, es posible consultar tb si es nothing?,
    > algo así:

    En el evento EditingControlShowing del control DataGridView, es difícil que la referencia del control (la propiedad Control del parámetro 'e') sea Nothing, porque dicho evento se desencadena cuando se está editando una celda, por tanto, existe un control subyacente de algún tipo concreto en dicha celda para que pueda ser editada, por lo que su valor no puede ser Nothing.

    Ahora bien, si tu estás referenciando un tipo concreto de control (TextBox) y resulta que el control subyacente de la celda es de otro tipo de control diferente (ComboBox), entonces el operador de conversión utilizado (TryCast en el ejemplo) devolverá el valor Nothing por cuestiones obvias, por lo que verificarías el valor devuelto por el operador como lo harías con cualquier otro valor de una variable objeto mediante el operador Is:

        Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    
            ' Referenciamos el control TextBox subyacente en la celda actual.
            '
            Dim tb As DataGridViewTextBoxEditingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
    
            If (tb Is Nothing) Then
                ' Obtenemos su System.Type.
                Dim ty As Type = e.Control.GetType()
                MessageBox.Show($"El control no es del tipo 'DataGridViewTextBoxEditingControl'; es del tipo '{ty.Name}'.")
    
            Else
                MessageBox.Show(tb.Text)
    
            End If
    
        End Sub

    Te comento que utilizo el operador de conversión TryCast porque a diferencia de los operadores DirectCast y CType, aquel no produce una excepción si el control no se puede convertir al tipo de control especificado, devolviendo en éste caso el valor Nothing.


    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.




    sábado, 8 de octubre de 2016 6:39
    Moderador

Todas las respuestas

  • "James-2016" preguntó:

    > Private Sub DataGridView1_EditingControlShowing(...) Handles DataGridView1.EditingControlShowing
    >
    >       '...¿cómo obtendría aquí el tipo de control que aloja la columna actual?
    >
    > End Sub
    >
    > o, en todo caso cómo obtengo el tipo de control de la celda actual.

    Para obtener el tipo de control subyacente que alberga una columna del control DataGridView, basta con obtener el System.Type de la propiedad Control del parámetro 'e' del evento EditingControlShowing:

        Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    
            ' Obtenemos el tipo de control subyacente de la celda actual.
            '
            Dim ty As Type = e.Control.GetType()
    
            MessageBox.Show(ty.FullName)
    
       End Sub
    

    Pero si conoces de antemano el tipo de control de la celda, entonces en el mismo evento los referenciarías de la siguiente manera:

        ' Referenciamos el control TextBox subyacente en la celda actual.
        '
        Dim tb As DataGridViewTextBoxEditingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
        MessageBox.Show(tb.Text)
    


    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.

    • Marcado como respuesta James-2016 sábado, 8 de octubre de 2016 6:22
    sábado, 8 de octubre de 2016 6:13
    Moderador
  • Gracias. Eso era lo que quería.

    ...y suponiendo que quiero referenciar solo los controles de texto como en el segundo ejemplo que pone, es posible consultar tb si es nothing?, algo así:

    Dim tb As DataGridViewTextBoxEditingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)

    If tb = Nothing then

       msgbox("no es un control de texto")

    Endif

    sábado, 8 de octubre de 2016 6:22
  • "James-2016" preguntó:

    > y suponiendo que quiero referenciar solo los controles de texto como en
    > el segundo ejemplo que pone, es posible consultar tb si es nothing?,
    > algo así:

    En el evento EditingControlShowing del control DataGridView, es difícil que la referencia del control (la propiedad Control del parámetro 'e') sea Nothing, porque dicho evento se desencadena cuando se está editando una celda, por tanto, existe un control subyacente de algún tipo concreto en dicha celda para que pueda ser editada, por lo que su valor no puede ser Nothing.

    Ahora bien, si tu estás referenciando un tipo concreto de control (TextBox) y resulta que el control subyacente de la celda es de otro tipo de control diferente (ComboBox), entonces el operador de conversión utilizado (TryCast en el ejemplo) devolverá el valor Nothing por cuestiones obvias, por lo que verificarías el valor devuelto por el operador como lo harías con cualquier otro valor de una variable objeto mediante el operador Is:

        Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    
            ' Referenciamos el control TextBox subyacente en la celda actual.
            '
            Dim tb As DataGridViewTextBoxEditingControl = TryCast(e.Control, DataGridViewTextBoxEditingControl)
    
            If (tb Is Nothing) Then
                ' Obtenemos su System.Type.
                Dim ty As Type = e.Control.GetType()
                MessageBox.Show($"El control no es del tipo 'DataGridViewTextBoxEditingControl'; es del tipo '{ty.Name}'.")
    
            Else
                MessageBox.Show(tb.Text)
    
            End If
    
        End Sub

    Te comento que utilizo el operador de conversión TryCast porque a diferencia de los operadores DirectCast y CType, aquel no produce una excepción si el control no se puede convertir al tipo de control especificado, devolviendo en éste caso el valor Nothing.


    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.




    sábado, 8 de octubre de 2016 6:39
    Moderador
  • ah, ok con el operador Is y Try cast, en este caso más conveniente que CType o DirectCast porque no produce una excepción, gracias de nuevo.
    sábado, 8 de octubre de 2016 15:46