[vb.net] Listview vullen is niet meer mogelijk na sort

Pagina: 1
Acties:

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 30-04 16:53
Ik heb een form met hierop een listview. Ik heb een (recursieve) functie die een bepaalde directory doorloopt en de files met volledig path in de listview zet. Als subitem komt dan de modify date en het aantal dagen van de modify date tot nu.
Ook is het mogelijk om op de columnheaders te klikken en zo de listview te sorteren.

Als ik een directory laat doorzoeken, vervolgens een andere directory selecteer en weer laat doorzoeken gaat dat elke keer goed. Totdat ik de listview gesorteert heb door op de columnheader te klikken. Als ik dan weer probeer een directory te scannen krijg ik de volgende melding:
Specified argument was out of the range of valid values. Parameter name: '2' is not a valid value for 'index'

Om de items in de listview te sorteren gebruik ik de code uit het volgende artikel:
http://support.microsoft....aspx?scid=kb;EN-US;319399

Iemand een idee waar die error vandaan komt?

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Op welke regel krijg je die fout ?
Heb je de code al eens gedebugged ? (Dat moet wel als je de regel wil weten waar het fout op gaat).

Nu is het gewoon gissen, en de tijd toen er nog glazen bollen in de devschuur waren, is al lang voorbij.
(gorgi_19 heeft ze allemaal laten vallen).

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 30-04 15:47

mulder

ik spuug op het trottoir

hey dat ben ik vandaag ook tegen gekomen, zelfde situatie... ik probeer het me effe te herinneren :D


edit:
ik werk niet meer met die ListViewColumnSorter en gebruik de Sort method niet omdat ik Datasource sorteer.

edit2:
je bent dus niet helemaal gek, vage error

[ Voor 50% gewijzigd door mulder op 30-08-2005 19:18 ]

oogjes open, snaveltjes dicht


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 30-04 16:53
inderdaad een beetje vage omschrijving. Zal morgen wat code posten.

Ik heb de code niet hier, dus kan even niet kijken op welke regel het fout gaat. Ik heb in zoverre gedebugged dat ik vrijwel zeker weet dat het fout gaat tijdens het vullen van de Listview. Hij probeert de listview te vullen, maar op de een of andere manier is er iets fout met de index van die listview nadat er gesort is. Morgen zal ik eens iets uitgebreider debuggen en mijn ervaringen hier neerzetten.


Volgens mij had ik hier trouwens nog wat glazen bollen in de kast liggen waar ik niks mee doe. Zal eens kijken waar die gebleven zijn...

