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

C#学习教程:当焦点位于文本框的自动完成框时,禁用键事件分享

当焦点位于文本框的自动完成框时,禁用键事件在我的项目中有一个FormmainForm,其中有两个textBoxestxtUserName和txtPassword以及一个按钮btnL

当焦点位于文本框的自动完成框时,禁用键事件

在我的项目中有一个Form mainForm ,其中有两个textBoxes txtUserNametxtPassword以及一个按钮btnLogin

我给出了以下txtUserName属性:

txtUserName属性

 AutoCompleteCustomSource - Collection --> Administrator --> Clerk AutoCompleteMode - Suggest AutoCompleteSource - CustomSource 

btnLogin_Click事件

 if (txtUserName.Text.Equals("Administrator") && txtPassword.Text.Equals("123")) { //function to access admin features } else if (txtUserName.Text.Equals("Clerk") && txtPassword.Text.Equals("123")) { //function to access clerk features } else { MessageBox.Show("Please Enter correct details", "Login Error"); } 

我已经将mainForm keypreview设置为true并将实现的函数设置为mainForm keyDown事件,如下面的代码所示:

mainForm_KeyDownEvent

 if (e.KeyCode.Equals(Keys.Enter)) //Invokes whenever Enter is pressed { btnLogin_Click(sender,e); //login } 

现在我的问题是,只要焦点在txtUserName并按下A ,就会显示下拉列表以选择“Administrator”(在我在上面的属性中显示的集合中定义)。 当我在键盘上单击Enter ,它显示的是MessageBox而不是选择“Administrator”。 我知道这是在调用mainForm的keydown事件。 如何禁用keyDown事件,当它在文本框下拉菜单上时,我可以按enter键吗?

编辑
我在public form()尝试了以下代码public form() ? 不工作

 InitializeComponent(); if (txtUserName.AutoCompleteMode) { /* showing red scribbles */ this.KeyDown -= mainForm_KeyDown; } 

您根本不应该处理Enter键。 您可以删除KeyDown处理程序,而是使用表单的AcceptButton属性来设置按下Enter时“单击”的按钮。 当另一个控件已经处理了Enter键时,这已经不应该“点击”按钮了。

这对您的情况来说还不够,因为标准的Windows行为按Enter键按下默认按钮。 例如,按Win + R获取Run …对话框,开始键入C: Use,按Down选择C: Users,按Enter键,看看会发生什么。

为了覆盖该行为,您需要使文本框告诉表单它将处理Enter键本身,以便表单不会将其发送到默认按钮。 这可以通过创建派生类并重写IsInputKey来完成:

 public class MyTextBox : TextBox { protected override bool IsInputKey(Keys keyData) { return base.IsInputKey(keyData) || ((keyData & ~Keys.Shift) == Keys.Enter && IsDroppedDown); } } 

但是, TextBox使用SHAutoComplete函数实现自动完成,该函数会在幕后自动创建一个IAutoComplete对象 。 无法访问该对象,因此,无法创建我在IsInputKey使用的IsDroppedDown属性。 它将使用IAutoCompleteDropDown.GetDropDownStatus实现,但由于该对象不可访问,因此您无法(可靠地)确定是否显示下拉列表。

您需要在使用内置AutoComplete*属性的情况下实现自动完成,或者您需要始终禁止Enter键(删除上述&& IsDroppedDown中的&& IsDroppedDown IsInputKey )。

更新 :这里是如何手动创建IAutoComplete对象。 管理员和文员字符串是硬编码的。 GetDropDownStatus函数用于在下拉列表可见时禁止任何默认按钮对Enter的处理。 欢迎反馈。

IAutoComplete.cs:

 using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; [ComImport] [Guid("00bb2762-6a77-11d0-a535-00c04fd7d062")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [CoClass(typeof(IAutoCompleteClass))] interface IAutoComplete { void Init(HandleRef hwndEdit, IEnumString punkACL, string pwszRegKeyPath, string pwszQuickComplete); void Enable(bool fEnable); } 

IAutoComplete2.cs:

 using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; [Guid("EAC04BC0-3791-11d2-BB95-0060977B464C")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAutoComplete2 { void Init(HandleRef hwndEdit, IEnumString punkACL, string pwszRegKeyPath, string pwszQuickComplete); void Enable(bool fEnable); void SetOptions(AutoCompleteOptions dwFlag); AutoCompleteOptions GetOptions(); }; 

AutoCompleteOptions.cs:

 using System; [Flags] enum AutoCompleteOptions : int { NOne= 0x00, AutoSuggest = 0x01, AutoAppend = 0x02, Search = 0x04, FilterPrefixes = 0x08, UseTab = 0x10, UpDownKeyDropsList = 0x20, RtlReading = 0x40, WordFilter = 0x80, NoPrefixFiltering = 0x100, } 

IAutoCompleteDropDown.cs:

 using System; using System.Runtime.InteropServices; using System.Text; [Guid("3CD141F4-3C6A-11d2-BCAA-00C04FD929DB")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAutoCompleteDropDown { void GetDropDownStatus(out AutoCompleteDropDownFlags dwFlags, out StringBuilder wszString); void ResetEnumerator(); } 

AutoCompleteDropDownFlags.cs:

 using System; [Flags] enum AutoCompleteDropDownFlags : int { NOne= 0x00, Visible = 0x01 } 

IAutoCompleteClass.cs:

 using System; using System.Runtime.InteropServices; [ComImport] [Guid("00BB2763-6A77-11D0-A535-00C04FD7D062")] class IAutoCompleteClass { } 

EnumString.cs:

 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; class EnumString : IEnumString { const int E_INVALIDARG = unchecked((int)0x80070057); const int S_OK = 0; const int S_FALSE = 1; int current; string[] strings; public EnumString(IEnumerable strings) { this.current = 0; this.strings = strings.ToArray(); } public void Clone(out IEnumString ppenum) { ppenum = new EnumString(strings); } public int Next(int celt, string[] rgelt, IntPtr pceltFetched) { if (celt <0) return E_INVALIDARG; int num = 0; while (current  celt) { current = strings.Length; return S_FALSE; } current += celt; return S_OK; } } 

MyTextBox.cs:

 using System; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; public class MyTextBox : TextBox { IAutoComplete2 autoComplete; IAutoCompleteDropDown autoCompleteDropDown; public bool IsDroppedDown { get { if (autoCompleteDropDown == null) return false; AutoCompleteDropDownFlags dwFlags; StringBuilder wszString; autoCompleteDropDown.GetDropDownStatus(out dwFlags, out wszString); return (dwFlags & AutoCompleteDropDownFlags.Visible) != AutoCompleteDropDownFlags.None; } } protected override void CreateHandle() { base.CreateHandle(); autoComplete = (IAutoComplete2)new IAutoComplete(); autoCompleteDropDown = (IAutoCompleteDropDown)autoComplete; autoComplete.SetOptions(AutoCompleteOptions.AutoSuggest); autoComplete.Init(new HandleRef(this, this.Handle), new EnumString(new string[] { "Administrator", "Clerk" }), null, null); } protected override void DestroyHandle() { ReleaseAutoComplete(); base.DestroyHandle(); } protected override void Dispose(bool disposing) { if (disposing) { ReleaseAutoComplete(); } base.Dispose(disposing); } protected override bool IsInputKey(Keys keyData) { return base.IsInputKey(keyData) || ((keyData & ~Keys.Shift) == Keys.Enter && IsDroppedDown); } void ReleaseAutoComplete() { if (autoComplete != null) { Marshal.ReleaseComObject(autoComplete); autoComplete = null; autoCompleteDropDown = null; } } } 

您需要覆盖keydown事件处理程序。

  protected override void OnKeyDown(KeyEventArgs e) { //call original event handler. Remove it if you don't need it at all. base.OnKeyDown(e); //Insert your code here.... } 

试试这个。 希望在焦点位于txtUsername或其他位置时按Enter键不会造成任何问题

如果您在txtUserName写入并按Enter键, Admministrator使用regular expression从您的autocompletecustomsource选择您的Admministrator选项,焦点将转到txtPassword 。 我的正则表达式非常灵活你可以将它限制为跟随严格匹配从开始,也可以删除忽略大小写

Regex rg = new Regex("^" + txtUserName.Text);

  private void mainForm_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode.Equals(Keys.Enter))// && !txtUserName.Focus())// && intFlag.Equals(0)) { if (txtUserName.Text.Length > 0) { if (txtUserName.Focused) { Regex rg = new Regex(txtUserName.Text, RegexOptions.IgnoreCase); for (int i = 0; i  0) { btnLogin_Click(null, null); //login } else { //MessageBox.Show("Please Give a Password"); txtPassword.Focus(); } } else { //MessageBox.Show("Please Give a username"); txtUserName.Focus(); } } //if (txtPassword.ContainsFocus) //{ // btnLogin_Click(sender, e); //login //} //else //{ // this.txtPassword.Focus(); //} } 

实际上,你有两个问题。

首先,将txtUserName的AutoCompleteMode属性设置为“SuggestAppend”,而不是简单地“建议”。 这样,如果用户键入第一个字母或两个字母,则正确的条目将自动附加到txtUSerName.Text。

接下来,修改您的表单代码如下:

 void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode.Equals(Keys.Enter)) //Invokes whenever Enter is pressed { if (txtPassword.ContainsFocus) { btnLogin_Click(sender, e); //login } else { this.txtPassword.Focus(); } } } private void btnLogin_Click(object sender, EventArgs e) { if (txtUserName.Text.Equals("Administrator") && txtPassword.Text.Equals("123")) { MessageBox.Show("Administrator"); } else if (txtUserName.Text.Equals("Clerk") && txtPassword.Text.Equals("123")) { MessageBox.Show("Clerk"); } else { MessageBox.Show("Please Enter correct details", "Login Error"); } } 

在上面,Key Down事件处理代码测试以查看密码文本框是否具有焦点(意味着,用户已经设定了用户名和密码,并准备提交数据)。 如果是,则调用btnLogin_Click事件。 否则,(意思是,txtUserName可能具有焦点)控制被传递给txtPassword以继续数据输入。

更新:重新 &#8211; 你的评论:

简单地杀掉Key Down Event处理程序中的逻辑,如下所示:

修订的事件处理代码:

 void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode.Equals(Keys.Enter)) //Invokes whenever Enter is pressed { btnLogin_Click(sender, e); //login } } 

注意,另一个小的改进(考虑到代码的整体结构)将使用combobox来选择UserName,并将自动完成源设置为“ListItems”,然后输入与文本框相同的选项。 这要求用户从预定义列表中进行选择。 这仍然具有与之前类似的可扩展性问题,但如果用户在输入用户名数据时只是输入拼写错误,则会为用户消除不必要的步骤。

请记住,用户倾向于不喜欢弹出消息不必要的中断。 允许他们从下拉列表中选择适当的“用户名”,输入正确的密码,然后继续。

有一些更好的方法来完成所有这些,但这应该调整你的工作顺序。

最后,请注意,最终您可能希望找到一种更强大的方法来执行此类validation。 任何时候您需要添加用户(在您的代码中,似乎更多地定义为“组”,您将需要添加到条件事件处理树。

您可以检查加密文件或数据库中的持久用户名和密码,并在运行时将它们加载到字典或其他内容中。 然后在user / Password上执行键/值查找。

或者其他的东西。

无论如何,希望有所帮助。

更新2:完整的代码一次性完成。 这应该按照你要求的方式行事:

上述就是C#学习教程:当焦点位于文本框的自动完成框时,禁用键事件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注&#8212;编程笔记

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.KeyDown +=new KeyEventHandler(Form1_KeyDown); } void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode.Equals(Keys.Enter)) //Invokes whenever Enter is pressed { btnLogin_Click(sender, e); //login } } private void btnLogin_Click(object sender, EventArgs e) { if (txtUserName.Text.Equals("Administrator") && txtPassword.Text.Equals("123")) { MessageBox.Show("Administrator"); } else if (txtUserName.Text.Equals("Clerk") && txtPassword.Text.Equals("123")) { MessageBox.Show("Clerk"); } else { MessageBox.Show("Please Enter correct details", "Login Error"); } } } } 


推荐阅读
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
author-avatar
手机用户2502940425
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有