Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何搜索listview';在c中使用文本框替换项目#_C# - Fatal编程技术网

C# 如何搜索listview';在c中使用文本框替换项目#

C# 如何搜索listview';在c中使用文本框替换项目#,c#,C#,我有一个listview名称listView1,它包含计算机id和它们的一些信息。所以我想做的是我有一个文本框名称filterbox,当我写一些东西时,它会过滤它,工作正常。我的问题是它只查找第一列,而不是其他列。例如 PCNAME USER MODEL AAAA JOHN DELL BBBB MIKE TOSHIBA CCCC ASH MONSTER 当我输入BB时,它只得到第二行,它工作正常,但如果我输入戴尔,它什么也得不到 private void fi

我有一个listview名称listView1,它包含计算机id和它们的一些信息。所以我想做的是我有一个文本框名称filterbox,当我写一些东西时,它会过滤它,工作正常。我的问题是它只查找第一列,而不是其他列。例如

PCNAME  USER  MODEL
 AAAA   JOHN  DELL
 BBBB   MIKE  TOSHIBA
 CCCC   ASH   MONSTER
当我输入BB时,它只得到第二行,它工作正常,但如果我输入戴尔,它什么也得不到

  private void filterbox_TextChanged(object sender, EventArgs e)
        {
            if (filterbox.Text != "")
            {
                for (int i = listView1.Items.Count - 1; i >= 0; i--)
                {
                    var item = listView1.Items[i];
                    if (item.Text.ToLower().Contains(filterbox.Text.ToLower()))
                    {
                        item.BackColor = SystemColors.Highlight;
                        item.ForeColor = SystemColors.HighlightText;
                    }
                    else
                    {
                        listView1.Items.Remove(item);
                    }
                }
                if (listView1.SelectedItems.Count == 1)
                {
                    listView1.Focus();
                }
            }
        }

它与迭代子项一样简单:

foreach (ListViewItem item in listView1.Items)
   foreach (ListViewItem.ListViewSubItem subitem in item.SubItems)
      if (subitem.Text.Equals(filterbox.Text, StringComparison.OrdinalIgnoreCase))
      {
         item.BackColor = SystemColors.Highlight;
         item.ForeColor = SystemColors.HighlightText;
         break;
      }
注意,您在这里还有其他事情要做,不过我将把细节留给您

更新 对于过滤,您可以使用一些Linq:

if (filterbox.Text == "")
{
   return;
}

var list = listView1.Items
                    .Cast<ListViewItem>()
                    .Where(
                        x => x.SubItems
                              .Cast<ListViewItem.ListViewSubItem>()
                              .Any(y => y.Text.Contains(filterbox.Text)))
                    .ToArray();
listView1.Items.Clear();
listView1.Items.AddRange(list);
if(filterbox.Text==“”)
{
返回;
}
var list=listView1.Items
.Cast()
.在哪里(
x=>x.SubItems
.Cast()
.Any(y=>y.Text.Contains(filterbox.Text)))
.ToArray();
listView1.Items.Clear();
listView1.Items.AddRange(列表);

您可以将列表视图与数据表绑定。参考在文本框“文本更改/控制离开”事件中,对数据表应用过滤器。这将负责更新列表视图的项目,因为它的数据源绑定到数据表

listView1.ItemsSource = dataTable.DefaultView;
使用下面的查询筛选数据

DataView dv = new DataView(yourDatatable);
dv.RowFilter = "query"; // query example = "id = 10"

如果有帮助,请告诉我。:)

Saruman答案的核心非常有效:使用linq将符合条件的所有项目复制到可枚举集合中,清除listview项目,并
AddRange
好的项目

然而,为了得到一个完全有效的解决方案,还需要进行一些修正

第一:我们需要把整套物品存放在某个地方。同类最佳级别变量:

List<ListViewItem> allItems = new List<ListViewItem>();
感谢萨鲁曼,他用必要的
演员阵容编写了linq


顺便说一句:我们确实使用了
Cast
而不是
of type
,因为我们可以确定类型
Cast
快一点。

要搜索项目的子项目吗?做吧!从子项[1]开始,因为[0]是项本身对于(int i.`不需要,您可以使用
listView1.Items.Where
。直接过滤,无需删除项只需清除/刷新列表视图链接中的答案似乎不会查看子项。
Items.Where(i=>i.Any(sub=>sub.subitems)
如OP a text.Contains(searchText)中所示它给出了大量无意义的错误。它给出了一个错误;删除
,StringComparison.OrdinalIgnoreCase
将行更改为
。Any(y=>y.Text.Contains(filterbox.Text)))
代码工作正常。@TaW你说得对,这是工作,它对每一列都进行过滤,但当我删除字符时还有一个问题,它什么也不给我?从@TaW代码中,它进行过滤,但再次更改文本,它将给出一个空白页确实,答案还不完整。下面是更正的步骤:创建一个类级变量来保存所有项目:
List allItems=new List();
。添加项目时填写:
allItems.AddRange(listView1.items.Cast());
。并在筛选过程中使用它:
var List=allItems.Cast()…
行文件管理器会很好,但ListView(包含锯齿数组)在数据绑定到表方面非常糟糕。
allItems.Clear();
allItems.AddRange(listView1.Items.Cast<ListViewItem>());
private void filterbox_TextChanged(object sender, EventArgs e)
{
    listView1.Items.Clear();   // clear all items we have atm
    if (filterbox.Text == "")
    {
        listView1.Items.AddRange(allItems.ToArray());  // no filter: add all items
        return;
    }
    // now we find all items that have a suitable text in any subitem/field/column
    var list = allItems.Cast<ListViewItem>()
                       .Where( x => x.SubItems
                                     .Cast<ListViewItem.ListViewSubItem>()
                                     .Any(y => y.Text.Contains(filterbox.Text)))
                       .ToArray();
    listView1.Items.AddRange(list);  // now we add the result
}