Announcement

Collapse
No announcement yet.

Invalid Property Value ??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Invalid Property Value ??

    Hallo,
    ich will eine ListBox mit Daten aus einer Tabelle eines SQL-Servers füllen...

    Allerdings bekommt ich nach dem ersten Eintrag einen Fehler: Invalid Property Value...

    Ich bin total aufgeschmisse, da ich nciht verstehe warum das nicht funktioniert

    Hier der Code:

    Option Compare Database



    Private Sub fuellen_Click()
    On Error GoTo ProcErr

    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim lvxobj As MSComctlLib.ListView
    Dim lstItem As MSComctlLib.ListItem
    Dim i As Integer
    Dim strSQL As String

    Set conn = CurrentProject.Connection


    strSQL = "SELECT [ComputerIP], [Computername], [Benutzername], [Zeitstempel], [Domain], [Url] " & _
    "FROM tblSESecurePointDaten " & _
    "GROUP BY [ComputerIP], [Computername], [Benutzername], [Zeitstempel], [Domain], [Url] " & _
    "ORDER BY [Zeitstempel]"


    rs.Open strSQL, conn, adOpenKeyset

    Set lvxobj = Me.liste.Object
    lvxobj.ListItems.Clear


    If rs.BOF Then
    Else
    rs.MoveFirst

    While Not rs.EOF
    For i = 0 To rs.Fields.Count
    If i = 0 Then
    Set lstItem = lvxobj.ListItems.Add(, , rs(i))

    ElseIf i < rs.Fields.Count Then
    lstItem.SubItems(i) = rs(i)
    End If
    Next i
    rs.MoveNext
    Wend
    End If

    rs.Close

    ProcExit:
    Exit Sub

    ProcErr:
    gShowRunTimeError ("fuellen_Click()")
    Resume ProcExit
    End Sub
    Ich benutze SQL-Server 2008 und MS Access 2003.

  • #2
    Null?

    Hallo,

    Der Wert in rs(i) ist vermutlich NULL.
    Abhilfe kann man durch Verwendung der Funktion nz() schaffen,
    also bspw : nz( rs(i), "")

    Grüße,
    tAgedObject
    darkness is a state of mind

    Comment


    • #3
      Hat leider nicht geholfen..
      Wenn ich im Debugger mit dem Mauszeiger auf draufgeh und en bissl warte wird mir
      Code:
      lstItem.SubItems(i) =<Invalid Property Value>
      angezeigt wobei für rs(i)
      Code:
      rs(i)="WS01SE"
      erscheint.

      Comment


      • #4
        Hallo heartxcore,

        For i = 0 To rs.Fields.Count
        Die Collection ist 0-Based, was Du schon richtig angefangen, aber nicht richtig beendet hast
        =>
        For i = 0 To rs.Fields.Count - 1
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Auf der Suche nach einer Listview - Dokumentation gefunden:

          http://www.tech-archive.net/Archive/.../msg00433.html

          Ja, entweder initialisierst Du alle SubItems mit ListItem.SubItems(x)
          = "" oder Du fügst für jede Spalte, abzüglich der ersten, explizit
          einen ListSubItem über die Add-Methode der ListSubItems-Auflistung
          hinzu. Beispiel:

          Code:
          Private Sub InitListSubItems(ListView As MSComctlLib.ListView, _ 
          ListItem As MSComctlLib.ListItem) 
          Dim i As Long 
          
          With ListItem.ListSubItems 
            For i = 1 To ListView.ColumnHeaders.Count - 1 
               .Add 
               Next 
            End With 
          End Sub 
          
          ' Aufruf: 
          Dim lItem As MSComCtlLib.ListItem 
          
          Set lItem = ListView1.ListItems.Add( , , "Eintrag 1") 
          InitListSubItems ListView1, lItem
          Danach kannst Du mit dem ListSubItem-Objekt arbeiten:

          Code:
          Debug.Print ListView1.ListItems.Item(1).ListSubItems.Item(2).Tag 
          
          ListView1.ListItems.Item(1).ListSubItems.Item(2).Text = "Foo"
          D.h.
          lstItem.SubItems(i) muss erst per .add angelegt werden, bevor man per (i) darauf zugreifen kann.
          Ungetestet.

          Grüße
          Tino
          Ich habs gleich!
          ... sagte der Programmierer.

          Comment


          • #6
            Hallo tinof, Hallo O. Helper,

            ersteinmal danke für eure Hilfe. Habe zuerst den vorschlag von tinof ausprobiert, dass habe ich aber leider nicht wirklich verstanden..
            Hab dann das von O. Helper probiert. Das hat soweit funktioniert... allerdings bekomm ich nur eine Listbox die nur mit dem Feld "ComputerIP" gefüllt ist. Auch die "Column Headers", die ich über die Properties angelegt habe, wurden nicht angezeigt...

            Hab die dann versucht im Code anzulegen

            Code:
            lvxobj.ColumnHeaders.Clear
            lvxobj.ColumnHeaders.Add 1, , "ComputerIP", 100
            lvxobj.ColumnHeaders.Add 2, , "Computername", 100
            lvxobj.ColumnHeaders.Add 3, , "Benutzername", 100
            lvxobj.ColumnHeaders.Add 4, , "Zeistempel", 100
            lvxobj.ColumnHeaders.Add 5, , "Domain", 100
            lvxobj.ColumnHeaders.Add 6, , "Url", 100
            aber das Ergebniss blieb das gleiche... Habe ich noch irgendwas vergessen einzustellen?

            Comment


            • #7
              ...sorry...!

              Hallo,

              Da habe ich wieder mal die Frage nicht richtig gelesen... ;-)

              Also die SubItems muß man natürlich vor dem weiteren Gebrauch
              (wenn dies überhaupt erforderlich ist) mittels .add zur Auflistung
              SubItems hinzufügen - dabei kann man den Text gleich übergeben.

              Die Column-Header ermöglichen es, im !Detail-Modus! des Listviews,
              alle bzw. ausgewählte SubItems dann neben der Caption anzuzeigen.

              Grüße,
              tAgedObject
              darkness is a state of mind

              Comment


              • #8
                lstItem.SubItems(i) muss erst per .add angelegt werden
                In .NET ist das in der Tat nötig, hier bewegen wir uns aber noch in der COM Welt (den Code nach zu urteilen), da reicht es aus, wenn die Columns definiert sind; sei es im Entwurf oder wie ober zur Laufzeit.
                Wobei: Dem ListView aus dem Windows Common Control ist sogar das egal; man kann auch nicht vorhandene SubItems füllen.

                Wenn nur ein Text angezeigt wird, liegt es am Anzeige Modus, das wird jetzt auf "Icons" stehen, das muss man auf "Report" umstellen; das geht über das Property "View"
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Einspruch, Euer Ehren ;-)

                  Hallo,

                  Der Windows-Listview ist unabhängig von der
                  Entwicklungsumgebung leider immer der gleiche.

                  Aus der meiner Delphi-Programmierung weis ich,
                  daß auch in Delphi (erst) die einzelnen SubItems
                  mittels .add hinzugefügt werden müssen.

                  In Access/VBA ist das nicht anderes, das habe ich auch noch einmal ausprobiert.
                  Unabhängig vom Anzeigemodus des ListViews (in VBA Eigenschaft View),
                  gibt es einen Fehler, wenn man die ListSubItems(n).Text benutzen möchte,
                  ohne zuvor bspws .ListSubItems.Add 0, , "TEXT" ausgeführt zu haben.

                  Bei SubItems handelt es sich offenbar um ein "herausgelegtes" ListSubItems(n).Text.
                  Was noch interessant ist - der Index 0 scheint ansich schon ungültig zu sein....

                  Viele Grüße,
                  tAgedObject
                  darkness is a state of mind

                  Comment


                  • #10
                    Vielen lieben Dank für eure Hilfe!!

                    Es lag zu letzt wirklich nur an dem Anzeige Modus.^^

                    So sieht mein Code jetzt aus und es Funktioniert einwandfrei

                    Code:
                    Private Sub fuellen_Click()
                    On Error GoTo ProcErr
                    
                    Dim conn As New ADODB.Connection
                    Dim rs As New ADODB.Recordset
                    Dim lvxobj As MSComctlLib.ListView
                    Dim lstItem As MSComctlLib.ListItem
                    Dim i As Integer
                    Dim strSQL As String
                    
                    Set conn = CurrentProject.Connection
                    Set lvxobj = Me.liste.Object
                    
                    lvxobj.ListItems.Clear
                    lvxobj.ColumnHeaders.Clear
                    lvxobj.View = lvwReport
                    
                    lvxobj.ColumnHeaders.Add 1, , "ComputerIP", 500
                    lvxobj.ColumnHeaders.Add 2, , "Computername", 500
                    lvxobj.ColumnHeaders.Add 3, , "Benutzername", 500
                    lvxobj.ColumnHeaders.Add 4, , "Zeistempel", 500
                    lvxobj.ColumnHeaders.Add 5, , "Domain", 5000
                    lvxobj.ColumnHeaders.Add 6, , "Url", 5000
                    
                    
                    
                    strSQL = "SELECT [ComputerIP], [Computername], [Benutzername], [Zeitstempel], [Domain], [url] " & _
                    "FROM tblSESecurePointDaten " & _
                    "GROUP BY [ComputerIP], [Computername], [Benutzername], [Zeitstempel], [Domain], [url] " & _
                    "ORDER BY [Zeitstempel]"
                                        
                    rs.Open strSQL, conn, adOpenKeyset
                    
                    
                    If rs.BOF Then
                        Else
                            rs.MoveFirst
                            
                            While Not rs.EOF
                                For i = 0 To rs.Fields.Count - 1
                                    If i = 0 Then
                                        Set lstItem = lvxobj.ListItems.Add(, , Nz(rs(i), ""))
                                    ElseIf i < rs.Fields.Count Then
                                        lstItem.SubItems(i) = Nz(rs(i), "")
                                    End If
                                Next i
                            rs.MoveNext
                            Wend
                        End If
                            
                        rs.Close
                    
                    ProcExit:
                      Exit Sub
                    
                    ProcErr:
                      gShowRunTimeError ("fuellen_Click()")
                      Resume ProcExit
                    End Sub

                    Gruß MD

                    Comment


                    • #11
                      ...kleine Verfeinerung...

                      Hallo,

                      Ich habe mir nochmal die Zeit genommen
                      und ein noch wenig herumprobiert.

                      Hier mal ein Code-Ausschnitt mit kleinen Kommentaren:
                      Code:
                      Private Sub Befehl2_Click()
                          Dim vLv1 As MSComctlLib.ListView
                          Dim vLi1 As MSComctlLib.ListItem
                          Dim vLi2 As MSComctlLib.ListItem
                          Dim vLi3 As MSComctlLib.ListItem
                          
                          Set vLv1 = Me!ListView4.Object
                          
                          vLv1.ColumnHeaders.Add , , "Cap"
                          vLv1.ColumnHeaders.Add , , "SI0"
                          vLv1.ColumnHeaders.Add , , "SI1"
                          vLv1.ColumnHeaders.Add , , "SI3"
                          vLv1.ColumnHeaders.Add , , "SI4"
                          
                          vLv1.View = lvwReport
                          
                          Set vLi1 = vLv1.ListItems.Add(, , "bla")
                          
                          vLi1.SubItems(0) = "blu" ' geht nicht
                          vLi1.SubItems(1) = "bla"
                          vLi1.SubItems(2) = "blo"
                          vLi1.SubItems(3) = "bli"
                          vLi1.SubItems(4) = "blä"
                          vLi1.SubItems(5) = "blü" ' geht nicht
                          
                          Set vLi2 = vLv1.ListItems.Add(, , "bla")
                          
                          vLi2.SubItems(0) = "blu"  ' geht nicht
                          vLi2.SubItems(1) = "bla"
                          vLi2.SubItems(2) = "blo"
                          vLi2.SubItems(3) = "bli"
                          vLi2.SubItems(4) = "blä"
                          vLi2.SubItems(5) = "blü"   ' geht nicht
                          
                          Set vLi3 = vLv1.ListItems.Add(, , "bla")
                          vLi3.ListSubItems.Add , , "blu"
                          vLi3.ListSubItems.Add , , "bla"
                          vLi3.ListSubItems.Add , , "blo"
                          vLi3.ListSubItems.Add , , "bli"
                          vLi3.ListSubItems.Add , , "blä"
                          
                          vLi2.SubItems(0) = "blu" ' geht nicht
                          vLi2.SubItems(1) = "bla"
                          vLi2.SubItems(2) = "blo"
                          vLi2.SubItems(3) = "blo"
                          vLi2.SubItems(4) = "blo"
                          vLi2.SubItems(5) = "blo" ' geht nicht
                          
                          vLi3.ListSubItems(0).Text = "txt"  ' geht nicht
                          vLi3.ListSubItems(1).Text = "txt"
                          vLi3.ListSubItems(2).Text = "txt"
                          vLi3.ListSubItems(3).Text = "txt"
                          vLi3.ListSubItems(4).Text = "txt"
                          vLi3.ListSubItems(5).Text = "txt" ' geht aber !!!
                          
                      End Sub
                      Also scheint es sicht bei SubItems sogar um ein Makro zu handeln,
                      welches in Abhängigkeit von definierten Spalten automatisch Elemente
                      in der Auflistung ListSubItems anlegt.

                      ListSubItems hingegen funktioniert unabhägig von den definierten Spalten
                      und verträgt (mittels .add) auch mehr Sub-Item-Einträge.

                      Beide Zugriffsvarianten arbeiten aber ab dem StartIndex 1 (nicht 0).

                      Grüße,
                      tAgedObject
                      darkness is a state of mind

                      Comment

                      Working...
                      X