Datagrid y textbox

Necesito que saber como puedo seleccionar un registro del datagrid y que este se muestro en los texbox que he diseñado, de tal manera que aquí pueda modificarlo, etc.
La cuestión me trae de cabeza.
O incluso algún ejemplo para poder estudiarlo y adaptarlo a mis necesidades.
Otra cuestión es que cuando en los registros añado un registro nuevo hasta que no salgo y vuelvo a entrar en la aplicación no se actualiza en el datagrid ¿Debería actualizarse al tiempo? ¿Cómo lo hago?
1

1 respuesta

Respuesta
1
Con el valor de esta propiedad indicas al grid como quieres que se realice la selección,
DataGrid1.MarqueeStyle = dbgHighlightRowRaiseCell
En este caso cada vez que hagas click en el grid seleccionara la fila completa.
El problema es que estas manejando el evento click del datagrid y también puedes usar el evento rowcolchange, este evento se activa cada vez que cambia de columna o fila la selección en el grid.
ok !!!funciona!!! usando la propiedad marqueestyle=dbghiglightrowraisecell
Pero sigo teniendo los otros dos problemas:
La primera vez que hago clic en una fila aunque sea la cuarta me saca los registros de la primera y si después hago clic en la 9 fila me saca los datos de la cuarta ¿cómo qué fuera siempre uno por detrás?
Y la segunda cuestión: cuando añado en los textbox un nuevo registro no lo actualiza en el datagrid hasta que salgo del programa y vuelvo a entrar en el
Aunque a estas cuestiones no me contestes (ya que entiendo que estoy abusando de ti) respóndeme a este mensaje para poder puntuarte
Un fuerte abrazo
¿Quieres hacer la selección desde código o que el usuario la haga?
Si es desde código puedes usar la propiedad bookmark, y si es por el usuario unicamente haciendo click en el grid en el momento de ejecución seleccionas la fila, para pasar los datos a text es de la siguiente manera:
text1.text = datagrid1.Columns(0).Text
La propiedad columns hay que ponerle el index de la columna que necesitas.
Y la forma de refrescar un datagrid depende de como lo estés usando si hacer la carga a través de recordset ejecuta de nuevo la consulta y reasigna el recordset al datagrid, y si esta amarrado a algún comando hazle un refresh.
Suerte.
Carlos aguilar.
Buenas noches, Carlos, antes de nada darte las gracias por las molestias que te estas tomando conmigo.
Soy muy novato en la programación, y para mi cada linea de código que escribo es un triunfo.
He seguido tus indicaciones. Se trata que el usuario seleccione un registro y se muestre en los textbox para que aquí pueda modificar el dato que desee.
He conseguido que si selecciona LA FILA lo muestre correctamente en los textbox. Pero si hace clic en uno de las celdas SIEMPRE aparece en los textbox el primer registro, después si hago clic en otra celda de otro registro me saca en los textbox los datos del primer registro dónde había hecho clic. Digamos que va uno por detrás (siempre sacando al hacer clic los datos del primer registro) ¿Cómo lo soluciono? Seria guay que esto último funcionara correctante y si no se pudiera el desactivar las celdas y que solo funcione seleccionando LAS FILAS.
Respecto de la segunda cuestión: no se como hacerlo, te paso el código (creo que para ti sera algo básico) y si me haces el favor me corriges esta segunda cuestión para que funcione
Un saludo (espero impaciente tus noticias)
Option Explicit
Dim cn As Connection
Dim rsañadir As Recordset
Dim rseliminar As Recordset
Dim rsmodificar As Recordset
Dim consulta1 As String
Dim rscontador As Recordset
Private Sub cmdcancelar_Click()
Text1.text = ""
Text2.text = ""
Text3.text = ""
Text4.text = ""
Text5.text = ""
Text6.text = ""
Text7.text = ""
Text8.text = ""
Text9.text = ""
Text1.SetFocus
End Sub
Private Sub cmdsalir_click()
MsgBox "Usted al ejecutar esta opción no ha realizado el alta que pretendía"
clearFields
frmclientes.Width = 5150
cmdañadir.Enabled = True
End Sub
Private Sub DataGrid1_Click()
'Text1.text = ""
'Text2.text = ""
Text1.text = DataGrid1.Columns(0).text
Text2.text = DataGrid1.Columns(1).text
Text3.text = DataGrid1.Columns(2).text
Text4.text = DataGrid1.Columns(3).text
Text5.text = DataGrid1.Columns(4).text
Text6.text = DataGrid1.Columns(5).text
Text7.text = DataGrid1.Columns(6).text
Text8.text = DataGrid1.Columns(7).text
Text9.text = DataGrid1.Columns(8).text
Text10.text = DataGrid1.Columns(9).text
End Sub
Private Sub Form_Load()
Set cn = New Connection
'hacemos la conexion con ado copiamos la ruta la pegamos aqui y despues le podemos eliminar
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\SEÑOR\CRAFOND\CRAFOND.mdb;Mode=ReadWrite;Persist Security Info=False"
End Sub
Private Sub cmdañadir_Click()
'utilizo esto para que cuando salga la pantalla de añadir ya salga
'el "autonumerico" que corresponde al alta que estamos creando por defecto
Set rscontador = New Recordset
consulta1 = "select * from clientes"
rscontador.Open consulta1, cn, adOpenStatic, adLockOptimistic, 1
If rscontador.RecordCount = 0 Then
Text10.text = "1"
Else
rscontador.MoveLast
Text10.text = rscontador!idcliente + 1
End If
'el formulario le tengo el ancho a 5150 y asi al dar a añadir se abre a 9800
Me.Width = 9800
cmdañadir.Enabled = False
'llama al procedimiento para que salgan los campos limpios
clearFields
Text1.SetFocus
cmdgrabar.Visible = True
End Sub
Private Sub cmdgrabar_Click()
Set rsañadir = New Recordset
consulta1 = "select * from clientes"
rsañadir.Open consulta1, cn, adOpenStatic, adLockOptimistic, 1
If rsañadir.RecordCount = 0 Then
Text10.text = "1"
Else
rsañadir.MoveLast
Text10.text = rsañadir!idcliente + 1
End If
rsañadir.AddNew
rsañadir!nombre = Text1.text
rsañadir!apellidos = Text2.text
rsañadir!direccion = Text3.text
rsañadir!poblacion = Text4.text
rsañadir!provincia = Text5.text
rsañadir!codigopostal = Text6.text
rsañadir!telefono = Text7.text
rsañadir!telefax = Text8.text
rsañadir!Email = Text9.text
rsañadir!idcliente = Text10.text
'esto sirve para grabar en la base de datos
rsañadir. Update
'esto sirve para cerrar
rsañadir.Close
frmclientes.Width = 5150
cmdañadir.Enabled = True
End Sub
Private Sub clearFields()
Text1.text = ""
Text2.text = ""
Text3.text = ""
Text4.text = ""
Text5.text = ""
Text6.text = ""
Text7.text = ""
Text8.text = ""
Text9.text = ""
End Sub
Private Sub cmdeliminar_Click()
Me.Width = 9800
End Sub
Private Sub cmdsalida_Click()
Unload Me
End Sub
Puede ser que el problema sea el siguiente, utilizas el evento click de la siguiente manera:
Private Sub DataGrid1_Click()
'Text1.text = ""
'Text2.text = ""
Text1.text = DataGrid1.Columns(0).text
Text2.text = DataGrid1.Columns(1).text
Text3.text = DataGrid1.Columns(2).text
Text4.text = DataGrid1.Columns(3).text
Text5.text = DataGrid1.Columns(4).text
Text6.text = DataGrid1.Columns(5).text
Text7.text = DataGrid1.Columns(6).text
Text8.text = DataGrid1.Columns(7).text
Text9.text = DataGrid1.Columns(8).text
Text10.text = DataGrid1.Columns(9).text
End Sub
Y debes usar también el evento rowcolchange de la siguiente, para agregar código a un evento, sitúa el cursor en el texto del evento anterior y en los combos de arriba de la parte de código seleccionas el evento rowcolchange:
Private Sub DataGrid1_RowColChange (ultimafila, ultimacolumna)
'Text1.text = ""
'Text2.text = ""
Text1.text = DataGrid1.Columns(0).text
Text2.text = DataGrid1.Columns(1).text
Text3.text = DataGrid1.Columns(2).text
Text4.text = DataGrid1.Columns(3).text
Text5.text = DataGrid1.Columns(4).text
Text6.text = DataGrid1.Columns(5).text
Text7.text = DataGrid1.Columns(6).text
Text8.text = DataGrid1.Columns(7).text
Text9.text = DataGrid1.Columns(8).text
Text10.text = DataGrid1.Columns(9).text
End Sub
En lo referente a la actualización, necesito saber como llenas el datagrid si lo dejas amarrado a un ado o lo llenas por código con recordset, si lo tienes amarrado al ado, unicamente actualiza el grid y si es por código ejecuta de nuevo la función para cargar el grid.
Y no te preocupes sigue preguntando hasta que tu duda quede aclarada.
Ya solo me queda por resolver alguna cuestión: que se actualice el datagrid en el momento de dar a grabar los nuevo datos introducidos en los textbox.
El datagrid lo enlazo a través de un ado llamado adodatagrid. Porque a través de código no conseguía desarrollando (soy un "poco" ignorante)
Supongo que para actualizarlo será con la siguiente instrucción:
adodatagrid.Refresh
Pero no consigo que funcione, entiende que debo colocarlo al final del procedimiento de grabar ¿qué hago mal?
(Esto de programar es un "poquito"complicado)
Private Sub cmdgrabar_Click()
Set rsañadir = New Recordset
consulta1 = "select * from clientes"
rsañadir.Open consulta1, cn, adOpenStatic, adLockOptimistic, 1
If rsañadir.RecordCount = 0 Then
Text10.text = "1"
Else
rsañadir.MoveLast
Text10.text = rsañadir!idcliente + 1
End If
rsañadir.AddNew
rsañadir!nombre = Text1.text
rsañadir!apellidos = Text2.text
rsañadir!direccion = Text3.text
rsañadir!poblacion = Text4.text
rsañadir!provincia = Text5.text
rsañadir!codigopostal = Text6.text
rsañadir!telefono = Text7.text
rsañadir!telefax = Text8.text
rsañadir!Email = Text9.text
rsañadir!idcliente = Text10.text
'esto sirve para grabar en la base de datos
rsañadir.Update
'esto sirve para cerrar
rsañadir.Close
adodatagrid.Refresh
frmclientes.Width = 5150
cmdañadir.Enabled = True
End Sub
Después de actualizar el ado actualiza también el datagrid, si lo tienes amarrado desde tiempo de diseño con eso bastara, después de hacer adodatagrid. Refresh pon la instrucción datagrid1. Refresh
rañadir.Bookmark = rsañadir.LastModified
Intenta con esta instrucción, según estuve leyendo los adodc no se actualizan hasta que se mueva el cursor, con esa instrucción posicionas el puntero del recordset hasta en el nuevo registro.
Debe ser cosa de brujas, porque si le doy que lo ejecute mediante F8 (es decir paso a paso) lo hace bien: cada vez que doy a grabar, inmediatamente añade ese registro al data grid
Pero si lo doy F5 actualiza el datagrid un registro después: me explico: el primer registro que grabo no lo refleja en el datagrid hasta que grabo el segundo registro y entonces muestra en el datagrid el primer registro y así sucesivamente (como que fuera uno por detrás actualizando en el datagrid)o bien me salgo de la aplicación y vuelvo a entrar y ya también me muestra el ultimo registro grabado
¿Tienes alguna idea de a que puede ser debido?
Si es cierto me confundí de controles eso aplica para el dao no para el ado que usas, prueba con esto después de agregar y actualizar has
rsañadir.update
'esta es la linea nueva
Rsañadir. Updatebatch
Porque update hace que se envíen los datos pero quedan en cache, y updatebatch envía los datos directamente a la base.
Ojala que con esto quede. Comprenderás que sin tener el proyecto en mis manos y sin poder hacer pruebas es más difícil.
Siento ser tan paliza pero ni por esas, he cambiado rsañadir. update por rsañadir.updatebatch y sigue actualizando un registro por detrás.
Si me das una dirección de correo y te parece bien te mando el proyecto y lo ejecutas
De nuevo mil gracias
Claro que si seria mejor así y más rapido para que pueda ver realmente como esta tu proyecto. mi correo es [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas