我正在将Winform与comboBox一起使用,并将其设置为AutoCompleteMode =建议 和AutoCompleteSource =列表。
自动完成的值存储在SQLite数据库中。 由于该表中有大量数据,因此在创建表单时加载所有值都没有意义。
要插入,我想对用户Input运行查询。
f.E.用户键入“ S”->,则查询应仅返回值“ ... WHERE x LIKE S%
;
这很好用-一种奇怪的行为,我还没有弄清楚。
为了防止在没有空字符串的情况下触发SQL查询,我使用以下代码:
private void cb_City_KeyDown(object sender, KeyEventArgs e)
{
if (Globals.UseAutoFillOnCities == true)
{
if (!string.IsNullOrEmpty(cb_city.Text))
{
foreach (DataRow AutoFillItems in dbAction.GetAutoComplete("CITIES", cb_city.Text).Rows)
{
AutoFillCities.Add(AutoFillItems[0].ToString());
}
cb_city.DataSource = AutoFillCities;
}
}
}
现在,让我的表单变得奇怪: 当我运行应用程序并转到我的comboBox时, 我将从在其中键入“ S”开始。
但是,然后,comboBox.Text将被附加到数据库中的第一个匹配项中,该匹配项不是以“ S”开头,而是以“ A”开头(就像我对LIKE语句没有任何字符串那样进行查询。 / p>
但是,为什么comboBox会显示此值,而不仅仅是显示下拉列表?
如果我删除ComboBox中的每个角色并再次尝试,一切将按预期工作。 这只是创建表单后的第一个行为。
[编辑] 谢谢@dafie:
谢谢,我已经对此进行了更改(这也是我之前的尝试之一)-但是,控件的行为也很奇怪。
当我输入第一个字母时,什么也没有发生(它不会显示带有建议的列表)。 然后,当我键入第二个字母时,它将删除我键入的第一个字符,只有第二个字母可见,并且comboBox会附加带有“ S”的搜索的第一个建议。
例如,我想输入“ St”,然后在组合框中输入“ Saal”。 (“ Saal”是搜索结果为“ S”的第一个结果)
问题是:如果仅将自动完成方法设置为“建议”,为什么组合框会附加文本? 为什么我的第一个输入将被删除?
答案 0 :(得分:1)
我认为,我找到了一个似乎可以按预期工作的解决方案:)
private void Form1_Load(object sender, EventArgs e)
{
foreach (DataRow AutoFillItems in GetAutoComplete("CITIES", comboBox1.Text).Rows)
{
AutoFillCities.Add(AutoFillItems[0].ToString());
}
foreach (string item in AutoFillCities)
{
comboBox1.AutoCompleteCustomSource.Add(item);
}
comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
不幸的是,这有点丑陋,直接在后面使用了两个foreach循环,但是在我的最新测试中效果很好。
我现在将在我的其他项目中尝试它,如果它将获得预期的结果,我会将问题标记为已解决。
感谢您的帮助:)
答案 1 :(得分:0)
我认为您在cb_city.Text
填充文本之前触发此方法。您应该将cb_city.Text != null
更改为!String.IsNullOrEmpty(cb_city.Text)
,因为当cb_city.Text
设置为""
时,您的代码可以检查条件。
答案 2 :(得分:0)
由于要设置数据源,因此正在更改组合框项目。
数据源不是自动完成所使用的。
相反,您应该使用AutoCompleteCustomSource。
EX:
List<string> AutoData = new List<string>{ "Anthony", "Aaron", "Adam", "Ben", "Brian", "Charles", "Chuck", "Dan"};
private void comboBox1_TextUpdate(object sender, EventArgs e)
{
var items = AutoData.Where(a => a.StartsWith(comboBox1.Text));
comboBox1.AutoCompleteCustomSource.Clear();
comboBox1.AutoCompleteCustomSource.AddRange(items.ToArray());
comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
}