根据条件获取特定的列表视图行

Get specific listview rows based on condition

我有一个包含不同条目的列表视图(见图 (A))。我想根据条件提取一些特定的行。到目前为止,我有以下代码:

 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);
    }
}

我得到图 (B),但通常我应该得到图 (C)。如何实现?

您不应该在 foreach 循环中清除列表视图。做一次:

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);
}

从列表中删除不匹配的项目在这里更有意义。对于你的问题,执行一个反向循环,尝试使用 int.TryParse 方法将第三个子项的文本转换为整数值,如果值小于 2,则删除 ListViewItem

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);
        }
    }
}

但是,如果您想获得匹配项目的列表:

// +
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]);
        }
    }
    // ...
}

或 LINQ 方式:

// +
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();

    // ...
}

作为旁注,请改用 ArrayList class is not recommended, use the List<T> class。