[ Voor 22% gewijzigd door kaandorp op 30-08-2005 23:28 ]


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 30-04 16:53
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub ScanFolder(ByVal currDir As String)
        If interrupt Then Exit Sub
        Dim Dir As String
        Dim File As String
        Dim FI As FileInfo
        Dim lvwItem As ListViewItem
        Dim TS As New TimeSpan
        Dim Delete As String
        Dim FilesToDelete() As String

        For Each File In Directory.GetFiles(currDir)
            FI = New FileInfo(File)
            TS = Now().Subtract(FI.LastWriteTime)
            If TS.TotalDays > numFileAge.Value Then
                SW.WriteLine(FI.Directory.ToString & "\" & FI.Name)
                Delete = "Yes"
                'System.IO.File.Delete(FI.Directory.ToString & "\" & FI.Name)
            Else
                Delete = "No"
            End If

            lvwItem = lvwFiles.Items.Add(FI.Directory.ToString & "\" & FI.Name)
            lvwItem.SubItems.Add(FI.Length)
            lvwItem.SubItems.Add(FI.LastWriteTime)
            lvwItem.SubItems.Add(Math.Round(TS.TotalDays))
            lvwItem.SubItems.Add(Delete)
        Next
        countFiles += Directory.GetFiles(currDir).Length()
        lblCountFiles.Text = countFiles.ToString()

        For Each Dir In Directory.GetDirectories(currDir)
            countFolders += 1
            lblCountFolders.Text = countFolders.ToString()
            Application.DoEvents()
            ScanFolder(Dir)
        Next

    End Sub


Het gaat dus fout op regel 22. Ik kan 1 of 2 keer een item toevoegen aan de listview, maar bij de 3e keer gaat ie naar de exception met de foutmelding:
Specified argument was out of the range of valid values. Parameter name: '2' is not a valid value for 'index'
Waarom niet? Wordt de index al gebruikt ofzo? Voordat ik de functie aanroep doe ik eerst een clear op de listview. Hoe zou ik dit verder kunnen debuggen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Wat is de stacktrace van die exception ?

https://fgheysels.github.io/


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 30-04 15:47

mulder

ik spuug op het trottoir

Het lijkt er een beetje op dat na een sort de array of columns niet meer bestaat.

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Hmm, dat kan bijna niet als hij die foutmelding op die 'Add' krijgt. Daar ga je toch gewoon de Text property van je ListViewItem zetten, en ga je nog niet met SubItems gaan spelen ?
Trouwens, AFAIK kan je zoveel subitems toevoegen aan je ListViewItem; ook al heb je niet voldoende columns in je listview.

Ik zal eens zien of ik thuis die error kan reproduceren.

[ Voor 9% gewijzigd door whoami op 31-08-2005 11:24 ]

https://fgheysels.github.io/


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 30-04 16:53
Wat me opvalt is het volgende:

Specified argument was out of the range of valid values. Parameter name: '2' is not a valid value for 'index'

2 slaat hier op de kolom waar ik het laatste op gesorteert heb. Dus als ik sorteer op kolom 4 en dan opnieuw de functie draai is de exception.message:

Specified argument was out of the range of valid values. Parameter name: '3' is not a valid value for 'index'

Dan nog even over die stacktrace. Is dat alles wat zit in exception.stacktrace? Wat kun je hier precies uithalen, en hoe gebruik je dit voor de debugging? Ik doe nu gewoon Debug.Write(scanException.StackTrace). Is dat de manier om de stacktrace te bekijken?

Dit is de inhoud van exception.stacktrace:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
at System.Windows.Forms.ListViewSubItemCollection.get_Item(Int32 index)
   at WindowsApplication1.ListViewColumnSorter.Compare(Object x, Object y) in C:\Documents and Settings\michael\Desktop\FolderScanner\FolderScanner\ListViewColumnSorter.vb:line 33
   at System.Windows.Forms.ListView.CompareFunc(IntPtr lparam1, IntPtr lparam2, IntPtr lparamSort)
   at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
   at System.Windows.Forms.Control.DefWndProc(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ListView.WndProc(Message& m)
   at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 Msg, IntPtr wParam, ListViewCompareCallback pfnCompare)
   at System.Windows.Forms.ListView.Sort()
   at System.Windows.Forms.ListView.InsertItem(Int32 displayIndex, ListViewItem item)
   at System.Windows.Forms.ListViewItemCollection.Add(ListViewItem value)
   at System.Windows.Forms.ListViewItemCollection.Add(String text, Int32 imageIndex)
   at System.Windows.Forms.ListViewItemCollection.Add(String text)
   at WindowsApplication1.frmMain.ScanFolder(String currDir) in C:\Documents and Settings\michael\Desktop\FolderScanner\FolderScanner\frmMain.vb:line 253
   at WindowsApplication1.frmMain.ScanFolder(String currDir) in C:\Documents and Settings\michael\Desktop\FolderScanner\FolderScanner\frmMain.vb:line 266
   at WindowsApplication1.frmMain.btnScan_Click(Object sender, EventArgs e) in C:\Documents and Settings\michael\Desktop\FolderScanner\FolderScanner\frmMain.vb:line 310


Don Facundo>
Wat wel raar is merk ik net dat het wel goed gaat als ik op de eerste kolom sorteer. Zodra ik op een andere kolom sorteer gaat het fout.

[ Voor 5% gewijzigd door kaandorp op 31-08-2005 11:47 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 30-04 15:47

mulder

ik spuug op het trottoir

In die ListViewColumnSorter, zet eens een break op deze regel:
C#:
1
compareResult = ObjectCompare.Compare(listviewX.SubItems(ColumnToSort).Text, listviewY.SubItems(ColumnToSort).Text)

en vraag dan de ColumnCount op

edit:
ik bedoel de SubItem count

[ Voor 17% gewijzigd door mulder op 31-08-2005 12:02 ]

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
De fout wordt dus, zoals Don Facundo ook al gezien heeft, veroorzaakt in je Compare method van je ListViewSorter.

Blijkbaar ga je daar waarschijnlijk een bepaalde waarde bekijken van een column, en bestaat die column (of die index) niet ?

Ah, het probleem is dus, dat je eerst je ListViewItem aan je listview hangt, die Compare method wordt blijkbaar aangeroepen, en je hebt nog geen subitems, want die hang je er pas achteraf aan.
(Wilde gok).
Probeer eens je code te veranderen, door eerst je volledige ListViewItem te maken (dus maak een nieuw ListViewItem, add je subitems, etc...), en ga dan pas je ListViewItem aan je ListView toevoegen.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Eigenlijk best raar ?
Ik dacht dat die Sort method enkel opgeroepen werd, als je ze echt aanroept ? Hij gaat toch niet, als je een nieuw item toevoegt, automatisch je listview opnieuw gaan sorteren ?

https://fgheysels.github.io/


  • kaandorp
  • Registratie: November 1999
  • Laatst online: 30-04 16:53
Ik heb het nu herschreven als:
Visual Basic:
1
2
3
4
5
6
7
lvwItem = New ListViewItem
lvwItem.Text = FI.Directory.ToString & "\" & FI.Name
lvwItem.SubItems.Add(FI.Length)
lvwItem.SubItems.Add(FI.LastWriteTime)
lvwItem.SubItems.Add(Math.Round(TS.TotalDays))
lvwItem.SubItems.Add(Delete)
lvwFiles.Items.Add(lvwItem)


En dit werkt! Top...

Zou je misschien toch nog iets meer kunnen vertellen over het gebruik van de stacktrace bij het debuggen? Wellicht kan ik het de volgende keer dan zelf opknappen of iig iets duidelijker verwoorden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
De stacktrace laat de 'stack' zien op het moment dat je exceptie gegooid werd.
Die stacktrace geeft dus weer welke method die exceptie veroorzaakt heeft:
als je 'm goed bekijkt, zie je onderaan de method die jij nu uitgevoerd hebt: nl. het klikken op die scan button.
Dan werden er een aantal andere methods uitgevoerd, en helemaal bovenaan zie je de method waar het fout gelopen is.

https://fgheysels.github.io/

Pagina: 1