我有一个组合框,我不希望用户也添加新数据,但我也想让他们输入他们想要选择的对象的标题。
目前我正在使用此代码:
protected virtual void comboBoxAutoComplete_KeyPress(object sender, KeyPressEventArgs e) {
if (Char.IsControl(e.KeyChar)) {
//let it go if it's a control char such as escape, tab, backspace, enter...
return;
}
ComboBox box = ((ComboBox)sender);
//must get the selected portion only. Otherwise, we append the e.KeyChar to the AutoSuggested value (i.e. we'd never get anywhere)
string nonSelected = box.Text.Substring(0, box.Text.Length - box.SelectionLength);
string text = nonSelected + e.KeyChar;
bool matched = false;
for (int i = 0; i < box.Items.Count; i++) {
if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().StartsWith(text, true, null)) {
//box.SelectedItem = box.Items[i];
matched = true;
break;
}
}
//toggle the matched bool because if we set handled to true, it precent's input, and we don't want to prevent
//input if it's matched.
e.Handled = !matched;
}
适用于使用绑定到数据库的数据的任何组合框,并且不区分大小写。但是,如果用户在错误的情况下输入某些内容然后从组合框中选项卡,则组合框的选定值仍为-1(或者之前的值是什么)。这不是我想要的行为,我希望它将值设置为当前用户绑定的最佳猜测,即自动完成选项。
如果你在for循环中看到注释掉的行,我试过这个。这不起作用。
它是这样的:
我有“租”字段,值为53
我输入'r'
我得到了结果'rRent'
combobox.SelectedValue返回-1
目前的做法:
我有“租”字段,值为53
我输入'r'
自动填充表明“租金”
这是正确的值,所以我继续前进,组合框失去焦点
Combobox显示“租”字
combobox.SelectedValue返回-1
我想要的是什么:
我有“租”字段,值为53
我输入'r'
组合框失去焦点,它填写'租金'(即使它不是正确的情况[已经这样做])
combobox.SelectedValue现在应该返回53
我认为设置box.SelectedValue可能会更好,但我无法弄清楚如何做到这一点,至少以高级抽象方式,如果我知道组合框是如何使用ValueMemeber和Display成员我会复制它但我没有。
有人对如何解决此错误有任何建议吗?
答案 0 :(得分:4)
可能正在咆哮错误的树,但您是否尝试过在组合框上启用自动完成功能?
comboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
comboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
最后一行将限制对列表中项目的输入。
答案 1 :(得分:0)
看起来我没有选择,只能在LeaveFocus事件中执行此操作,这可以解决问题:
protected void autocomplete_LeaveFocus(object sender, EventArgs e) {
ComboBox box = ((ComboBox)sender);
String selectedValueText = box.Text;
//search and locate the selected value case insensitivly and set it as the selected value
for (int i = 0; i < box.Items.Count; i++) {
if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().Equals(selectedValueText, StringComparison.InvariantCultureIgnoreCase)) {
box.SelectedItem = box.Items[i];
break;
}
}
}