自动完成TextBox:获取用户输入

时间:2012-08-15 17:12:09

标签: .net winforms autocomplete textbox

我在AutoCompleteCustomSource自动完成模式下使用TextBox Append。这按预期工作;但是,当出现自动完成建议时,我仍然只需要访问用户输入的文本。也就是说,当出现建议时,Text的{​​{1}}属性将返回该建议。

有没有办法只检索用户输入的字符串?

更新:我的一个限制是我必须使用TextBox自动完成模式。

3 个答案:

答案 0 :(得分:1)

您是否尝试将该属性设置为Suggest,这样文本框的text属性将始终是用户在字符串中键入的内容,直到用户选择建议为止。

答案 1 :(得分:0)

您将需要执行以下操作,例如,这是从我刚刚在Designer.cs文件中测试过的Windows项目中粘贴的

赢取表单示例

this.txtStudGrade.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.txtStudGrade.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;

在Designer DropDownList中设置AutoCompleteSource.ListItems; 在Designer DropDownList中设置AutoCompleteMode = AutoCompleteMode.Suggest;

WebForm你可以使用JQuery来查看下面的链接以获得一个工作示例

AutoComplete using JQuery

答案 2 :(得分:0)

似乎没有一种简单的机制来只检索用户输入的数据,并且在尝试解决此问题后,我可以理解为什么。用户输入数据的构成并不总是很清楚,似乎 Microsoft 决定不解决这个问题。

我决定通过注册TextChanged事件来手动跟踪用户数据。由于每个按键都会触发此事件,通过跟踪Text的先前值,我可以确定是否发生了追加自动完成或粘贴操作。

下面的代码段,如果来自我的自定义TextChanged类的TextBox事件处理程序; UserText包含用户输入的数据(类型为string)。

if (string.IsNullOrEmpty(UserText) || 
    UserText.Length > Text.Length || 
    UserText.Length + 1 == Text.Length)
{
  UpdateUserText(Text);
}

UpdateUserText(string)首先确定是否发生了更改,如果是,则将新值分配给UserText并发出事件。在粘贴操作的情况下,可以使用已发布的解决方案here;但是,我选择执行以下操作:

MouseClick += UpdateUserText;
KeyUp += UpdateUserText;

//--------------------------------------------------------

private void UpdateUserText(object sender, EventArgs args)
{
  if (SelectionLength == 0)
  {
    UpdateUserText(Text);
  }
}

这样,如果TextBox中的文字不再突出显示,那么我认为它已成为用户输入的文字。这将处理粘贴操作(通过键盘或鼠标)并满足用户按箭头键以尝试接受自动完成建议。

我决定忽略的一个边缘情况是当用户键入整个单词但最后一个字符时,在这种情况下,我将无法区分自动完成建议和用户输入。

我还考虑使用StringBuilder手动跟踪用户输入的数据,但我认为这比跟踪string中已构建的Text需要更多的努力。

如果有人提出建议,我总是愿意接受更好的实施:)