0

I have a listview with diffrent entries (see figure (A). I would like to extract some specific rows based on a condition. So far, i have this code:

 private void Button2_Click(object sender, EventArgs e) { ArrayList listing = new ArrayList(); for (int i = 0; i < listView2.Items.Count; i++) { string columnOne = listView2.Items[i].Text; string columnTwo = listView2.Items[i].SubItems[1].Text; int numb = int.Parse(listView2.Items[i].SubItems[2].Text); string columnThree = listView2.Items[i].SubItems[3].Text; if(numb >= 2) { listing.Add($"{columnOne},{columnTwo},{numb},{columnThree}"); } } foreach (string item in listing) { listView2.Items.Clear(); ListViewItem listItem = new ListViewItem(); var separ = item.Split(','); listItem.Text = separ[0].Trim(); listItem.SubItems.Add(separ[1]); listItem.SubItems.Add(separ[2]); listItem.SubItems.Add(separ[3]); listView2.Items.Add(listItem); } } 

enter image description here

I get figure (B), but normally i should get figure (C). How can this be achieved?

2 Answers 2

1

you shouldn't clear listview in foreach loop. do it once:

listView2.Items.Clear(); foreach (string item in listing) { // listView2.Items.Clear(); ListViewItem listItem = new ListViewItem(); var separ = item.Split(','); listItem.Text = separ[0].Trim(); listItem.SubItems.Add(separ[1]); listItem.SubItems.Add(separ[2]); listItem.SubItems.Add(separ[3]); listView2.Items.Add(listItem); } 
Sign up to request clarification or add additional context in comments.

1 Comment

Great!! Thank you very much, "ASh" !!
1

Removing the non matching items from the list makes more sense here. For your problem, execute a backward loop, try to convert the text of the third subitem to integer value using the int.TryParse method, and remove the ListViewItem if the value is less than 2.

private void button2_Click(object sender, EventArgs e) { for (var i = listView2.Items.Count - 1; i >= 0; i--) { if (int.TryParse(listView2.Items[i].SubItems[2].Text, out var num) && num < 2) { listView2.Items.RemoveAt(i); } } } 

Yet, if you want to get a list of matching items:

// + using System.Collections.Generic; private void button2_Click(object sender, EventArgs e) { var items = new List<ListViewItem>(); for (var i = 0; i < listView2.Items.Count; i++) { if (int.TryParse(listView2.Items[i].SubItems[2].Text, out var num) && num >= 2) { items.Add(listView2.Items[i]); } } // ... } 

Or LINQ way:

// + using System.Linq; private void button2_Click(object sender, EventArgs e) { var items = listView2.Items.Cast<ListViewItem>() .Where(x => int.TryParse(x.SubItems[2].Text, out var num) && num >= 2) .ToList(); // ... } 

As a side note, using the ArrayList class is not recommended, use the List<T> class instead.

1 Comment

Pretty beautiful code snippets!! Thank you very much for your support and your help, "dr.null"! Now everything works fine again... : )

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.