【问题标题】:Get specific listview rows based on condition根据条件获取特定的列表视图行
【发布时间】:2021-06-18 21:01:12
【问题描述】:

我有一个包含不同条目的列表视图(见图(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# winforms listview


    【解决方案1】:

    你不应该在 foreach 循环中清除 listview。做一次:

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

    【讨论】:

    • 太棒了!!非常感谢你,“阿什”!!
    【解决方案2】:

    从列表中删除不匹配的项目在这里更有意义。对于你的问题,执行一个反向循环,尝试使用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();
    
        // ...
    }
    

    附带说明,使用ArrayListis not recommended,请改用List&lt;T&gt; 类。

    【讨论】:

    • 漂亮的代码sn-ps!!非常感谢您的支持和帮助,“dr.null”!现在一切都恢复正常了...... :)
    猜你喜欢
    • 2023-03-05
    • 2021-06-10
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2015-12-22
    • 2020-09-16
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多