我的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)。我必须再次按第一个字符,然后键入字符串的其余部分才能真正在列表中进行搜索。