calcena   26-07-2020, 11:58
#1
Buenas compañeros, una consulta, tengo unos desarrollos en los cuales para armar el contenido de un gridview paso el objeto por referencia para que en una función o método se construya y se rellene.
Bien este objeto lo primero que debe hacerse es formatearse para quedarse en blanco, bien pues para esto siempre tengo que acudir a la ayuda de una función que me hace una iteración dentro del control por las filas y columnas borrando el contenido.
No existe otra forma más ágil dentro del propio control que realice este formateo, he probado con .Clear pero esto me elimina el contenido pero NO me elimina las celdas que quedan vacías y se siguen acumulando hasta el infinito.
Código:
Public Function getErrores(ByRef objGridView As GridView) As GridView
 
  Dim iRow As Integer = 0
 
  rstResult = getResult()

  borrarGridView
 
  objGridView.Columns.Count = rstResult.Fields.Count
 
  objGridView.Rows.Height = 35
  objGridView.Header = rstResult.Fields.Count
 
  objGridView.Columns[0].Title = "Id"
  objGridView.Columns[0].Width = 0
  objGridView.Columns[0].Resizable = False
  objGridView.Rows[0].TextAlignment = 3
 
  objGridView.Columns[1].Title = "Estado"
  objGridView.Columns[1].Width = 42
  objGridView.Columns[1].Resizable = False
  objGridView.Rows[1].TextAlignment = 3
 
  objGridView.Columns[2].Title = "Fecha"
  objGridView.Columns[2].Width = 80
  objGridView.Columns[2].Resizable = False
  objGridView.Rows[2].TextAlignment = 3
 
  objGridView.Columns[3].Title = "Usuario"
  objGridView.Columns[3].Width = 80
  objGridView.Columns[3].Resizable = False
  objGridView.Rows[3].TextAlignment = 3
 
  objGridView.Columns[4].Title = "Formulario"
  objGridView.Columns[4].Width = 80
  objGridView.Columns[4].Resizable = False
  objGridView.Rows[4].TextAlignment = 3
 
  objGridView.Columns[5].Title = "Mensaje"
  objGridView.Columns[5].Width = 150
  objGridView.Columns[5].Resizable = False
  objGridView.Rows[5].TextAlignment = 3
 
  objGridView.Header = 3
  objGridView.Header = GridView.Horizontal
 
  rstResult.MoveFirst
 
  Do While rstResult.Available
    objGridView.Rows.Insert(iRow, 1)
    objGridView[iRow, 0].Text = rstResult!Id
    objGridView[iRow, 1].Text = rstResult!Estado
    objGridView[iRow, 2].Text = rstResult!FechaMod
    objGridView[iRow, 3].Text = rstResult!Usuario
    objGridView[iRow, 4].Text = rstResult!Formulario
    objGridView[iRow, 5].Text = rstResult!Mensaje
    
    iRow += 1
    rstResult.MoveNext
  Loop
 
  Return objGridView
 
End
Código:
Public Sub borrarGridView(ByRef objGridView As GridView)
 
  Dim x As Integer
 
  For x = objGridView.Rows.Count - 1 To Step -1
    objGridView.Rows.Remove(x, 1)
  Next
 
End

Se aceptan sugerencias de optimización y agilidad del proceso.

Saludos y gracias.
Última modificación: 26-07-2020, 12:50 por jguardon.
gambafeliz   26-07-2020, 16:43
#2
Perdón si te suela como tontería.

1. Y si destruyes el objeto GridView y lo creas nuevamente
2. o rows.count = 0

Pero creo que en el punto 2 debes poner GridView.Clear en su definición del GridView de nuevo. Algo como en vez de tu sub borrarGridView pues un sub para definirGridView cada vez que deseas borrarlo y cargarlo nuevamente.

Bueno espero que sirva de algo.
Última modificación: 26-07-2020, 16:48 por gambafeliz.
vuott   26-07-2020, 17:31
#3
calcena, tengo una curiosidad: porqué usaste ByRef ?

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
cogier   26-07-2020, 17:41
#4
Considere este código para limpiar y reconstruir la GridView

Código:
Public Sub Build()

  Dim sTitle As String[] = ["ID", "Estado", "Fecha", "Usuario", "Mensaje"]
  Dim iLoop As Integer

  With objGridView
    .Clear
    .Rows.Count = 0
    .Columns.Count = sTitle.Count
    .Header = GridView.Both
  End With

  For iLoop = 0 To sTitle.Max
    objGridView.Columns[iloop].Title = sTitle[iLoop]
    objGridView.Columns[iLoop].Resizable = False
    objGridView.Rows[iLoop].TextAlignment = 3
  Next

End

Ahora agregue sus datos y termine con: -

objGridView.Columns.Width = -1

Esto ajustará automáticamente el ancho de las columnas
Última modificación: 26-07-2020, 18:13 por jguardon.
calcena   26-07-2020, 20:44
#5
(26-07-2020, 17:31)vuott escribió: calcena, tengo una curiosidad: porqué usaste ByRef ?


Buenas, para poder pasar el objeto por referencia.

Para que el objeto se devuelva con sus valores.

Saludos

(26-07-2020, 17:41)cogier escribió: Considere este código para limpiar y reconstruir la GridView

Código:
Public Sub Build()

  Dim sTitle As String[] = ["ID", "Estado", "Fecha", "Usuario", "Mensaje"]
  Dim iLoop As Integer

  With objGridView
    .Clear
    .Rows.Count = 0
    .Columns.Count = sTitle.Count
    .Header = GridView.Both
  End With

  For iLoop = 0 To sTitle.Max
    objGridView.Columns[iloop].Title = sTitle[iLoop]
    objGridView.Columns[iLoop].Resizable = False
    objGridView.Rows[iLoop].TextAlignment = 3
  Next

End

Ahora agregue sus datos y termine con: -

objGridView.Columns.Width = -1

Esto ajustará automáticamente el ancho de las columnas

Perfecto!! funciona de mararvilla, solo había probado con clear y con destroy etc ....

Gracias
Última modificación: 26-07-2020, 20:48 por calcena.
vuott   26-07-2020, 23:41
#6
Si usas ByRef no necesita el Return en la función 'getErrores'.
Es decir:
[code]

...y más, siendo el identificador 'objGridView' un Puntero al Objeto del tipo 'GridView', para pasarlo por Dirección a la función, tampoco es necesaria la palabra ByRef.

« Los horizontes perdidos nunca regresan. » (F. Battiato, 1983)

« Las ondas nunca regresan. » (Genesis: Ripples, 1976)

« Vita non suavis esse potest, nec Mors amara. »  (...vuott)
calcena   27-07-2020, 11:41
#7
(26-07-2020, 23:41)vuott escribió: Si usas ByRef no necesita el Return en la función 'getErrores'.
Es decir:
[code]

...y más, siendo el identificador 'objGridView' un Puntero al Objeto del tipo 'GridView', para pasarlo por Dirección a la función, tampoco es necesaria la palabra ByRef.

Ok Vuott el tema Return y definir una función ha sido un error de copiar internamente en mi código, lo que pensaba es que el byref era necesario para saber cuando es un objeto de referencia (se modifica el resultado del que pasamos y lo devolvemos como objeto modificado) a cuando es por valor ( se pasa siempre uno nuevo y se modifica)

modificaré lo que comentas, gracias.

Saludos.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.