相关疑难解决方法(0)

如何在C#组合框或文本框中动态更改自动完成条目?

我在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".
  • 挂钩TextUpdateKeyPress事件而不是TextChanged.
  • 每次都AutoCompleteCustomSource用新的替换现有的AutoCompleteStringCollection.

即使在各种组合中,这些都没有帮助. …

c# combobox textbox autocomplete winforms

47
推荐指数
2
解决办法
5万
查看次数

如何在KeyUp上创建文本框回发?

我有一个文本框,可以更改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"事件以匹配文本框的"更改"事件,但这仅适用于按下的第一个键.

asp.net ajax postback updatepanel asp.net-ajax

24
推荐指数
1
解决办法
6万
查看次数