【问题标题】:Searching and filtering out results from listbox in visual c#在Visual C#中从列表框中搜索和过滤结果
【发布时间】:2019-07-17 06:33:10
【问题描述】:

我只是在学习如何用 c# 编写代码,并且正在尝试找出一种方法来从包含数据的列表框中搜索和过滤掉结果。现在我有一个列表框和一个搜索按钮,我的列表框包含网站历史记录,我的搜索按钮在列表中找到该项目,但我找不到过滤掉其他项目的方法,因此只有我在文本框中搜索的内容出现在列表框中。现在我的搜索按钮看起来像这样。有什么想法吗?

private void searchBtn_Click(object sender, EventArgs e)
{
    listBoxHist.SelectedItems.Clear();

    for (int i = 0; i < listBoxHist.Items.Count; i++)
    {
        if (listBoxHist.Items[i].ToString().Contains(textboxSearch.Text))
        {
            listBoxHist.SetSelected(i, true);

        }
    }

}

【问题讨论】:

    标签: c# visual-studio button search listbox


    【解决方案1】:

    有一个众所周知的“技巧”可以在迭代集合时删除项目。您应该使用 for...循环向后迭代(从最后一项到第一项)。
    这样,当您删除一个项目时,您不会影响用于退出循环的条件,并且可以保证每个项目都被评估。

    private void searchBtn_Click(object sender, EventArgs e)
    {
        for (int i = listBoxHist.Items.Count - 1; i >= 0; i--)
        {
            if (listBoxHist.Items[i].ToString().Contains(textboxSearch.Text))
                listBoxHist.SetSelected(i, true);
            else
                listBoxHist.Items.RemoveAt(i);
        }
    }
    

    如果您在向前循环时执行此代码,您将无法正确评估每个项目。假设您在索引为 3 时删除了一个项目。位置 4 的项目会发生什么?它向下滑动了一个位置,现在它占据了位置 3,之后的所有其他项目都会发生这种情况。现在,您的循环会将索引增加到 4,并将开始评估在调用 RemoveAt 之前位于位置 5 的项目。您已跳过对项目的评估。

    【讨论】:

      【解决方案2】:
      public partial class _Default : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              if (!IsPostBack)
              {
                  ListBox1.Items.Add("B");
                  ListBox1.Items.Add("A");
                  ListBox1.Items.Add("P");
                  ListBox1.Items.Add("X");
                  ListBox1.Items.Add("F");
                  ListBox1.Items.Add("S");
                  ListBox1.Items.Add("Z");
              }
          }
      
      
          protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
          {
      
          }
          protected void Button1_Click(object sender, EventArgs e)
          {
              String txt=txtsearch.Text;
              if (ListBox1.Items.FindByText(txt)!= null)
              {
                 // ListBox1.Items.FindByText(txt).Selected = true;
      
                  Response.Write("<script> alert('Item found.');</script>");
              }
              else
              {
                  Response.Write("<script> alert('Item Not found.');</script>");
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 2012-01-14
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        相关资源
        最近更新 更多