【问题标题】:Filter listview in winform in textbox在文本框中过滤winform中的listview
【发布时间】:2018-10-15 15:35:27
【问题描述】:

我在解决列表视图问题时遇到了麻烦。 我有一个从连接到 na sql 数据库的数据表中读取的列表视图。 我希望能够过滤它抛出一个文本框 textchanged 句柄,但我有以下问题? - 不能退格,搜索不会更新; - 无法获取选中的项目;

 private void filtro_TextChanged(object sender, EventArgs e)
    {
        //searchData(filtro.Text);
        List<ListViewItem> showitems = new List<ListViewItem>();
        if (filtro.Text != "")
        {
            for (int i = ListViewVistas.Items.Count - 1; i >= 0; i--)
            {
                var item = ListViewVistas.Items[i];

                if (item.Text.ToLower().Contains(filtro.Text.ToLower()))
                {
                    item.Selected = true;
                    item.BackColor = SystemColors.HighlightText;
                    item.ForeColor = SystemColors.InfoText;

                }
                else
                {
                    ListViewVistas.Items.Remove(item);
                }
            }
            if (ListViewVistas.SelectedItems.Count == 1)
            {
                ListViewVistas.Focus();
            }
        }
        else
            UpdateViews();


public void UpdateViews()
    {
        ListViewVistas.Clear();

        //IR BUSCAR O DICIONARIO PARA DEPOIS VER SE AS VISTAS JA ESTAO ASSOCIADAS OU NÃO
        string m_IdFicheiroDesenho = "";
        NomeFicheiro FicheiroActivo = new NomeFicheiro();

        DataBase DbId = new DataBase();


        DbId.IdFichDesFromReferencia(FicheiroActivo.NomeReferencia, out m_IdFicheiroDesenho);

        Dictionary<int, List<string>> dicVistasFicheiroDesenho = DbId.GetDictionaryVistasFicheirosDesenho(m_IdFicheiroDesenho);

        string[] ListItemTxt = new string[4];

        ListViewVistas.View = System.Windows.Forms.View.Details;
        ListViewVistas.GridLines = true;
        ListViewVistas.FullRowSelect = true;
        ListViewVistas.Columns.Add("Vista ou Sheet");
        ListViewVistas.Columns.Add("Ficheiro de Desenho");
        ListViewVistas.Columns.Add("Designação");
        ListViewVistas.Columns.Add("Id");
        ListViewVistas.Columns[0].Width = 230;
        ListViewVistas.Columns[1].Width = 180;
        ListViewVistas.Columns[1].TextAlign = HorizontalAlignment.Left;
        ListViewVistas.Columns[2].Width = 420;
        ListViewVistas.Columns[2].TextAlign = HorizontalAlignment.Left;
        ListViewVistas.Columns[3].Width = 30;
        ListViewVistas.Columns[3].TextAlign = HorizontalAlignment.Left;
        ListViewVistas.CheckBoxes = true;
        ListViewVistas.Items.Clear();

        if (checkBoxViews.Checked)...

谁能帮帮我??

【问题讨论】:

标签: c# winforms listview


【解决方案1】:

我没有看到从数据库加载数据的代码,所以我无法直接评论您需要做什么,但从概念上讲,您应该将加载的数据转换为 ListViewItems 并将它们存储在 List 中。这将是您将用于过滤的主列表。

List<ListViewItem> masterlist = new List<ListViewItem>();

这个列表应该在你的表单中作为一个类级别的变量可用。

在您的 TextChanged 事件中,您将使用主列表检索与您的过滤器匹配的项目:

public void filtro_TextChanged(object sender, EventArgs e)
{
    ListViewVistas.Items.Clear();
    foreach(ListViewItem item in masterlist.Where(lvi => lvi.Text.ToLower().Contains(filtro.Text.ToLower())))
    {
        ListViewVistas.Items.Add(item);
    }
}

或者,如果您是极简主义的粉丝,您可以将以上内容简化为:

public void filtro_TextChanged(object sender, EventArgs e)
{
    ListViewVistas.Items.Clear();
    ListViewVistas.Items.AddRange(masterlist.Where(lvi => lvi.Text.ToLower().Contains(filtro.Text.ToLower())).ToArray());
}

如果您选中一个 listviewitem,它将保持选中状态,因为您没有重新创建列表视图项。

【讨论】:

    【解决方案2】:

    感谢手提包蟹的回答,但这不起作用。 这是从数据库加载内容的部分代码

    else
                    if (!checkBoxAssociados.Checked)
                    {
                        ListItemTxt[0] = view.ViewType.ToString() + ": " + view.ViewName.ToString();
    
    
                        ListItemTxt[1] = " -  ";
                        ListItemTxt[2] = "Vista não Associada!      Clique aqui para Associar Vista"; //POR DEFEITO A VISTA NÃO ESTÁ ASSOCIADA
    
    
                        //VER SE A VISTA ESTÁ ASSOCIADA OU NAO
                        if (dicVistasFicheiroDesenho.ContainsKey(view.Id.IntegerValue))
                        {
                            ListItemTxt[2] = dicVistasFicheiroDesenho[view.Id.IntegerValue][0];//Designacao
                            ListItemTxt[1] = dicVistasFicheiroDesenho[view.Id.IntegerValue][1];//Referencia
                        }
    
    
                        ListItemTxt[3] = view.Id.IntegerValue.ToString();
                        ListViewItem lvi = new ListViewItem(ListItemTxt);
                        ListViewVistas.Items.Add(lvi);
                    }
                }
            }
    
            if (checkBoxSheets.Checked)
            {
                foreach (Autodesk.Revit.DB.ViewSheet viewSheet in m_selectViewsData.PrintableSheets)
                {
                    ListItemTxt[0] = viewSheet.ViewType.ToString() + ": " + viewSheet.SheetNumber + " - " +
                        viewSheet.ViewName.ToString();
    
    
                    ListItemTxt[1] = " -  ";
                    ListItemTxt[2] = "Vista não Associada!      Clique aqui para Associar Vista"; //POR DEFEITO A VISTA NÃO ESTÁ ASSOCIADA
    
                    //VER SE A VISTA ESTÁ ASSOCIADA OU NAO
                    if (dicVistasFicheiroDesenho.ContainsKey(viewSheet.Id.IntegerValue))
                    {
                        ListItemTxt[2] = dicVistasFicheiroDesenho[viewSheet.Id.IntegerValue][0];//Designacao
                        ListItemTxt[1] = dicVistasFicheiroDesenho[viewSheet.Id.IntegerValue][1];//Referencia 
                    }
    
                    ListItemTxt[3] = viewSheet.Id.IntegerValue.ToString();
                    ListViewItem lvi = new ListViewItem(ListItemTxt);
                    ListViewVistas.Items.Add(lvi);
                }
            }
    
            if (ListViewVistas.SelectedIndices.Count > 0)
            {
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多