[SOLUCIONADO] GridView Que Aumenta De Rows


Ir a la página 1, 2  Siguiente

Objetivo: [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
Perfil MP  
Objetivo: 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.


ejemploGridViewdesdetabla-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: ejemploGridViewdesdetabla-0.0.1.tar.gz
Tamaño: 36.26 KB
Descargado: 25 veces
ejemploGridViewdesdetabla-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: ejemploGridViewdesdetabla-0.0.1.tar.gz
Tamaño: 36.26 KB
Descargado: 25 veces
ejemploGridViewdesdetabla-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: ejemploGridViewdesdetabla-0.0.1.tar.gz
Tamaño: 36.26 KB
Descargado: 25 veces

Perfil MP  
Objetivo: 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:

' gambas class file

Private hcon As Connection
Private r As Result

Public Sub Form_Open()

Dim t As Table
Dim n As Integer

If Not Exist(User.Home &/ "centros.db") Then
Copy "centros.db" To User.home &/ "centros.db" 'Copiamos la base de datos al home del usuario si no existe
Wait 0.5
Endif
hcon = New Connection
hcon.type = "sqlite"
hcon.host = User.home
hcon.name = "centros.db"
hcon.Open
r = hcon.Exec("Select * from centros")
If Not r.available Then
Message("No hay datos")
Return
Endif
GridView1.columns.count = r.fields.count 'Tantas filas y columnas como registros y campos
GridView1.Rows.Count = r.Count
For n = 0 To gridview1.Columns.Count - 1
gridview1.Columns[n].title = r.Fields[n].name 'Para el ejemplo ponemos como cabecera el nombre del campo
gridview1.Columns[n].Expand = True 'las columnas de ancho variable para que se ajusten al ancho disponible
Next

End

Public Sub GridView1_Data(Row As Integer, Column As Integer)

Dim n As Integer

r.MoveTo(row)
gridview1[row, column].Text = r[r.Fields[Column].name] 'Actualizamos la celda con el contenido del Result
If row Mod 2 = 0 Then gridview1[row, column].Background = Color.Background 'Si es fila par el fondo oscuro

End


Public Sub Form_Close()

If Exist(User.Home &/ "centros.db") Then
Kill User.home &/ "centros.db" 'Borramos la base de datos para no dejar basura
Endif

End

última edición por shordi el Lunes, 30 Julio 2018, 19:37; editado 1 vez
Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: Re: GridView Que Aumenta De Rows
calcena escribió: [Ver mensaje]
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é.

última edición por shordi el Martes, 31 Julio 2018, 09:40; editado 1 vez
Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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
Perfil MP  
Objetivo: 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.


gestionproyectos



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
Perfil MP  
Objetivo: 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?

Perfil MP  
Objetivo: Re: GridView Que Aumenta De Rows
shordi escribió: [Ver mensaje]
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:

grvUsuarios = Null
grvusuarios = New GridView



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
Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.5706s (PHP: -66% SQL: 166%)
Consultas SQL: 51 - Debug off - GZIP Activado