c#在listView中搜索项目时延迟加载listView中的项目

时间:2018-10-02 07:40:06

标签: c# listview

我正在尝试在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);
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

如果-对于在TextBox中键入的每个字符-要进行数据库查询以获取匹配的“ Suggestions”,速度将非常缓慢。为了有效地进行设计,您必须做出几个决定(根据使用情况而定)。

  1. 而不是每个字符-仅当用户输入的长度为“最小”时才进入数据库。请说3个字符左右。

  2. 如果您需要执行“自动完成”操作的数据库/记录集不繁琐且从未增长-您可以在应用程序加载/启动期间对其进行缓存。

  3. 如果记录集不断增长,并且您需要它是现实/实时的。您不能虚拟化吗?即仅获取前5或10条建议,而不是全部。

答案 1 :(得分:0)

我建议先在列表视图中加载所有数据(加载页面时)。 当用户在列表视图中搜索时,应仅从现有数据中选择匹配项(列表视图已提供该匹配项)