如何在不输入文本的情况下以编程方式显示自动完成

C#TextBox AutoCompleteCustomSource有一个ListAutoCompleteMode = Suggest

当我输入一封信时,我可以看到列表。

如何在不以编程方式键入字母的情况下显示整个列表? 必须在用户按下TextBox中的向下箭头键时执行此操作。

有没有可用的Win32 API?

我的解决方案

我改进了更好的解决方案。

ListBox控件添加到窗体并将其设置为Visible = false

 int curSelIndex = -1; 

下面给出的代码将执行Form_Load Event。

 txtEmpId.AutoCompleteCustomSource.AddRange(EmpIds.ToArray()); lstAutoComplete.Items.Clear(); lstAutoComplete.Items.AddRange(EmpIds.ToArray()); txtEmpId.KeyDown += (ks, ke) => { if (!(ke.KeyCode == Keys.Down || ke.KeyCode == Keys.Up || ke.KeyCode == Keys.Enter)) { lstAutoComplete.Visible = false; return; } ke.Handled = true; if (ke.KeyCode == Keys.Enter) { if (lstAutoComplete.Visible) { var str = lstAutoComplete.SelectedItem + ""; // Process the Selected Item and set to TextBox. } } if (!lstAutoComplete.Visible && txtEmpId.Focused) { var loc = txtEmpId.Location; loc.Y += txtEmpId.Height; lstAutoComplete.Location = loc; lstAutoComplete.Size = txtEmpId.Size; lstAutoComplete.Height = 100; lstAutoComplete.SelectedIndex = 0; curSelIndex = 0; lstAutoComplete.Visible = true; } else if(lstAutoComplete.Visible && txtEmpId.Focused) { if (ke.KeyCode == Keys.Down) { curSelIndex++; if (curSelIndex >= lstAutoComplete.Items.Count) curSelIndex = lstAutoComplete.Items.Count - 1; if (lstAutoComplete.Items.Count > 0) lstAutoComplete.SelectedIndex = curSelIndex; } else if (ke.KeyCode == Keys.Up) { curSelIndex--; if (curSelIndex  0) lstAutoComplete.SelectedIndex = curSelIndex; } } }; txtEmpId.Leave += (ls, le) => lstAutoComplete.Visible = false; 

我没有为你的问题找到任何API,所以我只使用ListBox来显示我自己的建议框,当你按下向下箭头键时,当你做其他操作时,它就会消失。 我希望它对你有用。 代码示例如下:

 //string datasource List strList = null; //suggestion listbox ListBox sugBox = null; public FrmTextSuggest() { InitializeComponent(); //setting the textbox control strList = new List() { "USA", "England", "China", "Japan", "Korea", "India", "France", "Canada" }; var autoCollection = new AutoCompleteStringCollection(); autoCollection.AddRange(strList.ToArray()); this.txtCountry.AutoCompleteCustomSource = autoCollection; this.txtCountry.AutoCompleteMode = AutoCompleteMode.Suggest; this.txtCountry.AutoCompleteSource = AutoCompleteSource.CustomSource; //register the Down Arrow Key event this.txtCountry.KeyDown += new KeyEventHandler(txtCountry_KeyDown); } void txtCountry_KeyDown(object sender, KeyEventArgs e) { //show the your own suggestion box when pressing down arrow and the text box is empty if (e.KeyCode == Keys.Down && txtCountry.Text.Trim().Equals("")) { sugBox = new ListBox(); //define the box sugBox.Width = txtCountry.Width; Point p = txtCountry.Location; pY += txtCountry.Height; sugBox.Location = p; sugBox.Items.AddRange(strList.ToArray()); //copy the value to the textbox when selected index changed. sugBox.SelectedIndexChanged += new EventHandler(sugBox_SelectedIndexChanged); //show box if (sugBox.Items.Count > 0) { sugBox.SelectedIndex = 0; this.Controls.Add(sugBox); sugBox.Focus(); } } //remove and hide your own suggestion box when other operation else { if (sugBox != null && this.Controls.Contains(sugBox)) { this.Controls.Remove(sugBox); sugBox.Dispose(); sugBox = null; } } } void sugBox_SelectedIndexChanged(object sender, EventArgs e) { string selText = this.sugBox.SelectedItem.ToString(); if (!string.IsNullOrEmpty(selText)) { this.txtCountry.Text = selText; } } 

这是我的测试结果: 结果图片1

结果图片2