2017-01-24 2 views
0

Ich habe eine Listview wie folgt aus:Listview löschen Zeile mit Feld passend

Name | Gender | Age 
--------------------- 
Name1 | XX | 23 
Name2 | XY | 21 
Name3 | XY | 25 
Name4 | XX | 30 

Wenn die Listenansicht gefüllt wird, schafft es Einträge einer Combobox wie folgt aus:

If Not ComboBox4.Items.Contains(gender) Then 
    ComboBox4.Items.Add(gender) 
End If 

So beende ich oben mit einer Combobox mit 2 Einträgen (XX, XY). Jetzt möchte ich alle Linien löschen, die zu dem Geschlecht passen, das in der Combobox vorgewählt wird. Der ausgewählte Eintrag wird dann aus der Combobox entfernt.
Beispiel: Ich wähle Geschlecht 'XX' entfernt werden, dann entfernt das Programm die gesamte Zeile mit 'Name1, XX, Alter 23' und 'Name4, XX, 30' aus der Listenansicht.

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    for i = 1 to viewlist.items.count 
     'Need help here to select the right column/viewlist-field 
    next 
    ComboBox4.Items.Remove(ComboBox4.Text) 
End Sub 

Vielen Dank im Voraus

Antwort

1

Zunächst einmal sollten Sie Ihre Schleife bei 0 bei viewlist.Items.Count - 1 beginnen und enden. Dies liegt daran, dass die rechte Seite von To nur vor der ersten Iteration ausgewertet wird. Aus diesem Grund wird die Schleife zu was auch immer viewlist.Items.Count - 1 war vor die Schleife wurde ausgeführt, anstatt was es ist eigentlich nach dem Entfernen von Elementen (daher warum Sie die ArgumentOutOfRangeException von meinem vorherigen Code).

Wenn Sie vom Ende ausgehen und in Richtung 0 gehen, wird i immer einen gültigen Index darstellen, solange Sie höchstens einen Eintrag pro Iteration entfernen. Dies kann durch die folgenden veranschaulicht:

First iteration Second iteration Third iteration (and so on) 
    Item 0    Item 0    Item 0 
    Item 1    Item 1   (i) Item 1 
    Item 2   (i) Item 2    [Removed] 
(i) Item 3    [Removed]   [Removed] 

nun eine Unterspalte eines Artikels erhalten Sie die ListViewItem.SubItems property verwenden können. Ihre Spalte Gender befindet sich derzeit auf Index 1 - das erste Unterelement (Index 0) ist anscheinend der Besitzer aller Unterelemente, dh das Original ListViewItem.

For i = viewlist.Items.Count - 1 To 0 Step -1 
    Dim CurrentSubItems As ListViewItem.ListViewSubItemCollection = viewlist.Items(i).SubItems 
    If CurrentSubItems.Count >= 2 AndAlso CurrentSubItems(1).Text = ComboBox4.Text Then 
     viewlist.Items.RemoveAt(i) 
    End If 
Next 
ComboBox4.Items.Remove(ComboBox4.Text) 

Wenn Sie Groß- und Kleinschreibung String-Vergleich verwenden möchten, können Sie die If -Anweisung in der Schleife ändern:

If CurrentSubItems.Count >= 2 AndAlso String.Equals(CurrentSubItems(1).Text, ComboBox4.Text, StringComparison.OrdinalIgnoreCase) Then 
+0

Dies wirft die Ausnahme „System.ArgumentOutOfRangeException“ mit zusätzlichen Informationen: InvalidArgument = Wert mit Wert 1 für Index ist ungültig. – neverlucky

+0

@neverlucky: Das ist seltsam ... Was ist der Wert von "i", wenn die Ausnahme ausgelöst wird? Die einzige Erklärung, die ich finden kann, wäre, dass Sie ein 'ListViewItem' ohne Unterelemente haben. –

+0

Wenn ich versuche, 'Msgbox (viewlist.items.count)' es zeigt eine Nummer viel größer als die Menge der Einträge in der Viewlist wirklich sind. Ist es möglich, 'ListViewItem' ohne Unterelemente zu ignorieren? – neverlucky

Verwandte Themen