Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: fx700 en Enero 02, 2011, 11:46:26 pm
-
He encontrado varios ejemplos en internet pero quisiera saber si alguien del foro comparte el codigo o funcion que utiliza en sus proyectos para la carga de los listview6 por que la verdad no me decido cual utilizar y tampoco soy experto como para examinar cual ejemplo va mas rapido y cual tiene el codigo mas optimizado y no hace tantos bucles.
Algo que no he podido hacer es como cargar las cabeceras una sola vez, osea darle el ancho y formato, por ejemplo en el evento form_activate o el que corresponda.
-
dim lItem as ListItems
do until recordset.EOF
set lItem = listview(,,recordset.data(1))
item.subitem(1) = recordset.data(2)
item.subitem(2) = recordset.data(3)
etc...
recordset.movenext
loop
fijate que onda, te lo escribie a lo INDIO
-
dim lItem as ListItems
do until recordset.EOF
set lItem = listview(,,recordset.data(1))
item.subitem(1) = recordset.data(2)
item.subitem(2) = recordset.data(3)
etc...
recordset.movenext
loop
fijate que onda, te lo escribie a lo INDIO
ese ejemplo esta bonito pero yo no lo usaria.....
yo uso este:
Sub rellenar()
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear
ListView1.ColumnHeaders.Add 1, , "", 250
ListView1.ColumnHeaders.Add 2, , "Ciclo", 600
ListView1.ColumnHeaders.Add 3, , "Carnet", 1100
ListView1.ColumnHeaders.Add 4, , "Grado", 2900
ListView1.ColumnHeaders.Add 5, , "Nombre", 3400
Do Until inscripcion.EOF
If inscripcion!sexo = "MASCULINO" Then
ListView1.ListItems.Add 1, , , , 1
End If
If inscripcion!sexo = "FEMENINO" Then
ListView1.ListItems.Add 1, , , , 2
End If
ListView1.ListItems(1).ListSubItems.Add 1, , inscripcion!ciclo
ListView1.ListItems(1).ListSubItems(1).Bold = True
If inscripcion!sexo = "FEMENINO" Then
ListView1.ListItems(1).ListSubItems(1).ForeColor = RGB(255, 145, 145)
End If
ListView1.ListItems(1).ListSubItems.Add 2, , inscripcion!Carnet
ListView1.ListItems(1).ListSubItems(2).Bold = True
If inscripcion!sexo = "FEMENINO" Then
ListView1.ListItems(1).ListSubItems(2).ForeColor = RGB(255, 145, 145)
End If
ListView1.ListItems(1).ListSubItems.Add 3, , inscripcion!grado
ListView1.ListItems(1).ListSubItems(3).Bold = True
If inscripcion!sexo = "FEMENINO" Then
ListView1.ListItems(1).ListSubItems(3).ForeColor = RGB(255, 145, 145)
End If
ListView1.ListItems(1).ListSubItems.Add 4, , inscripcion!nombre
ListView1.ListItems(1).ListSubItems(4).Bold = True
If inscripcion!sexo = "FEMENINO" Then
ListView1.ListItems(1).ListSubItems(4).ForeColor = RGB(255, 145, 145)
End If
inscripcion.MoveNext
Loop
este lo ocupo para hacerlo atractivo te dejo una pic de como se ve
(http://img34.imageshack.us/img34/4043/listview.png)
pero este es el codigo original....
Sub rellenar1()
ListView1.ColumnHeaders.Clear
ListView1.ListItems.Clear
ListView1.ColumnHeaders.Add 1, , "No.", 500
ListView1.ColumnHeaders.Add 2, , "Apellidos, Nombres", 3700
Do Until alumnos.EOF
ListView1.ListItems.Add 1, , alumnos!orden
ListView1.ListItems(1).ListSubItems.Add 1, , alumnos!nombre
alumnos.MoveNext
Loop
puedes hacer los filtrados antesde cargar el listview facilmente ya que el listview agarra el recordset que estas utilizando
por ejemplo
Private Sub PushButton1_Click()
dim alumnos as new adodb.recordset
'El termino Data es lo adodb.connection con cualquier proveedor de datos.
alumnos.open "Select * from Alumnos", Data, adOpenDynamic, adLockOptimistic
alumnos.filter = "nombre = 'Juan Arturo Sandoval'"
rellenar1
ahi sta.... cualquier cosa preguuuuuuuuuuuuuuuuuuuuuuuuuuuuuntame......
-
Es muy parecido al de wolf_kof, sin pretender robarle el crédito !!! ;D
Private Sub Form_Load()
'
'
'//
Set rcsMiembros = New ADODB.Recordset
'//
rcsMiembros.Open [Sentencia SQL] & " ORDER BY " & _
"[Primer Apellido] ASC;", [String de conexión], _
adOpenStatic, adLockReadOnly, adCmdText
'//
With lvwListado '// Listview... cragas los encabezados de las columnas, _
determinas el ancho de la columna y la alineación de _
la misma...
.View = lvwReport
.GridLines = True
.LabelEdit = lvwManual
.ColumnHeaders.Add , , "# Inscripción", 1300
.ColumnHeaders.Add , , "Cédula Id.", 1600, lvwColumnRight
.ColumnHeaders.Add , , "Nombres", 2500, lvwColumnLeft
.ColumnHeaders.Add , , "Apellidos", 2500, lvwColumnLeft
.ColumnHeaders.Add , , "Fecha de Nacimiento", 2100, lvwColumnRight
.ColumnHeaders.Add , , "Teléfono", 1500, lvwColumnLeft
'
'
'
'
End With
'// Sub para llenar el Listview enviandole el recordset...
LlenarListView rcsMiembros
End Sub
'// Esta subrutina se encarga de llenar el control ListView "lvwListado"...
Private Sub LlenarListView(rcsRec As ADODB.Recordset, bPrinc as boolean, Optional SQL _
As String = "SELECT * FROM [Miembros (Mayores de 18)] " & _
"ORDER BY [Primer Apellido] ASC;")
'
'//
With rcsRec
If bPrinc = True Then
If .State = adStateOpen Then
.Close
End If
.Open SQL, adoConnSCADIG, adOpenStatic, _
adLockReadOnly, adCmdText
End If
If Not (.BOF And .EOF) Then
lvwListado.ListItems.Clear
.MoveFirst
Do While Not .EOF
Set lstLi = lvwListado.ListItems.Add(, , _
Format(.Fields![Id Número], " " & "000000") & "")
lstLi.SubItems(1) = _
Format(.Fields![Cédula de Identidad], "0#,###") & ""
lstLi.SubItems(2) = .Fields![Primer Nombre] & " " & _
.Fields![Segundo Nombre] & ""
lstLi.SubItems(3) = .Fields![Primer Apellido] & " " & _
.Fields![Segundo Apellido] & ""
lstLi.SubItems(4) = .Fields![Fecha de Nacimiento] & ""
lstLi.SubItems(5) = Format(.Fields![Teléfono Celular], _
"@@@@-@@@@@@@") & ""
'
'
'
'
.MoveNext
Loop
Else
MsgBox "No existen registros que reunan estos requisitos !!!", _
vbExclamation + vbOKOnly, "No hay..."
End If
'
'
'
.Close
End With
End Sub
Espero que pueda servir de algo !!!
saludos !!! :)
-
Yo tengo estas funciones para usar ucListView casi automaticamente (funciona con el normal y con el mio xD)
En un modulo
Public Sub LV_Preparar(LV As ucListView)
Call LV.Initialize
Call LV.InitializeImageListHeader
Dim i As Integer
If LV.ColumnCount > 0 Then
For i = LV.ColumnCount To 0 Step -1
Call LV.ColumnRemove(i)
Next
End If
End Sub
Public Sub LV_Terminar(LV As ucListView)
With LV
Dim nCol As Integer
Dim lCol As Integer
lCol = LV.ColumnCount - 1
For nCol = 0 To lCol
.ColumnIcon(nCol) = -1
Next nCol
.FullRowSelect = True
.GridLines = True
.BorderStyle = bsThin
.ViewMode = [vmDetails]
.RaiseSubItemPrePaint = True ' Para poner efecto cebra en las filas
End With
End Sub
Public Sub LV_Rellenar(LV As ucListView, rsDatos As Recordset)
LV.Clear
Dim itemid As Integer
Dim i As Integer
Dim nCols As Integer
Dim s As String
nCols = LV.ColumnCount
Dim colLen() As eColumnAutosizeConstants
ReDim colLen(nCols)
itemid = 0
For i = 1 To nCols
colLen(i) = caHeader
Next
If nCols >= rsDatos.Fields.Count Then nCols = rsDatos.Fields.Count - 1
ReDim Preserve colLen(nCols)
While Not rsDatos.EOF
If IsNull(rsDatos(0)) Then s = "" Else s = rsDatos(0)
Call LV.ItemAdd(itemid, rsDatos(0), 0, 0)
For i = 1 To nCols
If IsNull(rsDatos(i)) Then s = "" Else s = rsDatos(i)
Call LV.SubItemSet(itemid, i, s, 0)
If colLen(i) = caHeader Then If Len(s) > Len(LV.ColumnText(i)) Then colLen(i) = caItem
Next
rsDatos.MoveNext
itemid = itemid + 1
Wend
For i = 1 To nCols
Call LV.ColumnAutosize(i, colLen(i))
If colLen(i) = caHeader Then LV.ColumnWidth(i) = LV.ColumnWidth(i) + 24
Next
End Sub
Public Sub LV_Ajustar(LV As ucListView)
Dim i As Integer
For i = 1 To LV.ColumnCount - 1
Call LV.ColumnAutosize(i, caHeader)
Next
End Sub
Uso:
Private Sub Form_Load()
' lstCli = ucListView en el formulario
Call LV_Preparar(lstCli)
With lstCli
Call .ColumnAdd("Nombre", 100, caLeft)
Call .ColumnAdd("Edad", 100, caLeft)
End With
Call LV_Terminar(lstCli)
Call CargarClientes
End Sub
Private Sub CargarClientes()
Dim rsDatos as Recordset
'' rellenan rsDatos
' Si la consulta salio bien (hay filas para mostrar)
Call RellenarListView(lstCli, rsDatos)
' Si la consulta dio vacia o salio mal
Call LV_Ajustar(lstCli)
End Sub
Private Sub lstCli_OnSubItemPrePaint(ByVal Item As Integer, ByVal SubItem As Integer, TextBackColor As Long, TextForeColor As Long, Process As Boolean)
' Efecto cebra!
If (Item Mod 2) Then
TextBackColor = RGB(220, 220, 220)
TextForeColor = RGB(0, 0, 0)
Process = True
End If
End Sub
Y listo :P
-
Gracias a todos me ha servido bastante.
Otra consulta como le hago para ponerle un progressbar en caso haya demaciados registros y si es factible poner una opcion para detener la ejecucion en caso por error se hayan llamado a miles de registros y el programa no se quede colgado.
Por ahi he visto un ejemplo de paginacion que tambien pretendo aplicar.
Saludos