我有一个包含4列的ListView控件。文件名,ID,类型,项目。我通过读取包含必要字段的管道分隔文件来将项目添加到ListView。一切正常,ListView显示我的数据。但是,我想添加搜索功能,以便用户可以在ListView中进行搜索并将其项筛选为仅与搜索文本匹配的项。如果可能的话,我希望能够在键入时过滤列表。我的列表视图使用的是“详细信息”视图,其定义的列与上述4列匹配。

到目前为止,我已经尝试了以下代码,但是无法弄清楚如何使其工作。
我的restoreAllItems方法可以正常工作,并还原列表视图以包含所有项目,就像搜索文本框为空一样。

这是成功的申请表

有人可以帮我指出正确的方向吗?
先感谢您!!!

private void txtJobSearch_TextChanged(object sender, EventArgs e)
    {
        // Search items in our Jobs ListView, remove those that do not match search
        if (txtJobSearch.Text != String.Empty)
        {
            for (int i = listJobs.Items.Count - 1; i >= 0; i--)
            {
                if (listJobs.Items[i].Text.ToLower().Contains(txtJobSearch.Text.ToLower()))
                {
                    listJobs.Items[i].BackColor = SystemColors.Highlight;
                    listJobs.Items[i].ForeColor = SystemColors.HighlightText;
                }
                else
                {
                    for (int x = listJobs.Items[i].SubItems.Count - 1; x >= listJobs.Items[i].SubItems.Count; x--)
                    {
                        if (listJobs.Items[i].SubItems[x].Text.ToLower().Contains(txtJobSearch.Text.ToLower()))
                        {
                            listJobs.Items[i].BackColor = SystemColors.Highlight;
                            listJobs.Items[i].ForeColor = SystemColors.HighlightText;
                        }
                        else
                        {
                            listJobs.Items[i].Remove();
                        }
                    }
                }
            }
        }
        else
        {
            restoreAllItems("jobs");
        }
    }

最佳答案

我已经更新了您的代码。突出显示逻辑已删除,因为我不完全了解其目的,但是您可以轻松地将其放回原处。
以下代码以与您相同的形式运行。唯一的例外是出于测试目的而实现的ReinitList()方法。

// check if current item matches search string
private bool ItemMatches(ListViewItem item, string text)
{
    bool matches = false;

    matches |= item.Text.ToLower().Contains(text.ToLower());

    if (matches)
    {
        return true;
    }

    foreach (ListViewItem.ListViewSubItem subitem in item.SubItems)
    {
        matches |= subitem.Text.ToLower().Contains(text.ToLower());
        if (matches)
        {
            return true;
        }
    }

    return false;
}

private void txtJobSearch_TextChanged(object sender, EventArgs e)
{
    // prevent flickering
    listJobs.BeginUpdate();

    // restore all items in case user deletes some characters in the textbox
    ReinitList();

    string search = txtJobSearch.Text;
    // Search items in our Jobs ListView, remove those that do not match search
    if (search != String.Empty)
    {
        for (int i = listJobs.Items.Count - 1; i >= 0; i--)
        {
            ListViewItem currentItem = listJobs.Items[i];
            if (ItemMatches(currentItem, search))
            {
                // highlight, or move highlighting to ItemMatches
            }
            else
            {
                listJobs.Items.RemoveAt(i);
            }
        }
    }

    listJobs.EndUpdate();
}


private void ReinitList()
{
    listJobs.Items.Clear();
    for (int i = 0; i < 50; i++)
    {
        ListViewItem item = new ListViewItem(i.ToString());
        item.SubItems.Add("sub " + i.ToString());
        item.SubItems.Add("sub a" + i.ToString());
        item.SubItems.Add("sub b" + i.ToString());

        listJobs.Items.Add(item);
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    ReinitList();
}

关于c# - 搜索多列ListView C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24963719/

10-12 04:36
查看更多