Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
[SOLUCIONADO] GridView Que Aumenta De Rows
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje [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 
calcena - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

 




===================
No podemos regresar
 
última edición por shordi el Lunes, 30 Julio 2018, 19:37; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
calcena - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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é.
 




===================
No podemos regresar
 
última edición por shordi el Martes, 31 Julio 2018, 09:40; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
calcena - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
calcena - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
calcena - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes [SOLUCIONADO] Affected Rows calcena General 7 Jueves, 26 Julio 2018, 17:59 Ver último mensaje
shordi
No hay nuevos mensajes [SOLUCIONADO] GridView SelectedCell calcena General 2 Sabado, 28 Julio 2018, 10:43 Ver último mensaje
calcena
No hay nuevos mensajes [SOLUCIONADO] Deseleccionar Row En Un Grid... calcena General 2 Jueves, 16 Agosto 2018, 13:48 Ver último mensaje
calcena
No hay nuevos mensajes Encabezados De GridView [SOLUCIONADO] elitedigital2005 General 22 Martes, 09 Julio 2019, 19:38 Ver último mensaje
gambafeliz
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron