我正在尝试在listView中进行搜索。我尝试了2种方法,第一种是从listView搜索,第二种是从数据库搜索,然后用已建立的项目填充列表。我可以看到,这两种方式都只能加载30条记录,而且时间很长。我在许多教程中看到,即使数据库或listView中有许多记录,它也可以快速运行并且没有任何负载。我发现在第二个示例中,当我在listView本身中进行搜索时,这会出现一个问题LoadAll();
,因为在每个键入的字母或数字之后,它会再次填充列表并降低应用程序的速度。有没有什么方法可以使它在没有长时间加载的情况下工作,或者有没有最简单的方法呢?
在数据库内部进行搜索的第一个示例
private void usersSearch_TextChanged(object sender, EventArgs e)
{
if (usersSearch.Text != "")
{
searchUsers(usersSearch.Text.ToLower());
}
}
private void searchUsers(string searchTerm)
{
usersList.Items.Clear();
string conn = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
dbConn = new MySqlConnection(conn);
string query = "SELECT id, email, username, password FROM " +
"users WHERE id LIKE '%" + searchTerm + "%' OR email LIKE '%" + searchTerm + "%' OR username LIKE '%" + searchTerm + "%'";
MySqlCommand cmd = new MySqlCommand(query, dbConn);
dbConn.Open();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
ListViewItem item = new ListViewItem(new string[] { reader["id"].ToString(), reader["email"].ToString(), reader["username"].ToString(), reader["password"].ToString()});
usersList.Items.Add(item);
}
reader.Close();
dbConn.Close();
}
在listView项内搜索的第二个示例
private void usersSearch_TextChanged(object sender, EventArgs e)
{
LoadAll(); // loads all data in list
if (usersSearch.Text != "")
{
foreach (ListViewItem item in usersList.Items)
{
bool founded = false;
string value0 = item.SubItems[0].Text;
string value1 = item.SubItems[1].Text;
string value2 = item.SubItems[2].Text;
if (value0.ToLower().Contains(usersSearch.Text.ToLower()))
{
item.Selected = true;
founded = true;
}
else if (value1.ToLower().Contains(usersSearch.Text.ToLower()))
{
item.Selected = true;
founded = true;
}
else if (value2.ToLower().Contains(usersSearch.Text.ToLower()))
{
item.Selected = true;
founded = true;
}
if (!founded) usersList.Items.Remove(item);
}
}
}
答案 0 :(得分:1)
如果-对于在TextBox中键入的每个字符-要进行数据库查询以获取匹配的“ Suggestions”,速度将非常缓慢。为了有效地进行设计,您必须做出几个决定(根据使用情况而定)。
而不是每个字符-仅当用户输入的长度为“最小”时才进入数据库。请说3个字符左右。
如果您需要执行“自动完成”操作的数据库/记录集不繁琐且从未增长-您可以在应用程序加载/启动期间对其进行缓存。
如果记录集不断增长,并且您需要它是现实/实时的。您不能虚拟化吗?即仅获取前5或10条建议,而不是全部。
答案 1 :(得分:0)
我建议先在列表视图中加载所有数据(加载页面时)。 当用户在列表视图中搜索时,应仅从现有数据中选择匹配项(列表视图已提供该匹配项)