C# 根据条件获取特定的listview行

C# 根据条件获取特定的listview行,c#,winforms,listview,C#,Winforms,Listview,我有一个包含不同条目的listview(见图(a)。我想根据一个条件提取一些特定的行。到目前为止,我有以下代码: private void Button2_Click(object sender, EventArgs e) { ArrayList listing = new ArrayList(); for (int i = 0; i < listView2.Items.Count; i++) { string columnOne = list

我有一个包含不同条目的listview(见图(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);
    }
}
private void按钮2\u单击(对象发送者,事件参数e)
{
ArrayList listing=新的ArrayList();
对于(int i=0;i=2)
{
Add($“{columnOne},{columnTwo},{numb},{columnThree}”);
}
}
foreach(列表中的字符串项)
{
listView2.Items.Clear();
ListViewItem listItem=新建ListViewItem();
var-separ=项目分割(',');
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循环中清除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);
}

不应清除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,请删除
ListViewItem

private void按钮2\u单击(对象发送者,事件参数e)
{
对于(var i=listView2.Items.Count-1;i>=0;i--)
{
if(int.TryParse(listView2.Items[i]。子项[2]。文本,out var num)&&num<2)
{
listView2.Items.RemoveAt(i);
}
}
}
但是,如果您想获得匹配项的列表:

//+
使用System.Collections.Generic;
私有无效按钮2\u单击(对象发送者,事件参数e)
{
var items=新列表();
对于(var i=0;i=2)
{
items.Add(listView2.items[i]);
}
}
// ...
}
或林奇道:

//+
使用System.Linq;
私有无效按钮2\u单击(对象发送者,事件参数e)
{
var items=listView2.items.Cast()
.Where(x=>int.TryParse(x.SubItems[2].Text,out var num)&&num>=2)
.ToList();
// ...
}

作为旁注,使用
ArrayList
类,改用该类。

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

private void按钮2\u单击(对象发送者,事件参数e)
{
对于(var i=listView2.Items.Count-1;i>=0;i--)
{
if(int.TryParse(listView2.Items[i]。子项[2]。文本,out var num)&&num<2)
{
listView2.Items.RemoveAt(i);
}
}
}
但是,如果您想获得匹配项的列表:

//+
使用System.Collections.Generic;
私有无效按钮2\u单击(对象发送者,事件参数e)
{
var items=新列表();
对于(var i=0;i=2)
{
items.Add(listView2.items[i]);
}
}
// ...
}
或林奇道:

//+
使用System.Linq;
私有无效按钮2\u单击(对象发送者,事件参数e)
{
var items=listView2.items.Cast()
.Where(x=>int.TryParse(x.SubItems[2].Text,out var num)&&num>=2)
.ToList();
// ...
}

作为旁注,使用
ArrayList
类,改用该类。

太好了!!非常感谢,“ASh”!!太好了!!非常感谢,“ASh”!!非常漂亮的代码片段!!非常感谢您的支持和帮助,“dr.null”!现在一切又正常了…:)非常漂亮的代码片段!!非常感谢您的支持和帮助,“零博士”!现在一切又恢复正常了……:)