我在C#中有一个组合框,我想用它来使用自动完成建议,但是我希望能够在用户输入时更改自动完成条目,因为可能的有效条目太多而无法AutoCompleteStringCollection在启动时填充.
例如,假设我让用户输入名称.我有一个可能的名字列表("乔","约翰")和一个姓氏列表("博客","史密斯"),但如果我有一千个,那么这将是一百万个可能的字符串 - 太多,无法输入自动完成条目.所以最初我想只有名字作为建议("乔","约翰"),然后一旦用户键入了第一个名字("乔"),我想删除现有的自动完成条目并替换他们使用一个新的集合,包括所选的名字,然后是可能的姓氏("Joe Bloggs","Joe Smith").为此,我尝试了以下代码:
void InitializeComboBox()
{
ComboName.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
ComboName.AutoCompleteSource = AutoCompleteSource.CustomSource;
ComboName.AutoCompleteCustomSource = new AutoCompleteStringCollection();
ComboName.TextChanged += new EventHandler( ComboName_TextChanged );
}
void ComboName_TextChanged( object sender, EventArgs e )
{
string text = this.ComboName.Text;
string[] suggestions = GetNameSuggestions( text );
this.ComboQuery.AutoCompleteCustomSource.Clear();
this.ComboQuery.AutoCompleteCustomSource.AddRange( suggestions );
}
Run Code Online (Sandbox Code Playgroud)
但是,这不能正常工作.似乎对Clear()的调用导致自动完成机制"关闭",直到组合框中出现下一个字符,但是当下一个字符出现时,上面的代码再次调用Clear(),所以用户从不实际上看到了自动完成功能.它还会导致组合框的全部内容被选中,因此在每个按键之间您必须取消选择现有文本,这使其无法使用.如果我删除对Clear()的调用,则自动完成有效,但似乎AddRange()调用无效,因为我添加的新建议未出现在自动完成下拉列表中.
我一直在寻找解决方案,并看到了各种建议,但我无法使其中任何一个工作 - 自动完成功能显示为禁用,或新的字符串不显示.这是我尝试的一系列事项:
BeginUpdate()在更改字符串之前调用,EndUpdate()之后调用.Remove()所有现有字符串而不是Clear().AutoCompleteMode我更改字符串时将设置为"无",然后将其设置回"SuggestAppend".TextUpdate或KeyPress事件而不是TextChanged.AutoCompleteCustomSource用新的替换现有的AutoCompleteStringCollection.即使在各种组合中,这些都没有帮助. …
我有一个文本框,可以更改OnTextChanged事件中下拉列表的内容.当文本框失去焦点时,此事件似乎会触发.如何在按键或键盘事件中实现此目的?
这是我的代码示例
<asp:TextBox ID="Code" runat="server" AutoPostBack="true" OnTextChanged="Code_TextChanged">
<asp:UpdatePanel ID="Update" runat="server">
<ContentTemplate>
<asp:DropDownList runat="server" ID="DateList" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Code" />
</Triggers>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
所以在代码隐藏中,我在页面加载时绑定下拉列表.Code_TextChanged事件只是重新绑定下拉列表.我希望在每个按键上发生这种情况,而不是在文本框失去焦点时发生.
我最近继承了这个代码,这不是我这样做的理想方法,但是时间限制阻止我在web servicy方法中重写它.
我已经尝试使用jQuery来绑定"keyup"事件以匹配文本框的"更改"事件,但这仅适用于按下的第一个键.
ajax ×1
asp.net ×1
asp.net-ajax ×1
autocomplete ×1
c# ×1
combobox ×1
postback ×1
textbox ×1
updatepanel ×1
winforms ×1