我在Outlook加载项中有一个WinForms组合框,当用户在编辑框中键入名称时,该组件框会填充用户名下拉列表。当用户到达第三个字符时。此时ComboBox的数据源被分配,并且光标跳到编辑框的开头,而不是停留在最后。为什么我的WinForms组合框中的自动完成在键入时更改光标位置?
我想要的行为是光标停留在我输入的字符串的末尾,即使下拉列表中填充了更多数据。
我试过用发送密钥破解这个,但它并不总是有效。读取以下按键的代码位于按键事件中。
private void comboBox1_KeyPress(object sender, KeyEventArgs e)
{
var acceptableKeys = ConfigurationManager.AppSettings["AcceptableKeys"];
if (cmbAssignedTo.Text.Length > 2 && acceptableKeys.Contains(e.KeyCode.ToString().ToUpper()) && e.Modifiers == Keys.None)
{
var request = RestHandler.CreateRequest(ConfigurationManager.AppSettings["ContactsSearchResource"] + cmbAssignedTo.Text.Trim(), Method.GET);
var response = RestHandler.ExecuteRequest(request, ConfigurationManager.AppSettings["myServiceURL"]);
this.cmbAssignedTo.DataSourceChanged -= new System.EventHandler(this.cmbAssignedTo_DataSourceChanged);
//Assign a new data source
DataHandler.UpdateComboboxDataSource(cmbAssignedTo, response.Content);
this.cmbAssignedTo.DataSourceChanged += new System.EventHandler(this.cmbAssignedTo_DataSourceChanged);
}
e.Handled = true;
}
编辑
internal static void UpdateComboboxDataSource(ComboBox cmbAssignedTo, string data)
{
var list = BuildAssignmentList(data);
if ((list.Count() == 0 && cmbAssignedTo.Items.Count == 0) || list.Count() > 0)
{
var savedText = cmbAssignedTo.Text;
cmbAssignedTo.DataSource = list;
cmbAssignedTo.SelectedValue = "";
cmbAssignedTo.Text = savedText;
SendKeys.Send("{end}");
}
if (cmbAssignedTo.Items.Count > 0)
{
cmbAssignedTo.DroppedDown = true;
Cursor.Current = Cursors.Default;
}
}
我不知道怎样才能更新下拉不改变数据源和变化似乎导致光标跳。我应该尝试不同于KeyPressed的事件吗?有没有其他解决方案我失踪?
将“cmbAssignedTo_DataSourceChanged”的代码添加到问题 –
添加了实际更改了数据源的代码。事件方法@ S.Petrosov请求实际上是一个无操作。我将从KeyPressed事件中删除它。 – Blanthor
尝试验证延迟技巧,我发现: https://stackoverflow.com/questions/8001450/c-sharp-wait-for-user-to-finish-typing-in-a-text-box Regards, Tim – Tim