筛选组合框-奇怪的行为

时间:2019-11-01 13:54:26

标签: c# winforms

我的WinForms应用程序中有一个组合框,您可以在其中搜索字符串并相应地过滤结果,但是它的行为似乎很奇怪。我正在搜索“ Coo”,但得到的产品列表很长,其中不包含字符串“ coo”(http://prntscr.com/pr54rs)。但是,当我键入“ coor”然后按退格键,再次让我留下“ coo”时,结果列表将有所不同(http://prntscr.com/pr55ef

我正在使用“ KeyPress”事件处理程序在组合框中搜索。代码看起来像这样

 private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        comboBox1.Items.Clear();
        listNew.Clear();
        var source = new AutoCompleteStringCollection();

        foreach (var item in listOnit)
        {
            if (item.ToLower().Contains(this.comboBox1.Text.ToLower()))
            {
                listNew.Add(item);
            }
        }

        comboBox1.Items.AddRange(listNew.ToArray());
        comboBox1.SelectionStart = this.comboBox1.Text.Length;
        Cursor = Cursors.Default;
        comboBox1.DroppedDown = true;
    }

我做错什么了吗?该列表是从数据库填充的

 string sqlProducts = "SELECT Description FROM stocktake_products WHERE stocktake_id = '" + stocktakeID.stocktake_id + "' AND (PLUProdCode IS NULL OR PLUProdCode = '');";
            MySqlCommand cmdProduct = new MySqlCommand(sqlProducts, conn);
            cmdProduct.CommandTimeout = 10000;
            MySqlDataReader rdrProduct = cmdProduct.ExecuteReader();
            AutoCompleteStringCollection myCollectionSales1 = new AutoCompleteStringCollection();
            if (rdrProduct.HasRows == true)
            {
                while (rdrProduct.Read())
                {
                   // myCollectionSales1.Add(rdrProduct[0].ToString());
                    listOnit.Add(rdrProduct[0].ToString());
                }
                rdrProduct.Close();
                //textBox1.AutoCompleteCustomSource = myCollectionSales1;
                comboBox1.Items.AddRange(listOnit.ToArray());

            }

我希望组合框仅显示包含已键入的整个字符串的结果,而不是显示在任何位置都键入了字母的每个短语,因为这似乎就是这样做的结果。

我尝试包括BeginIvoke方法(不确定是否做得正确,因为我以前从未使用过它)

this.BeginInvoke((MethodInvoker)delegate
        {
            comboBox1.Items.Clear();
            listNew.Clear();
            var source = new AutoCompleteStringCollection();

            foreach (var item in listOnit)
            {
                if (item.ToLower().Contains(this.comboBox1.Text.ToLower()))
                {
                    listNew.Add(item);
                }
            }

            comboBox1.Items.AddRange(listNew.ToArray());
            comboBox1.SelectionStart = this.comboBox1.Text.Length;
            Cursor = Cursors.Default;
            comboBox1.DroppedDown = true;
        });

现在,当我开始输入第一个字符时,组合框会立即选择顶部结果(http://prntscr.com/pr5f6i)。我必须再次按第一个字符,然后键入字符串的其余部分才能真正在列表中进行搜索。

0 个答案:

没有答案