|
Página 1 de 2
|
[SOLUCIONADO] GridView Que Aumenta De Rows
Autor |
Mensaje |
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
[SOLUCIONADO] GridView Que Aumenta De Rows
Buenas tengo varios GridViews y me sucede una cosa curiosa,
por ejemplo desde Form_load llamo al método CargarGrid(), todo correcto
pero luego desde por ejemplo:
Public Sub txtFiltro2_KeyRelease()
sFiltroTask = txtFiltro2.Text
rstResultado = cTareas.GetTaskByFilter(sFiltroTask)
CargarGrid()
End
y el grid crece en cuanto a rows, y no lo entiendo porque con el .Clear debería dejar inicializado el grid no???
Public Sub CargarGrid()
grvTareas.Clear
grvTareas.Columns.Count = rstResultado.Fields.Count - 1
grvTareas.Header = rstResultado.Fields.Count - 1
grvTareas.Columns[0].Title = "ID_TAREA"
grvTareas.Columns[1].Title = "COD_TAREA"
grvTareas.Columns[2].Title = "DESCRIPCION"
grvTareas.Columns[3].Title = ""
grvTareas.Columns[0].width = 0
grvTareas.Columns[0].Resizable = False
grvTareas.Columns[1].width = 100
grvTareas.Columns[1].Resizable = False
grvTareas.Columns[2].width = 425
grvTareas.Columns[2].Resizable = False
grvTareas.Columns[3].width = 25
grvTareas.Columns[3].Resizable = False
'::::::::::::::::::::::::::::::::::::::::::::::::::::
rstResultado.MoveFirst
Do While rstResultado.Available
grvTareas.Rows.Insert(i, 1)
grvTareas[i, 0].Text = rstResultado!ID_TAREA
grvTareas[i, 1].Text = rstResultado!COD_TAREA
grvTareas[i, 2].Text = rstResultado!DESCRIPCION
If rstResultado!ES_BAJA = "+" Then
grvTareas[i, 3].Picture = gConst.picBaja
Else If rstResultado!ES_CERRADO = "+"
grvTareas[i, 3].Picture = gConst.picCerrado
Else
grvTareas[i, 3].Picture = gConst.picActivo
End If
i += 1
rstResultado.MoveNext
Loop
End
Saludos ya me diréis qué hago mal.
última edición por calcena el Viernes, 10 Agosto 2018, 07:56; editado 1 vez
|
#1 Lunes, 30 Julio 2018, 16:59 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: GridView Que Aumenta De Rows
No es esa la manera de cargar datos en un GridView desde una tabla. La clase Gridview dispone del evento Data que se dispara cada vez que es necesario leer una celda o sincronizar una celda con la fuente de datos (result).
Te he hecho un pequeño ejemplo para que veas cómo funciona a grosso modo.
Descripción: |
|
Descargar |
Nombre del archivo: |
ejemploGridViewdesdetabla-0.0.1.tar.gz |
Tamaño: |
36.26 KB |
Descargado: |
25 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
ejemploGridViewdesdetabla-0.0.1.tar.gz |
Tamaño: |
36.26 KB |
Descargado: |
25 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
ejemploGridViewdesdetabla-0.0.1.tar.gz |
Tamaño: |
36.26 KB |
Descargado: |
25 veces |
=================== No podemos regresar
|
#2 Lunes, 30 Julio 2018, 19:32 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: GridView Que Aumenta De Rows
De todas formas el código es tan simple que no me resisto a colocarlo aquí para quien no quiera bajarse el archivo.
Creas un proyecto gráfico y en los componentes añades el gb.db y el gb.db.sqlite
Luego al fMain le estableces la propiedad Arrange a "Fill" y añades un gridview. Al gridview le asignas la propiedad header a "Horizontal" (dices que no te gustan las cabeceras de la izquierda), y la propiedad Expand a True, para que ocupe todo el form.
Naturalmente el tema de cómo se llama la base de datos y dónde está, tendrás que cambiarlo para la base de datos y la tabla que elijas.
Luego pegas éste código:
=================== No podemos regresar
última edición por shordi el Lunes, 30 Julio 2018, 19:37; editado 1 vez
|
#3 Lunes, 30 Julio 2018, 19:35 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: GridView Que Aumenta De Rows
okis muchas gracias, lo pruebo y os cuento.
Ya que estamos paso a preguntar sobre este tema una forma que tengo siempre de desarrollar y que aquí no la he visto mucho y no se si es correcta con Gambas.
Yo para los GridViews lo que suelo usar es, le paso por referencia el objeto [GRIDVIEW] a una función pública de la capa DAO que devuelve el objeto ya relleno.
Inidicar que esta forma de proceder he utilizado siempre desde .net (webforms y windowsforms).
Saludos.
|
#4 Martes, 31 Julio 2018, 08:30 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: GridView Que Aumenta De Rows
okis muchas gracias, lo pruebo y os cuento.
Ya que estamos paso a preguntar sobre este tema una forma que tengo siempre de desarrollar y que aquí no la he visto mucho y no se si es correcta con Gambas.
Yo para los GridViews lo que suelo usar es, le paso por referencia el objeto [GRIDVIEW] a una función pública de la capa DAO que devuelve el objeto ya relleno.
Inidicar que esta forma de proceder he utilizado siempre desde .net (webforms y windowsforms).
Saludos.
Si funciona, es correcta por definición
Pero es algo que contradice la filosofía de funcionamiento del propio GridView, que como ya has visto tiene su propio mecanismo de "relleno" a través del evento Data.
El GridView puede mostrar cualquier cosa, pero en su relación con las bases de datos muestra lo contenido en un Result. Enviar ese Result a una función pública de la capa DAO, etc. etc. sí me parece correcto (aunque ¿para qué cuando es tan fácil rellenarlo?), pero una vez recuperados los datos desde la BD, el Gridview es capaz él solito de manejarse sin problemas con ellos sin "salirse" del Form que lo contiene (cosa esa de "salirse" que, por otra parte, puede no ser muy deseable al infringir el principio de encapsulación de la POO)...
Reconozco que yo uso esa técnica de pasar un formulario para que me lo devuelvan "relleno" a una función pública pero la diferencia es que un formulario es algo "tonto" es decir no tiene incorporado ninguna manera para recuperar los datos por sí mismo... aunque no creo que costase mucho hacer una clase formulario heredada que lo tuviese, ahora que lo pienso... mmmm interesante cuestión, ahora que estoy de vacaciones...mmmm Lo pensaré.
=================== No podemos regresar
última edición por shordi el Martes, 31 Julio 2018, 09:40; editado 1 vez
|
#5 Martes, 31 Julio 2018, 09:38 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: GridView Que Aumenta De Rows
El tema DAO y todo eso esta bien pero siempre es util si tenes que sacar datos de una base de datos pero los gridviews tambien sriven para trabajar con datos desde otra fuente, ya sea generados por algun algoritmo o extraidos desde un archivo de texto por ejemplo.
Dicho esto, yo sugiero que uses el método que te indica Shordi del evento data. Paso a explicar algunas cosas que a mi me resultaron útiles y practicas.
' Aca pongo las filas del grid a cero y luego le pongo las filas que sean necesarias segun los registros o la filas de texto.Este método obliga a gambas a lanzar el evento Data.
grwData.Rows.Count = 0
' Luego pongo las cantidades de columnas así
grwData.Columns.Count = 3
' y las cantidades de filas así, y es en este punto donde "salta" el evento data
grwData.Rows.Count = 4
'Luego en el evento Data pones todo el codigo de relleno del grid de esta manera
Public Sub grwData_Data(Row As Integer, Column As Integer)
' Desde un resul de bases de datos, en este ejemplo "resultado" y desde este sacas los nombres de los campos con el metodo .fields
resultado.MoveTo(Row)
Select Column
grwData.Data.Text = resultado[resultado.Fields[Column]]
End Select
' Desde un archivo CSV
For each renglon in split(file.load(/home/user/tuarchivo.csv),"\n")
for each celda in split(renglon,"\t") ' Para el caso de texto separado por tabuladores
grwData.Data.Text = celda
Next
Next
End
Saludos.
|
#6 Martes, 31 Julio 2018, 16:11 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: GridView Que Aumenta De Rows
Buenas paso a exponer mis avances y problemas sobre este tema, he decidido hacerlo como siempre hago, pasando por parámetro el objeto y recuperando uno lleno, y pasando el Resulset.
Public Sub Form_Open()
Dim n As Integer = 0
Me.Title = "Tareas"
IniBuscadores()
rstResultado = cTareas.GetTaskByFilter(sFiltroTask)
grvTareas = cTareas.GetGrid(grvTareas, rstResultado)
End
En la clase cTareas
Public Sub GetGrid(ByRef objGridView As GridView, rstResultado As Result)
Dim objResultado As GridView
Dim i As Integer = 0
objGridView.Clear()
objGridView.Columns.Count = rstResultado.Fields.Count - 1
objGridView.Header = rstResultado.Fields.Count - 1
objGridView.Columns[0].width = 0
objGridView.Columns[0].Resizable = False
objGridView.Columns[1].width = 100
objGridView.Columns[1].Resizable = False
objGridView.Columns[2].width = 425
objGridView.Columns[2].Resizable = False
objGridView.Columns[3].width = 25
objGridView.Columns[3].Resizable = False
'::::::::::::::::::::::::::::::::::::::::::::::::::::
rstResultado.MoveFirst
Do While rstResultado.Available
objGridView.Rows.Insert(i, 1)
objGridView[i, 0].Text = rstResultado!ID_TAREA
objGridView[i, 1].Text = rstResultado!COD_TAREA
objGridView[i, 2].Text = rstResultado!DESCRIPCION
If rstResultado!ES_BAJA = "+" Then
objGridView[i, 3].Picture = gConst.picBaja
Else If rstResultado!ES_CERRADO = "+"
objGridView[i, 3].Picture = gConst.picCerrado
Else
objGridView[i, 3].Picture = gConst.picActivo
End If
i += 1
rstResultado.MoveNext
Loop
End
Hasta aquí todo muy correcto, en el load la cosa va de lujo.
Ahora viene el problema (que no comprendo porque es el mismo principio)
Tengo un filtro el cual (aunque no sea muy correcto por tema de rendimiento concurrente) al pulsar una tecla recarga la GridView, para lo que realizo lo siguiente:
Public Sub txtFiltro2_KeyRelease()
sFiltroTask = txtFiltro2.Text
rstResultado = cTareas.GetTaskByFilter(sFiltroTask)
grvTareas = cTareas.GetGrid(grvTareas, rstResultado)
End
Pues bién el problema es que me dice que mi GridView (grvTareas) es NULL cuando si que existe, lógicamente.
¿Dónde está el problema? ¿dónde está la pelotita....?
Saludos y gracias como siempre.
Esta forma de desarrollo la veo, no se porque más clarificadora ya que cada Clase implementa su devolución de objetos (DropDown, ListView....)
última edición por calcena el Jueves, 09 Agosto 2018, 12:56; editado 2 veces
|
#7 Martes, 31 Julio 2018, 16:12 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: GridView Que Aumenta De Rows
Nada he probado a pasarlo como método en vez de como función pero no consigo que el grid me quede limpio para el reinicio del mismo.
He probado con Clear, con Refresh()
Alguien saber como puedo dejar reiniciado un gridview para poder pasarlo por referencia y que se cargue correctamente.
Esta misma metodología la he utilizado en otros lenguajes y siempre funciona correctamente, algo hay en el reinicio del componente que no hago bien.
Saludos.
Os incluyo una imagen del resultado de las pruebas y el código, el problema sigue residiendo en el momento de teclear para realizar un filtrado.
Public Sub txtFiltroUsuarios_KeyRelease()
sFiltro = txtFiltroUsuarios.Text
rstResultado = cUsuarios.GetUsers(sFiltro, sEstado)
grvUsuarios = cUsuarios.GetGrid(grvUsuarios, rstResultado)
End
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Public Function GetUsers(sFiltro As String, sEstado As String) As Result
Dim rstResultado As Result
Dim sSql As String = Null
sSql = "SELECT "
sSql &= "U.ID_USUARIO, "
sSql &= "U.COD_USUARIO, "
sSql &= "U.NOMBRE, "
sSql &= "U.APELLIDO1, "
sSql &= "U.APELLIDO2, "
sSql &= "R.NOMBRE RNOMBRE, "
sSql &= "U.ES_BAJA "
sSql &= "FROM USUARIOS U "
sSql &= "INNER JOIN ROLES R "
sSql &= "ON U.ID_ROL = R.ID_ROL "
sSql &= "WHERE (U.COD_USUARIO LIKE '%" & sFiltro & "%' OR U.NOMBRE LIKE '%" & sFiltro & "%' OR U.APELLIDO1 LIKE '%" & sFiltro & "%' OR U.APELLIDO2 LIKE '%" & sFiltro & "%' OR R.NOMBRE LIKE '%" & sFiltro & "%')"
sSql &= "AND U.ES_BAJA LIKE '" & sEstado & "'"
conn = gConexion.ConectarDB()
rstResultado = conn.Exec(sSql)
Return rstResultado
End
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Public Function GetGrid(objGrid As GridView, rstResultado As Result) As GridView
Dim objGridView As GridView = objGrid
Dim i As Integer = 0
objGridView.Columns.Count = rstResultado.Fields.Count
objGridView.Header = rstResultado.Fields.Count
objGridView.Columns[0].width = 0
objGridView.Columns[0].Resizable = False
objGridView.Columns[1].Title = "COD_USUARIO"
objGridView.Columns[1].width = 100
objGridView.Columns[1].Resizable = False
objGridView.Columns[2].Title = "NOMBRE"
objGridView.Columns[2].width = 125
objGridView.Columns[2].Resizable = False
objGridView.Columns[3].Title = "APELLIDO1"
objGridView.Columns[3].width = 125
objGridView.Columns[3].Resizable = False
objGridView.Columns[4].Title = "APELLIDO2"
objGridView.Columns[4].width = 125
objGridView.Columns[4].Resizable = False
objGridView.Columns[5].Title = "ROL"
objGridView.Columns[5].width = 125
objGridView.Columns[5].Resizable = False
objGridView.Columns[6].width = 25
objGridView.Columns[6].Resizable = False
rstResultado.MoveFirst
Do While rstResultado.Available
objGridView.Rows.Insert(i, 1)
objGridView[i, 0].Text = rstResultado!ID_USUARIO
objGridView[i, 1].Text = rstResultado!COD_USUARIO
objGridView[i, 2].Text = rstResultado!NOMBRE
objGridView[i, 3].Text = rstResultado!APELLIDO1
objGridView[i, 4].Text = rstResultado!APELLIDO2
objGridView[i, 5].Text = rstResultado!RNOMBRE
If rstResultado!ES_BAJA = "+" Then
objGridView[i, 6].Picture = gConst.picBaja
Else
objGridView[i, 6].Picture = gConst.picActivo
End If
i += 1
rstResultado.MoveNext
Loop
Return objGridView
End
última edición por calcena el Jueves, 09 Agosto 2018, 16:11; editado 3 veces
|
#8 Jueves, 09 Agosto 2018, 12:58 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: GridView Que Aumenta De Rows
Llevas una línea... "atípica" de desarrollo del tema, propia de otro tipo de lenguajes, por tanto lo que te vaya surgiendo muchas veces será casi único y al final puedes encontrarte navegando en aguas desconocidas.
Tu código, por definición, debe ser lento y engorroso (salvo que sólo manejes unas pocas líneas, con lo que quedaría disimulado).
Sobre lo que preguntas... ¿Has probado a destruir el objeto (Grid=null) y crearlo otra vez grid=new gridview?
=================== No podemos regresar
|
#9 Jueves, 09 Agosto 2018, 17:45 |
|
|
calcena
Ingeniero Programador
Registrado: Julio 2016
Mensajes: 272
Edad: 47
|
Re: GridView Que Aumenta De Rows
Llevas una línea... "atípica" de desarrollo del tema, propia de otro tipo de lenguajes, por tanto lo que te vaya surgiendo muchas veces será casi único y al final puedes encontrarte navegando en aguas desconocidas.
Tu código, por definición, debe ser lento y engorroso (salvo que sólo manejes unas pocas líneas, con lo que quedaría disimulado).
Sobre lo que preguntas... ¿Has probado a destruir el objeto (Grid=null) y crearlo otra vez grid=new gridview?
Buenas shordi, bueno no entiendo lo que comentas de que por definición debe ser lento y engorroso, al final es separar por capas la aplicación que en OOP se utiliza normalmente, he probado tu forma de hacerlo pero el problema que tengo es que si mi variable rstResultado se vuelve a reaprovechar con otro método se vuelve a ejecutar la recarga del método _DATA.
Tal como se ve en la imagen que he adjuntado, lo que pretendo es que pulsando sobre el textbox (que lo paso como parámetro) se filtren los resultados. Pues con todos lo que he testeado nada de nada.
Alguna idea para este tipo de problema?
Tu ejemplo Shordi va muy bien pero al no tener filtro no es la misma problemática.
Respecto a tu propuesta:
me dice el compilador : NOT ENOUGH ARGUMENTS.....se necesita algún argumento en concreto para instanciar un GridView nuevo??
Saludos.
última edición por calcena el Jueves, 09 Agosto 2018, 18:01; editado 2 veces
|
#10 Jueves, 09 Agosto 2018, 17:56 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|