PDA

Vollständige Version anzeigen : ListView


aw70jr
02.07.2002, 10:06
Hallo,

ich habe in einem Formular ein ListView 6.0(SP4)mit Checkboxen, welches ich per SQL fülle. Funktioniert wunderbar, solange die Einträge innerhalb des ListView angezeigt werden könne. Eigentlich hätte ich erwartet, dass automatisch eine Scrollbar erscheint, wenn das Ende des ListView erreicht ist, tuts aber nicht !
Vielleicht hat ja jemand ne Idee !

immelmann
03.07.2002, 08:02
Hallo,
läuft Dein ListView im Report-Modus mit den Checkboxen? Im Report-Modus werden automatisch Bildlaufleisten eingeblendet, wenn viele DS vorhanden sind.

Gruß Torsten

aw70jr
03.07.2002, 08:20
Hoi,

nein, lief nicht im Report-Modus. Hab es geändert, jetzt zeigt er mir gar keine Daten an!
Ich habe folgende Properties eingestellt:

MousePointer ccDefault
View lvwReport
Arrange lvwAutoLeft
LabelEdit lvwManual
BorderStyle ccFixedSingle
Appearance cc3D
OLEDragMode ccOLEDragManual
OLEDropMode ccOLEDropNone

Multiselect ja
Enabled ja
Checkboxes ja
FlatScrollbar ja

so werden keine Daten angezeigt, ändere ich View auf lvwSmallIcon, werden für den gleichen Datensatz die entsprechenden Einträge angezeigt.

immelmann
03.07.2002, 10:55
Hallo,
ich hoffe, Du hast die üblichen Prozeduren zum ListView füllen eingebaut. Also Spaltenüberschriften zuerst festgelegt und danach in einer Schleife die ListItems aus einem Recordset nacheinander eingelesen (Add).

Ich habe Deine Eisntellungen ma übernommen und meine Daten sind alle vorhanden.

Gruß Torsten

aw70jr
03.07.2002, 11:45
Hm,

das Befüllen funktioniert einwandfrei, ich bekomme die Daten ja angezeigt (außer bei lvwReport)! Komischerweise funktioniert das mit der Scrollbar bei einem Listview 5.0 (SP2) einwandfei, allerdings habe ich dann keine Checkboxen ! Habe auch schon versucht, die Einstellungen genau gleich wie bei dem ListView 5.0 zu machen, leider auch ohne Erfolg.
Bin im Moment ziemlich ratlos !

immelmann
03.07.2002, 12:32
Ich verwende auch das ListView SP4.
Meine Version ist 6.00.8862.

Gruß Torsten

aw70jr
03.07.2002, 12:36
könntest Du den Code zum initialisieren des ListViews mal posten? Wäre nett !

Gruß
Andreas

immelmann
03.07.2002, 13:57
Hier also ein Grundgerüst:

Dim lvwDB As Database
Dim lvwRs As Recordset
Dim mItem As ListItem

'Spaltenüberschriften definieren
BestellListe.ColumnHeaders.Clear BestellListe.ColumnHeaders.Add , , "Bestellnummer", 1300
BestellListe.ColumnHeaders.Add , , "Kunde", 3500
BestellListe.ColumnHeaders.Add , , "Datum", 1100
BestellListe.ColumnHeaders.Add , , "für Auftrag", 1200
Me![BestellListe].ListItems.Clear

Set lvwDB = CurrentDb()

' Datenquelle ist eine Abfrage ggf. reduzieren durch Feldauswahl im SQL-String
Set lvwRs = lvwDB.OpenRecordset("SELECT * FROM [Bestell_Verwaltung];", dbOpenForwardOnly)

