热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:如何在winforms桌面应用程序中创建自动完成文本框分享

如何在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; 


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
author-avatar
icanfly2502872173_635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有