c# -从用户输入搜索子字符串
本文关键字:搜索 字符串 输入 用户 | 更新日期: 2023-09-27 18:16:14
我想添加一个搜索功能到我的应用程序,我已经看到了许多例子,但是,所有的数据都是由程序员添加的。我如何实现一个搜索函数,其中参数/值不是预定义的。我猜我必须创建List<>的另一个实例,因为我已经使用了一个?
public Form1()
{
InitializeComponent();
}
List<Book> books = new List<Book>();
private void Form1_Load(object sender, EventArgs e)
{
}
//Settng Values
public void button1_Click(object sender, EventArgs e)
{
Book b = new Book();
b.Title = textBox1.Text;
b.ISBN = textBox2.Text;
b.Onloan = trueCheckBox.Checked;
listView1.Items.Add(b.Title + ", " + b.ISBN + ", " + b.Onloan);
books.Add(b);
textBox1.Text = null;
textBox2.Text = null;
}
//Method to check if item is aviable or note - boolean type
void avaiable()
{
if (trueCheckBox.Checked = true)
{
bool onloan = true;
}
else
{
bool onloan = false;
}
}
private void button2_Click(object sender, EventArgs e)
{
Remove();
}
//Remove item from both the List & Listview
void Remove()
{
try
{
listView1.Items.Remove(listView1.SelectedItems[0]);
books.RemoveAt(listView1.SelectedItems[0].Index);
}
catch
{
}
}
//Display information within their field when selected an item is selected
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0)
{
return;
}
else
{
textBox1.Text = books[listView1.SelectedItems[0].Index].Title;
textBox2.Text = books[listView1.SelectedItems[0].Index].ISBN;
trueCheckBox.Checked = books[listView1.SelectedItems[0].Index].Onloan;
}
}
//Update the values without having to re-add
private void button3_Click(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0)
{
return;
}
else
{
books[listView1.SelectedItems[0].Index].Title = textBox1.Text;
books[listView1.SelectedItems[0].Index].ISBN = textBox2.Text;
books[listView1.SelectedItems[0].Index].Onloan = trueCheckBox.Checked;
listView1.SelectedItems[0].Text = textBox1.Text + ", " + textBox2.Text + ", "+ trueCheckBox.Checked;
}
}
private void searchBox_TextChanged(object sender, EventArgs e)
{
//Here's where I am stuck, I've added a textField and labelled it search box
}
}
//Class - set & get methods
class Book
{
public string isbn;
public string title;
private Boolean onloan;
public Book()
{
this.isbn = isbn;
this.title = title;
}
public string ISBN
{
get { return isbn; }
set { isbn = value; }
}
public string Title
{
get { return title; }
set { title = value; }
}
public Boolean Onloan
{
get { return onloan; }
set { onloan = value; }
}
}
}
谢谢。
编辑-
本质上,搜索函数应该允许用户只使用子字符串,即:"火星"应该返回一本标题为"来自火星的程序员"的书<(举个例子)。我猜我必须使用。contains方法?
正确,您将需要使用"Contains"方法。请注意,"Contains"是区分大小写的,因此您需要考虑到这一点。
所以你会有这样的东西:
var textToSearch = searchBox.Text.ToLower();
var foundBooks = books.Where(book => book.Title.ToLower().Contains(textToSearch)).ToList();
假设books
是要搜索的图书列表:
List<Book> searchResult = books.Where(b => b.Title.Contains(searchTerm)).ToList();
这将返回一个图书列表,其中的输入字符串可以在标题中找到。您可以与b.Title == searchTerm
进行精确匹配,并与Book
的其他性质相似。
上面的语法是LINQ
,一开始可能会有点混乱,但对于这样的事情非常有效。
要使用它,你需要using System.Linq;
因为你的搜索似乎是在TextChanged
上,你想把这段代码在你的searchBox_TextChanged()
方法:
获取用户输入的文本框:
TextBox searchTerm = sender as TextBox;
这将根据当前搜索来过滤图书列表:
List<Book> searchResult = books.Where(b => b.Title.Contains(searchTerm.Text)).ToList();
请注意,在另一个答案中,您可能需要执行ToLower()
(或upper)以使搜索不区分大小写。
现在要做的就是将过滤后的结果searchResult
显示给用户。
设法做到了,这是我的代码,它的工作原理。如果有人想使用它作为将来的参考,它在这里。
private void button4_Click(object sender, EventArgs e)
{
listView1.SelectedItems.Clear();
for (int i = listView1.Items.Count -1; i >= 0; i--)
{
if (listView1.Items[i].ToString().ToLower().Contains(searchBox.Text.ToLower())) {
listView1.Items[i].Selected = true;
}
}