首页 > 解决方案 > 根据条件获取特定的列表视图行

问题描述

我有一个包含不同条目的列表视图(见图(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)。如何做到这一点?

标签: c#winformslistview

解决方案


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

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

// +
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而是使用该类。List<T>


推荐阅读