在 visual c# 中搜索和过滤列表框中的结果
Searching and filtering out results from listbox in visual c#
我正在学习如何使用 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);
}
}
}
众所周知 'trick' 可以在遍历集合时删除项目。您应该使用 for...loop 向后迭代(从最后一项到第一项)。
这样,当您删除一个项目时,您不会影响用于退出循环的条件,并且可以保证对每个项目进行评估。
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 的项目。您已跳过对项目的评估。
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>");
}
}
}
我正在学习如何使用 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);
}
}
}
众所周知 'trick' 可以在遍历集合时删除项目。您应该使用 for...loop 向后迭代(从最后一项到第一项)。
这样,当您删除一个项目时,您不会影响用于退出循环的条件,并且可以保证对每个项目进行评估。
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 的项目。您已跳过对项目的评估。
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>");
}
}
}