none
DataGridView solo Lectura RRS feed

  • Pregunta

  • Saludos,

    Cargo datos a un datatable, luego lo asigno por DATASOURCE a un BindingSource y este finalmente lo paso al DataGridView. mi consulta es:

    ¿Como puedo poner los datos del DataGridView a solo lectura, pero que se puedan seleccionar?...

    Si uso la propiedad ReadOnly del DataGridView no me deja seleccionar el VALOR de la celda, y a me interesa poder copiar los valores de las celdas pero que estos no se puedan modificar.

    Estare atento a sus respuestas. Gracias.
    miércoles, 16 de septiembre de 2009 18:01

Respuestas

  • Hola:

    En lugar de establecer a True el valor de la propiedad ReadOnly del propio control DataGridView, entiendo que lo que tienes que hacer de sólo lectura es el control TextBox subyacente que existe en cada celda del control DataGridView. Para ello, en el evento EditingControlShowing del control DataGridView, ejecutarías lo siguiente:

        Private Sub DataGridView1_EditingControlShowing( _
            ByVal sender As Object, _
            ByVal e As DataGridViewEditingControlShowingEventArgs) _
            Handles DataGridView1.EditingControlShowing
    
            ' Referenciamos el control TextBox subyacente en la celda actual.
            '
            Dim cellTextBox As TextBox = _
                DirectCast(e.Control, DataGridViewTextBoxEditingControl)
    
            cellTextBox.ReadOnly = True
    
        End Sub
    


    Lo anterior te permitirá seleccionar los datos de la celda para copiar el texto, bien con el teclado, bien con el menú contextual. Pero lo que no te permitirá será actualizar los datos existentes.

    Un saludo

    Enrique Martínez [MS MVP - VB]
    sábado, 19 de septiembre de 2009 18:31
    Moderador

Todas las respuestas

  • hola

    busca las propiedades

    AllowUserToAddRows

    AllowUserToDeleteRows

    y ponlas en false

    fijate que si presionas en el pequeño icono de flecha en el borde superior derecho del control datagridview veras tres opciones, una de ellas es "Enable Editing"


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 16 de septiembre de 2009 18:15
  • Gracias, pero eso es lo mismo que si pusiera: me.datagridview1.readonly=true

    Lo que buscaba era como conservar las celdas en modo SOLO LECTURA, pero que te permita seleccionar el contenido de cualquier celda. Creo que esto va mas por el lado de programar en algun evento, espero se haya entendido y si alguien lo sabe comentelo.

    Saludos.
    miércoles, 16 de septiembre de 2009 19:08
  • hola

    pero no hace falta editar las fila para poder copiarlas, o sea selecciona la row o celda y presionas Ctrl+C, luego ve a un notepad y pega, deberias pasarte los datos

    O sino puede que necesites algo como esto:

    Cómo: Permitir que los usuarios copien varias celdas en el Portapapeles desde el control DataGridView de formularios Windows Forms

    DataGridView.ClipboardCopyMode (Propiedad)

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 16 de septiembre de 2009 19:21
  • Claro, si se puede copiar toda la fila, mas no 1 celda por separado.

    Lo que pasa es que lo vi en un sistema enlatado, yo quiero implementar eso en unas pantallas adicionales que tengo. En el sistema enlatado te muestra los registros y seleccionas la fila entera, pero si das un clic sobre cualquier celda se habilita como para editar (se muestra el lapiz en el rowheader) pero si intentas sobreescribir no te deja.

    Eso es lo que ando buscando.

    Saludos.
    miércoles, 16 de septiembre de 2009 21:27
  • hola

    no has probado habilitar entonces las opciones de edicion, pero en los evento de edicion guardar los datos de la row o celda, y cuando termine de editar si modifico algo volverle el cambio hacia atras (un roolback) dejandolo como estaba originalmente

    CellBeginEdit

    CellEndEdit


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 16 de septiembre de 2009 22:27
  • Bueno, la idea fundamental es que no sea posible la edicion de las celdas, pero si su seleccion por separado. Ya se como esta hecho, la propiedad READONLY del Datagrid en .net 2003 te permite el efecto que busco.

    Por el contrario la propiedad READONLY del DataGridView en 2005 te bloquea por completo la celda, asi que no creo sea posible (hasta ahora) el efecto del 2003.


    Muchas Gracias por tomarte la molestia de responder.
    jueves, 17 de septiembre de 2009 22:56
  • Hola:

    En lugar de establecer a True el valor de la propiedad ReadOnly del propio control DataGridView, entiendo que lo que tienes que hacer de sólo lectura es el control TextBox subyacente que existe en cada celda del control DataGridView. Para ello, en el evento EditingControlShowing del control DataGridView, ejecutarías lo siguiente:

        Private Sub DataGridView1_EditingControlShowing( _
            ByVal sender As Object, _
            ByVal e As DataGridViewEditingControlShowingEventArgs) _
            Handles DataGridView1.EditingControlShowing
    
            ' Referenciamos el control TextBox subyacente en la celda actual.
            '
            Dim cellTextBox As TextBox = _
                DirectCast(e.Control, DataGridViewTextBoxEditingControl)
    
            cellTextBox.ReadOnly = True
    
        End Sub
    


    Lo anterior te permitirá seleccionar los datos de la celda para copiar el texto, bien con el teclado, bien con el menú contextual. Pero lo que no te permitirá será actualizar los datos existentes.

    Un saludo

    Enrique Martínez [MS MVP - VB]
    sábado, 19 de septiembre de 2009 18:31
    Moderador
  • SoftJaén, MUCHISIMAS GRACIAS !!!


    Eso es lo que andaba buscando, gracias por responder ya habia dejado el tema de lado, pero gracias a tu respuesta lo implemente y tengo lo que necesitaba.


    Gracias nuevamente, un saludo.
    lunes, 21 de septiembre de 2009 19:34