作者:icanfly2502872173_635 | 来源:互联网 | 2023-10-10 14:11
如何在winforms桌面应用程序中创建自动完成文本框我有一个单词列表。该列表包含大约100-200个文本字符串(实际上是地铁站的名称)。我想制作一个自动完成的文本框。例如,用户按
如何在winforms桌面应用程序中创建自动完成文本框
我有一个单词列表。 该列表包含大约100-200个文本字符串(实际上是地铁站的名称)。
我想制作一个自动完成的文本框。 例如,用户按’N’字母,然后出现(结束)适当选项(仅一个选项)。 必须选择结尾。
怎么做?
PS1:我猜,有一个带有Property的文本框控件,如下所示:
List AppropriateOptions{/* ... */}
PS2:对不起我的英语。 如果你不明白 – >问我,我会尽力解释!
为了防止@ leniel的链接断开,这里有一些代码可以解决这个问题:
AutoCompleteStringCollection allowedTypes = new AutoCompleteStringCollection(); allowedTypes.AddRange(yourArrayOfSuggestions); txtType.AutoCompleteCustomSource = allowedTypes; txtType.AutoCompleteMode = AutoCompleteMode.Suggest; txtType.AutoCompleteSource = AutoCompleteSource.CustomSource;
使用ComboBox而不是TextBox。 以下示例将自动完成,匹配文本的任何部分,而不仅仅是起始字母。
这应该是一个完整的表单,只需添加您自己的数据源和数据源列名称。 ?
using System; using System.Data; using System.Windows.Forms; public partial class frmTestAutocomplete : Form { private DataTable maoCompleteList; private const string MC_DISPLAY_COL = "name"; private const string MC_ID_COL = "id"; public frmTestAutocomplete() { InitializeComponent(); } private void frmTestAutocomplete_Load(object sender, EventArgs e) { maoCompleteList = oData.PurificationRuns; maoCompleteList.CaseSensitive = false; //turn off case sensitivity for searching testCombo.DisplayMember = MC_DISPLAY_COL; testCombo.ValueMember = MC_ID_COL; testCombo.DataSource = GetDataTableFromDatabase(); testCombo.SelectedIndexChanged += testCombo_SelectedIndexChanged; testCombo.KeyUp += testCombo_KeyUp; } private void testCombo_KeyUp(object sender, KeyEventArgs e) { //use keyUp event, as text changed traps too many other evengts. ComboBox oBox = (ComboBox)sender; string sBoxText = oBox.Text; DataRow[] oFilteredRows = maoCompleteList.Select(MC_DISPLAY_COL + " Like '%" + sBoxText + "%'"); DataTable oFilteredDT = oFilteredRows.Length > 0 ? oFilteredRows.CopyToDataTable() : maoCompleteList; //NOW THAT WE HAVE OUR FILTERED LIST, WE NEED TO RE-BIND IT WIHOUT CHANGING THE TEXT IN THE ComboBox. //1).UNREGISTER THE SELECTED EVENT BEFORE RE-BINDING, b/c IT TRIGGERS ON BIND. testCombo.SelectedIndexChanged -= testCombo_SelectedIndexChanged; //don't select on typing. oBox.DataSource = oFilteredDT; //2).rebind to filtered list. testCombo.SelectedIndexChanged += testCombo_SelectedIndexChanged; //3).show the user the new filtered list. oBox.DroppedDown = true; //this will overwrite the text in the ComboBox, so 4&5 put it back. //4).binding data source erases text, so now we need to put the user's text back, oBox.Text = sBoxText; oBox.SelectiOnStart= sBoxText.Length; //5). need to put the user's cursor back where it was. } private void testCombo_SelectedIndexChanged(object sender, EventArgs e) { ComboBox oBox = (ComboBox)sender; if (oBox.SelectedValue != null) { MessageBox.Show(string.Format(@"Item #{0} was selected.", oBox.SelectedValue)); } } } //===================================================================================================== // code from frmTestAutocomplete.Designer.cs //===================================================================================================== partial class frmTestAutocomplete { /// /// Required designer variable. /// private System.ComponentModel.IContainer compOnents= null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.testCombo = new System.Windows.Forms.ComboBox(); this.SuspendLayout(); // // testCombo // this.testCombo.FormattingEnabled = true; this.testCombo.Location = new System.Drawing.Point(27, 51); this.testCombo.Name = "testCombo"; this.testCombo.Size = new System.Drawing.Size(224, 21); this.testCombo.TabIndex = 0; // // frmTestAutocomplete // this.AutoScaleDimensiOns= new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 273); this.Controls.Add(this.testCombo); this.Name = "frmTestAutocomplete"; this.Text = "frmTestAutocomplete"; this.Load += new System.EventHandler(this.frmTestAutocomplete_Load); this.ResumeLayout(false); } #endregion private System.Windows.Forms.ComboBox testCombo;
}
您希望将TextBox.AutoCompleteSource
设置为CustomSource
,然后将所有字符串添加到其AutoCompleteCustomSource
属性,即StringCollection
。 然后你应该好好去。
Leniel的答案链接在vb.net,感谢Joel的参赛作品。 提供我的代码使其更明确:
private void InitializeTextBox() { AutoCompleteStringCollection allowedStatorTypes = new AutoCompleteStringCollection(); var allstatortypes = StatorTypeDAL.LoadList>().OrderBy(x => x.Name).Select(x => x.Name).Distinct().ToList(); if (allstatortypes != null && allstatortypes.Count > 0) { foreach (string item in allstatortypes) { allowedStatorTypes.Add(item); } } txtStatorTypes.AutoCompleteMode = AutoCompleteMode.Suggest; txtStatorTypes.AutoCompleteSource = AutoCompleteSource.CustomSource; txtStatorTypes.AutoCompleteCustomSource = allowedStatorTypes; }
我想补充一点,TextBox的标准自动完成只能在字符串的开头工作,所以如果你点击N只会找到以N开头的字符串。 如果你想要更好的东西,你必须使用一些不同的控件或自己实现行为(即对TextChanged事件做出反应,使用一些计时器来延迟执行,而不是使用IndexOf(inputString)过滤你的令牌列表,然后将你的AutoCompleteSource设置为过滤后的清单。
使用combobox,设置其数据源或提供硬编码条目,但设置以下属性:
上述就是C#学习教程:如何在winforms桌面应用程序中创建自动完成文本框分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记
AutoCompleteMode = Suggest; AutoCompleteSource = ListItems;