' ListView füllen bis EOF vom Recordset
Do Until lvwRs.EOF
Set mItem = Me![BestellListe].ListItems.Add(, , lvwRs![BESTELLUNG_ID])
mItem.SubItems(1) = lvwRs![FIRMENNAME1]
mItem.SubItems(2) = Format(DateValue(lvwRs![BESTELLUNG_DATUM]), "yyyy\ mm\ dd\")
mItem.SubItems(3) = lvwRs![AUFTRAG_NR]
mItem.Key = "ID" & lvwRs![BESTELLUNG_ID]
lvwRs.MoveNext
Loop

lvwRs.Close
Set lvwRs = Nothing

Die Feldbezeichner sind aus meiner Abfrage. Aber so müßte es sinngemäß laufen.

Gruß Torsten

aw70jr
03.07.2002, 14:10
Bin am verzweifeln!!
Ich fülle es mit folgendem Code:
Private Sub Form_Current()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sqlStr
Dim frm As Form

Set frm = Forms("Spec")
Set db = CurrentDb

Me.designn = frm.Controls("Designnum")
'Me.Muster = "10002"
Me.Muster = Me.OpenArgs

sqlStr = "SELECT tspec.DESIGNNUM, tspec.CARDNUMBER, tspec.aktztext, tspec.zeichnungsart "
sqlStr = sqlStr & "FROM tspec "
sqlStr = sqlStr & "WHERE (((tspec.CARDNUMBER)="""
sqlStr = sqlStr & Me.Muster
sqlStr = sqlStr & """));"

Set rs = db.OpenRecordset(sqlStr)

rs.MoveFirst
Me.lv2.ListItems.Clear

While Not rs.EOF
itext = "Zeichnung: "
itext = itext & rs.Fields(0)
itext = itext & " aktuelle Zeichnung: "
itext = itext & rs.Fields(2)
itext = itext & " Art: "

Select Case rs.Fields(3)
Case 1
art = "Einzelnutzen"
Case 2
art = "Nutzenanordnung"
Case 3
art = "Werkzeug"
End Select

itext = itext & " "
itext = itext & art


Me.lv2.ListItems.Add , , itext, 1
rs.MoveNext
Wend

'ListIndex auslesen
lindex = Me.lv2.ListItems.Count
i = 1
conti = 1

'Checkboxen vorbelegen
For i = 1 To lindex
zeichnung = Mid(Me.lv2.ListItems(i).Text, 12, 8)

For conti = 1 To 10
contname = "z" & conti
If zeichnung = frm.Controls(contname) Then
Me.lv2.ListItems(i).Checked = True
Exit For
Else
Me.lv2.ListItems(i).Checked = False
End If
Next conti
Next i


End Sub

Das funktioniert wunderbar, ist nicht das Problem. Nur die Scrollbar wird immer noch nicht angezeigt, wenn zu viele Einträge vorhanden sind!
Es kann doch nicht an den fehlend Überschriften liegen!?!

immelmann
03.07.2002, 16:08
Hallo,
ich denke mal doch, daß es an den fehlenden Überschriften liegt, da Du ja den Report-mode benutzt.
Bau doch einfach mal welche ein. Wenn es klappt, dann Doppelklick auf das ListView im Design-Modus und aktiviere "HideColumnHeaders".

Gruß Torsten

aw70jr
04.07.2002, 12:04
Jetzt habe ich es mit den Überschriften versucht, mit dem Ergebnis, dass die Liste nach unten verlängert wurde, aber keine Scrollbar erscheint!
Somit kann ich die ListItems die "unten" dran hängen nicht erreichen.

Ich glaub, ich gebs langsam auf

immelmann
04.07.2002, 12:32
Stimmt die VersionsNr?

aw70jr
05.07.2002, 11:53
Welche Versionsnummer?

immelmann
05.07.2002, 12:33
die von mscomctl.ocx

aw70jr
08.07.2002, 07:50
Die Versionsnummer ist 6.00.8862

dänu
15.10.2002, 08:57
Wie fülle ich ein ListView mit SQL?

falls es jemand interessiert: Die Scrollbars erscheinen wenn man die Eigenschaft FlatScrollBar deaktiviert.

gruss dänu

Nouba
15.10.2002, 10:50
Hallo zusammen,

ich benutze zum Füllen von ListViews in Reportansicht folgende Methode<font face="Courier New, Courier, monospace">Private Sub NeueListViewZeile( _
ByVal vvarEinDing As Variant, _
ParamArray WeitereEintraege() As Variant)
Dim SpaltenEintrag As ListItem
Dim lngIndex As Long

Set SpaltenEintrag = Me!lvwTest.ListItems.Add(, , vvarEinDing)

If UBound(WeitereEintraege) > -1 Then
For lngIndex = 0 To UBound(WeitereEintraege)
SpaltenEintrag.SubItems(lngIndex + 1) = WeitereEintraege(lngIndex)
Next lngIndex
End If
End Sub

Private Sub SetzeKopfzeile(Level As Integer)
With Me!lvwTest.ColumnHeaders
.Clear

Select Case Level
Case 1
.Add , , "Kundenname", 3500
Case 2
.Add , , "Bestellschein-Nr", 1400
.Add , , "Datum", 1300, lvwColumnCenter
Case 3
.Add , , "Bestell-Nr", 2000
.Add , , "Preis", 1000, lvwColumnRight
.Add , , "Menge", 1000, lvwColumnRight
End Select
End With
Me!lvwTest.HideColumnHeaders = False
End Sub

Private Sub cmdBestellschein_Click()
ZeigeBestellschein
End Sub

Private Sub ZeigeBestellschein()
Dim rs As DAO.Recordset

Me!lvwTest.ListItems.Clear
SetzeKopfzeile 2

Set rs = CurrentDb.OpenRecordset("qlkpBestellscheine", dbOpenSnapshot)
With rs
Do While Not rs.EOF
NeueListViewZeile rs(1), rs(2)
.MoveNext
Loop
.Close
End With
Set rs = Nothing
End Sub</font>

dänu
15.10.2002, 12:54
hallo nouba,

wenn ich das richtig verstehe könnte ich hier, beim Fettgedruckten (Set rs = CurrentDb.OpenRecordset("qlkpBestellscheine", dbOpenSnapshot)),
meine dynamische Abfrage einfügen, die ich so bestimme:
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.CreateQueryDef(strTabelle, strAbfrageSQL) ' Abfrage erzeugen
DoCmd.OutputTo acOutputQuery, qdf.Name, "MicrosoftExcel(*.xls)", "C:\test.xls", False, ""
CurrentDb.QueryDefs.Delete qdf.Name' Abfrage löschen


könnte ich beim Fettgedruckten einfach "qdf.name" einfügen und den restlichen Code so in etwa von dir übernehmen und dann sollte es laufen?

für hilfe dank
dänu

Nouba
15.10.2002, 13:06
Hallo Dänu,

da kann auch direkt der SQL-String strSQLAbfrage rein oder der Name einer beliebigen Tabelle/Abfrage.

Dein Zitat ist aus dem Zusammenhang gerissen und hat mit dem ListView nichts zu tun, sondern bezog sich nur auf die Methode DoCmd.OutPutTo, die IMO keinen SQL-String verarbeiten kann. Deswegen der Umweg über eine temporäre Abfrage.

dänu
15.10.2002, 13:26
hallo nouba,
sorry, habe ein bisschen komisches zeugs gepostet.

also da ich die temp-Abfrage "Set qdf = CurrentDb.CreateQueryDef(strTabelle, strAbfrageSQL)" sowieso brauche, könnte ich einfach qdf.Name dort einfügen?
ich habe die ColumnHeader schon eingefügt, kann ich also die Sub "SetzeKopfzeile" auslassen oder klappt es sonst nicht ganz?
For lngIndex = 0 To UBound(WeitereEintraege)
SpaltenEintrag.SubItems(lngIndex + 1) = WeitereEintraege(lngIndex)
Next lngIndex dieser Code sieht irgendwie so aus, als ob nur eine Spalte erstellt wird. Oder werden die anderen benötigten Spalten automatisch eingefügt? bisher habe ich für weitere Spalten immer Items.SubItem(x) verwendet. ist dies nicht mehr nötig?

für deine Mühe danke ich im voraus
MfG
Dänu

Nouba
15.10.2002, 13:41
Hallo Dänu,

wie Du das mit den Kopfzeilen machst, bleibt Dir überlassen.

Der Prozedur NeueListViewZeile muß der erste Parameter vvarEinDing übergeben werden, alle weiteren Parameter sind optional und werden in einer Schleife über das Array WeitereEintraege als Subitems eingetragen.

dänu
15.10.2002, 15:08
danke nouba,
was würde ich nur ohne deine Unterstützung machen ;) .
hätte ich meine ListViews nur von Anfang an so gefüllt.
gruss dänu