Tengo un DataGridView con la propiedad ReadOnly = True y SelectionMode =
FullRowSelect, que lo completo con una instruccion SQL mediane un
ExecuteReader()
Con el boton derecho del mouse despliego un ContextMenuStrip con opciones y
automaticamente se Selecciona la fila del datagrid en donde esta posicionado
el mouse (coordenadas X e Y). Una de las opciones del ContextMenuStrip es
MODIFICAR FILA.
Como puedo hacer para que el DataGridView sea ReadOnly = False y
SelectionMode = CellSelect de solamente ESA FILA que esta seleccionada. Es
decir, que mientras estoy editando, el usuario no pueda mover con las
flechas ni mouse por el resto del datagridview, sino que solo se pueda mover
por las celdas editables de ESA FILA que esta seleccionada.
Y si no es mucho pedir... necesito tambien que solo algunas de las celdas de
esa fila puedan ser editables y otras no. Por ej. una celda muestra el ID de
la tabla y esa no quiero que se edite. Otra muestra la fecha de creación del
registro y esa tampoco quiero que se edite.
Desde ya muchas gracias.-
Joe.
> Como puedo hacer para que el DataGridView sea ReadOnly = False y
> SelectionMode = CellSelect de solamente ESA FILA que esta seleccionada.
> Es decir, que mientras estoy editando, el usuario no pueda mover con las
> flechas ni mouse por el resto del datagridview, sino que solo se pueda
> mover por las celdas editables de ESA FILA que esta seleccionada.
>
> Y si no es mucho pedir... necesito tambien que solo algunas de las celdas
> de esa fila puedan ser editables y otras no. Por ej. una celda muestra el
> ID de la tabla y esa no quiero que se edite. Otra muestra la fecha de
> creación del registro y esa tampoco quiero que se edite.
Hola, Joe:
Lo único que se me ocurre es que ejecutes el siguiente código cuando el
usuario seleccione MODIFICAR FILA en el menú contextual:
With DataGridView1
.ReadOnly = False
.SelectionMode = DataGridViewSelectionMode.CellSelect
.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
.BeginEdit(True)
' Hacemos que estas dos columnas no se puedan editar
'
.Columns("ID").ReadOnly = True
.Columns("Fecha creación").ReadOnly = True
End With
Y en el evento «RowLeave» del control DataGridView, volverías a impedir que
se puedan modificar las celdas de dicho control:
Private Sub DataGridView1_RowLeave(...)
With DataGridView1
.EditMode = DataGridViewEditMode.EditOnF2
.ReadOnly = True
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End With
End Sub
Un saludo
--
Enrique Martínez
[MS MVP - VB]
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.
Solo a modo de comentario: Cuando salgo del Row (evento LeaveRow) supongamos
presionando el cursor para abajo, me marca solo la CELDA del renglon
siguiente y no toda la fila completa. Es como si VB.Net no hiciera caso a la
instruccion DataGridViewSelectionMode.FullRowSelect del evento LeaveRow.
Recien lo hace bien si muevo para otro lugar (digamos, lo hace bien a partir
del 2do. movimiento luego de cada edicion).
Lo solucione poniendo un DataGridView1.Rows(e.RowIndex).Selected = True en
el evento RowEnter. Sonará medio redundante pero funciona!!. Ahora si cada
vez que salgo del modo edicion, selecciona por completo la nueva fila en la
que el usuario se posiciona.
Un abrazo y gracias nuevamente.
Joe.
"SoftJaén" <grupo_n...@softjaen.es> wrote in message
news:C102D112-8973-4463...@microsoft.com...
Sí, efectivamente hace ese comportamiento un tanto extraño que ignoro a qué
puede deberse.
> Lo solucione poniendo un DataGridView1.Rows(e.RowIndex).Selected = True
Con eso desaparece el comportamiento extraño. :-)
Por esos caprichos que tenemos los programadores de dejar las cosas bonitas
y sin codigos sucios, se me ocurrió hacer que el usuario no pueda ir a
ningun lado (ni mover para arriba, ni mover para abajo) sin antes decidir
que va a hacer con esa linea del DataGrid. (Si grabar los cambios a la base
de datos o cancelarlos). Es decir, lo que eliminé es el hecho de que los
cambios se graben automáticamente cuando el usuario deja la fila (evento
LeaveRow).
A mi codigo agregué el evento DataGridView1_KeyDown() [Luego tendre
tambien que controlar el mouse para que el usuario no vaya a otro lado]. En
dicho evento pongo:
If Me.DataGridView1.ReadOnly = False 'Si estoy en el modo edicion
Select Case e.KeyCode
Case Is = Keys.F5
e.SuppressKeyPress = True
GrabarFila()
Case Is = Keys.Up
e.SuppressKeyPress = True
Case Is = Keys.Down
e.SupressKeyPress = True
End Select
Endif
Ahora bien... esto funciona perfecto. Mientras me muevo hacia la derecha o
izquierda en el modo de Edicion, no me permite ir ni para arriba ni para
abajo, manteniendome siempre en la fila que estoy editando. Si apreto F5 se
graba los cambios tal como he quiero. Pero .... y siempre hay un pero sino
no estaria posteando... jaajajaj .... cuando apreto F2 para editar la celda,
me permite hacerlo y ahi si apreto el cursor para arriba o para abajo, se
SALE de la fila que estoy editanto. Asi que volvemos al comportamiento
EXTRAÑO !! (que ya no soluciona el Rows(e.RowIndex).Selected = True del
evento RowEnter).
Me das alguna idea de como solucionarlo? He probado de todo por mas de 3
horas y ya me estoy desesperando!!!. Ahora estoy leyendo sobre VirtualMode
del DataGridView para ver si encuentro algo en esa galera.
Espero tu respuesta.
Un abrazo, Joe.
"SoftJaén" <grupo_n...@softjaen.es> wrote in message
news:F42B7BFE-1694-433D...@microsoft.com...
Luego de dar vueltas y vueltas lo pude solucionar de la manera mas simple!!
Agregue un evento DataGridView1_RowValidating()
If DataGridView1.ReadOnly = False 'Si estoy en modo de edicion
e.Cancel = True
Endif
Funciona un lujito!!! ni siquiera tengo que controlar el evento del mouse,
ya que no deja hacer nada de NADA (ni cerrar el FORM con la "X"), hasta que
el usuario no GRABE (con F5) o Cancele la edicion de esa fila!! Solo me
deja moverme de izquiera a derecha por la fila editable e ir presionando F2
para cambiar la info de cada celda.
Nos vemos. Joe.
"Joe" <xxxjose...@equisur.com.ar> wrote in message
news:O$ACqBJfI...@TK2MSFTNGP04.phx.gbl...
> Pero .... y siempre hay un pero sino no estaria posteando... jaajajaj ....
> cuando apreto F2 para editar la celda, me permite hacerlo y ahi si apreto
> el cursor para arriba o para abajo, se SALE de la fila que estoy editanto.
> Asi que volvemos al comportamiento EXTRAÑO !! (que ya no soluciona el
> Rows(e.RowIndex).Selected = True del evento RowEnter).
>
> Me das alguna idea de como solucionarlo? He probado de todo por mas de 3
> horas y ya me estoy desesperando!!!. Ahora estoy leyendo sobre
> VirtualMode del DataGridView para ver si encuentro algo en esa galera.
Las celdas del control DataGridView entran en modo de edición cuando se
pulsa la tecla F2 o cuando se presiona cualquier tecla alfanumérica mientras
la celda tiene el foco, que es el valor por defecto de la propiedad
«EditMode» del control DataGridView (EditOnKeystrokeOrF2). Si quieres
modificar dicho comportamiento, tendrás que especificarle otro valor a la
propiedad, por ejemplo
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically
Esto hace que se entre en modo de edición cuando se llama al método
«BeginEdit»:
DataGridView1.BeginEdit(True)
Y para saber si alguna celda está en modo de edición, hay que obtener el
control de edición (TextBox) que existe en cada celda del control
DataGridView:
' Si el control DataGridView está en modo de edición ...
'
If (DataGridView1.EditingControl IsNot Nothing) Then
' ... Obtenemos el control de texto de la celda
' actualmente en edición.
'
Dim tb As TextBox = _
CType(DataGridView1.EditingControl, TextBox)
Dim newValue As String = tb.Text
MessageBox.Show(newValue)
End If
La propiedad «ReadOnly» sólo nos indica si el usuario puede o no editar las
celdas del control DataGridView, pero no que una celda se encuentre en modo
de edición. Está claro que si el valor de la propiedad «ReadOnly» es True,
pocas celdas se van a poder editar, pero en el supuesto de que el valor sea
False, la propiedad «EditingControl» es la que nos indica que una celda está
siendo editada.
Alguna idea.... Gracias de antemano
Private Sub DgvRegistros_CellValidating(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles
DgvRegistros.CellValidating
Dim value As String = e.FormattedValue.ToString
If (DgvRegistros.CurrentCellAddress.X = 1 Or
DgvRegistros.CurrentCellAddress.X = 2) Then
If String.IsNullOrEmpty(value) Then
MsgBox("La celda no debe estar vacía.",
MsgBoxStyle.Exclamation, "Información de validación")
e.Cancel = True
Return
End If
End If
End Sub
Private Sub DgvRegistros_RowLeave(ByVal sender As Object, ByVal e As
System.Windows.Forms.DataGridViewCellEventArgs) Handles DgvRegistros.RowLeave
With DgvRegistros
.EditMode = DataGridViewEditMode.EditOnF2
.ReadOnly = True
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End With
End Sub
Pues sí: que en el evento «RowLeave», y antes de establecer el valor «True»
a la propiedad «ReadOnly» del control DataGridView, confirmes y finalices la
operación de edición de la celda actual llamando al método «EndEdit» del
control DataGridView:
Private Sub DgvRegistros_RowLeave( ... )
With DgvRegistros
' Finalizamos la operación de edición.
'
.EndEdit()
.EditMode = DataGridViewEditMode.EditOnF2
.ReadOnly = True
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End With
End Sub
--
' Referenciamos la columna
'
Dim col As DataColumn = objetoDataTable.Columns("NombreColumna")
' No se permiten valores NULL.
'
col.AllowDBNull = False
' Enlazamos el control DataGridView con el objeto DataTable.
'
DataGridView1.DataSource = objetoDataTable
De ésta manera, no tendrías que validar los datos en el evento
«CellValidating», y tampoco necesitarías llamar al método «EndEdit» en el
evento «RowLeave»; simplemente, también detectarías la excepción en el
evento «DataError» del control DataGridView:
Private Sub DataGridView1_DataError( ...)
' Aquí controlarías la excepción producida
'
MessageBox.Show(e.Exception.Message)
End Sub
Pienso que es más práctico. :-)
"SoftJaén" wrote:
> Te comento que otra opcin que tienes para no permitir valores NULL en
> ciertas columnas del control DataGridView, pasa por aplicar la misma tcnica
> que te comente para no permitir valores duplicados en una misma columna,
> pero en este caso, tienes que establecer el valor False a la propiedad
> AllowDBNull del objeto DataColumn que deseas controlar:
>
> ' Referenciamos la columna
> '
> Dim col As DataColumn = objetoDataTable.Columns("NombreColumna")
>
> ' No se permiten valores NULL.
> '
> col.AllowDBNull = False
>
> ' Enlazamos el control DataGridView con el objeto DataTable.
> '
> DataGridView1.DataSource = objetoDataTable
>
> De sta manera, no tendras que validar los datos en el evento
> CellValidating, y tampoco necesitaras llamar al mtodo EndEdit en el
> evento RowLeave; simplemente, tambin detectaras la excepcin en el
> evento DataError del control DataGridView:
>
> Private Sub DataGridView1_DataError( ...)
>
> ' Aqu controlaras la excepcin producida
> '
> MessageBox.Show(e.Exception.Message)
>
> End Sub
>
> Pienso que es ms prctico. :-)
>
> --
> Enrique Martnez
> [MS MVP - VB]
>
> Nota informativa: La informacin contenida en este mensaje, as como el
> cdigo fuente incluido en el mismo, se proporciona COMO EST, sin
> garantas de ninguna clase, y no otorga derecho alguno. Usted asume
> cualquier riesgo al poner en prctica, utilizar o ejecutar lo recomendado o
Que puede pasar que no gatille el evento DataGridView1_DataError(..) a pesar
de que condiciono una columna (0) a AllowNull=false?
Para la creacion y edicion de filas la manejo manualmente utilizando los
eventos
PD: La primero columna de la grilla es de tipo DataGridViewComboBoxColumn
'Creacion de una fila
Private Sub ToolStripAddBodega_Click(..)
mRegistrosDataTable = CType(DgvBodegas.DataSource, DataTable)
Dim myDataRow As DataRow = mRegistrosDataTable.NewRow
With myDataRow
.Item(0) = ""
.Item(4) = "0"
.Item(5) = "0"
.Item(6) = "0"
.Item(7) = "0"
End With
mRegistrosDataTable.Rows.Add(myDataRow)
With DgvBodegas
.ReadOnly = False
.SelectionMode = DataGridViewSelectionMode.CellSelect
.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
.BeginEdit(True)
End With
End Sub
Private Sub DgvBodegas_RowLeave(..)
With DgvBodegas
'.EndEdit()
.EditMode = DataGridViewEditMode.EditOnF2
.ReadOnly = True
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
End With
End Sub
Private Sub DgvBodegas_RowEnter(..)
DgvBodegas.Rows(e.RowIndex).Selected = True
End Sub
Private Sub DgvBodegas_DataError(..)
MsgBox(e.Exception.Message, MsgBoxStyle.Exclamation, "..")
e.Cancel = True
End Sub
Alguna idea de lo que puede estar pasando, gracias
Para que se desencadene ("gatille") el evento «DataError», la excepción se
debe producir DENTRO del propio control DataGridView. Si la excepción o el
error está producido por otro objeto (en tu caso un objeto DataTable), el
evento no se producirá, en éste caso, tienes que capturar la excepción en un
bloque «Try ... End Try»:
Try
mRegistrosDataTable = CType(DgvBodegas.DataSource, DataTable)
Dim myDataRow As DataRow = mRegistrosDataTable.NewRow
With myDataRow
.Item(0) = ""
End With
mRegistrosDataTable.Rows.Add(myDataRow)
Catch ex As Excepcion
MessageBox.Show (ex.Message)
End Try
Por ejemplo, si estás utilizando el control DataGridView y añades
manualmente una nueva fila al mismo, se desencadenará el evento «DataError»
si la primera columna tiene un valor Null, excepción que se producirá cuando
cambies de fila, bien utilizando el teclado o el ratón. Pero si añades una
fila mediante código fuente, la excepción se produce, porque la primera
columna no admite valores Null, pero no se desencadenaría el evento
«DataError» del control DataGridView. En definitiva, digamos que el evento
se desencadena si el que provoca la excepción es el propio control
DataGridView.
--
Enrique Martnez
[MS MVP - VB]
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
> ¿Se puede crear un nuevo registro en datagridview si esta enlazado a
> datos?
Pues claro que se puede crear. Si el control DataGridView se encuentra
enlazado a un objeto DataTable, puedes añadir nuevas filas tal cual lo estás
haciendo: llamando al método «NewRow» del objeto DataTable para crear un
objeto DataRow para posteriormente añadirlo a la colección Rows del objeto
DataTable.
Lo que ocurre es que si utilizas ésta última manera de añadir filas, no se
desencadena el evento DataError del control DataGridView, ya que la
excepción se produce en el procedimiento donde se añade la fila, de ahí que
tengas que capturar la excepción dentro de un bloque «Try ... End Try». Pero
si estás añadiendo filas escribiendo datos sobre el propio control
DataGridView, entonces sí se desencadenará el mencionado evento ante
cualquier excepción que se produzcan al validar los datos.
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
"SoftJaén" wrote:
> "Cesar" pregunt:
>
> > Se puede crear un nuevo registro en datagridview si esta enlazado a
> > datos?
>
> Pues claro que se puede crear. Si el control DataGridView se encuentra
> enlazado a un objeto DataTable, puedes aadir nuevas filas tal cual lo ests
> haciendo: llamando al mtodo NewRow del objeto DataTable para crear un
> objeto DataRow para posteriormente aadirlo a la coleccin Rows del objeto
> DataTable.
>
> Lo que ocurre es que si utilizas sta ltima manera de aadir filas, no se
> desencadena el evento DataError del control DataGridView, ya que la
> excepcin se produce en el procedimiento donde se aade la fila, de ah que
> tengas que capturar la excepcin dentro de un bloque Try ... End Try. Pero
> si ests aadiendo filas escribiendo datos sobre el propio control
> DataGridView, entonces s se desencadenar el mencionado evento ante
> cualquier excepcin que se produzcan al validar los datos.
>
> --
> Enrique Martnez
> [MS MVP - VB]
>
> Nota informativa: La informacin contenida en este mensaje, as como el
> cdigo fuente incluido en el mismo, se proporciona COMO EST, sin
> garantas de ninguna clase, y no otorga derecho alguno. Usted asume
> cualquier riesgo al poner en prctica, utilizar o ejecutar lo recomendado o
disculpen de donde sacan el dataviewgrid porque donde programo solo dice:
web forms pointer,label, textbox, button, linkbutton, imagebutton,
dropdownlist,hyperlink,listbox,datagrid etc etc
y el datagrid que uso nada mas me muestra la informacion pero no puedo
interactuar con la informacion via mouse
para mostrar la informacion hice lo siguiente:
Dim cad As String = "Database=f13;Data Source=localhost;User
Id=root;Password=escondo"
Dim query As String = "select * from cata_depa"
Dim cnn As New MySqlConnection(cad)
Dim da As New MySqlDataAdapter(query, cnn)
da.Fill(ds, "table")
DataGrid1.DataSource = ds
DataGrid1.DataMember = "table"
DataGrid1.DataKeyField = "clave_depto"
DataGrid1.DataBind()
para insertar hago lo siguiente
Dim cad3 As String = "Database=f13;Data Source=localhost;User
Id=root;Password="
Dim cnn3 As New MySqlConnection(cad3)
Dim Sql_insert As String
Sql_insert = "INSERT INTO cata_depa VALUES ('P','PRUEBA','YO MISMO')"
Dim Insercion As New MySqlCommand(Sql_insert, cnn3)
cnn3.Open()
Insercion.ExecuteNonQuery()
cnn3.Close()
DataGrid1.DataBind()
para moverme entre los renglon (que no funciona trato de hacer lo siguiente)
Me.BindingContext(ds, cata_depa).Position = 0 'me marca error
y aparte quiero entrar a una celda del datagrid y no puedo entrar a
modificarla
por eso la pregunta de donde sacan el dataviewgrid o esto en otro lenguaje
de programacion
> voy empezando a programar en net estoy con un 2003, ya tengo
> 1 semana queriendo interactuar con el datagrid.
>
> disculpen de donde sacan el dataviewgrid ...
Hola:
Si utilizas Visual Basic .net versión 2003, no podrás utilizar el control
DataGridView, ya que éste se añadió en la versión 2.0 del marco de trabajo
de .net, por tanto, se utiliza a partir de Visual Basic 2005.
Como dices que estás empezando a programar en .NET, lo mismo te puede
interesar utilizar la versión Express de Visual Basic 2008, porque aparte
que es la última versión del lenguaje Visual Basic, se encuentra disponible
para su descarga de manera gratuita.
Un saludo
--
Enrique Martínez
[MS MVP - VB]
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