C#问题组合框和来自数据库的建议
我正在使用带有组合框的Winform,该组合框设置为AutoCompleteMode=suggest 和AutoCompleteSource=List 自动完成的值存储在SQLite数据库中。 由于该表中有大量数据,因此在创建表单时加载所有值是没有意义的 相反,我想对用户输入运行查询。 f、 E.用户键入“S”->则查询应仅返回值“…其中x类似C#问题组合框和来自数据库的建议,c#,visual-studio,combobox,autocomplete,autosuggest,C#,Visual Studio,Combobox,Autocomplete,Autosuggest,我正在使用带有组合框的Winform,该组合框设置为AutoCompleteMode=suggest 和AutoCompleteSource=List 自动完成的值存储在SQLite数据库中。 由于该表中有大量数据,因此在创建表单时加载所有值是没有意义的 相反,我想对用户输入运行查询。 f、 E.用户键入“S”->则查询应仅返回值“…其中x类似S%” 这很好用——有一个奇怪的行为,我还没弄明白 为了防止在没有空字符串的情况下触发SQL查询,我使用以下代码: private void cb
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;
}
}
}
现在,让我来看看我身体的奇怪行为:
当我运行应用程序并转到我的组合框时,
我从在里面输入“S”开始
但是,comboBox.Text将被数据库中的第一个匹配项所追加,该匹配项不是以“S”开头,而是以“A”(就像我在查询时没有使用like语句的任何字符串一样)
但是,为什么组合框会显示这个值,而不仅仅是显示下拉列表
如果我删除组合框中的每个字符,然后再试一次,一切都会正常工作。
这只是创建表单后的第一个行为
[编辑]
谢谢@dafie:
谢谢,我已经改变了这一点(这也是我之前的一次尝试)-但是,控件的行为也很奇怪
当我输入第一个字母时,什么也没有发生(它不会显示包含建议的列表)。
然后,当我键入第二个字母时,它将删除我键入的第一个字符,只有第二个字符可见,组合框将用“S”附加搜索的第一个建议
例如,我想输入“St”,然后在组合框中输入t“Saal”。
(Saal是带有“S”的搜索的第一个结果)
问题是:如果我只将AutoComplete方法设置为“建议”,为什么组合框会附加文本?
为什么要删除我的第一个输入?我想你在
cb\u city.Text
被文本填充之前就启动了这个方法。你应该将cb\u city.Text!=null
更改为!String.IsNullOrEmpty(cb\u city.Text)
,因为当cb\u city.Text
设置为时,你的代码可以检查条件“
它正在更改您的组合框项,因为您正在设置数据源
数据源不是用于自动完成的
相反,您应该使用AutoCompleteCustomSource
例:
List AutoData=新列表{“Anthony”、“Aaron”、“Adam”、“Ben”、“Brian”、“Charles”、“Chuck”、“Dan”};
私有void comboBox1_TextUpdate(对象发送方,事件参数e)
{
var items=AutoData.Where(a=>a.StartsWith(comboBox1.Text));
comboBox1.AutoCompleteCustomSource.Clear();
comboBox1.AutoCompleteCustomSource.AddRange(items.ToArray());
comboBox1.AutoCompleteSource=AutoCompleteSource.CustomSource;
}
我想,我找到了一个解决方案,它似乎如我所期望的那样有效:)
不幸的是,它有点难看,直接在后面使用两个foreach循环,但在我最近的测试中,这很有效
我现在将在我的另一个项目中尝试它,如果它将产生预期的结果,我将把这个问题标记为已解决
谢谢你的帮助:)顺便说一句:我已经为上面的代码尝试了keyDown和keyPress事件。你用什么事件触发你的代码?我已经为cb_city尝试了keyDown和keyPress事件:private void cb_city_keyDown(对象发送者,KeyEventArgs e){}你好,谢谢。但这并没有像预期的那样奏效。我已经把我的问题和你建议的结果放在下面。另外,你需要处理不同情况下的问题。嗨,谢谢你的建议。据我所知,您正在搜索列表中带有“a”的每个项目。对吗?但老实说,在用户输入第一个字符之前,我不知道需要搜索哪些数据。我现在也使用了TextUpdate事件,但之后,每个字符串都将覆盖上一个字符串-我看不到表单对我输入的任何建议:-(如果我在使用数据源时不尝试使用user-intput来减少数据,则数据源工作正常。如果我在显示表单之前填充数据源,则一切都会顺利进行。只是表单需要加载所有数据的时间过长,因为数据库包含近20000个城市名称…:-(这是从列表(a)中查找以combobox(combobox1.Text)中键入的内容开头的项目。好的,我将在另一个项目中重试(无任何其他代码)今天晚些时候。现在,它似乎没有像我预期的那样工作……在我的原始项目中实现了这一点之后,一切都如预期的那样工作。这似乎是我的第一个问题的解决方案:)
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;
}
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;