满足用户体验,在数据录入时,能在输入完一个信息后通过回车或Tab键自动的切换到下一个控件(字段).

在界面控件设计时,默认可以通过设置控件的TabIndex来实现.但在布局调整时或者是对输入的内容有选择性时,从用代码的方式来处理显得更好维护一点.

完整的实现方法如下:

/// <summary>
/// 回车、Tab键盘切换或执行操作
/// </summary>
public sealed class TabEnter:IDisposable
{
private List<StringBuilder> ml;
private int i=0;
private System.Windows.Forms.Control mc;
/// <summary>
/// 知否启用Tab键功能
/// </summary>
private bool mallowTab=false;
/// <summary>
/// 是否启用Tab键切换/执行.
/// </summary>
public bool AllowTab
{
get { return mallowTab; }
set { mallowTab = value; }
}
public TabEnter(System.Windows.Forms.Control c)
{
ml = new List<StringBuilder>();
mc = c;
}
public TabEnter(System.Windows.Forms.Control c, bool allowTab):this(c)
{
mallowTab = allowTab;
}
public void Add(System.Windows.Forms.Control c)
{
c.KeyPress += KeyPressHandler;
c.TabIndex = i;
ml.Add(new StringBuilder(c.Name));
i += 1;
}
/// <summary>
/// 在需要独立处理KeyPress时间时,采用KeyUp来执行,当然可继续实现KeyDown
/// </summary>
/// <param name="c"></param>
public void AddKeyUp(System.Windows.Forms.Control c)
{
c.KeyUp += KeyUpHandler;
c.TabIndex = i;
ml.Add(new StringBuilder(c.Name));
i += 1;
}
private void KeyPressHandler(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if ((e.KeyChar == (Char)13) || (e.KeyChar == (Char)9 && mallowTab == true))
{
int j = ((System.Windows.Forms.Control)sender).TabIndex;
if (j >= ml.Count - 1) return;
string cname = ml[j + 1].ToString();
if (string.IsNullOrEmpty(cname)) return;
System.Windows.Forms.Control[] tca = mc.Controls.Find(cname, true);
if (tca == null || tca.Length == 0) return;
System.Windows.Forms.Control tc = tca[0];
if (tc == null) return;
System.Windows.Forms.Button b = tc as System.Windows.Forms.Button;
if (b != null)
b.PerformClick();
else
tc.Focus();
}
}
private void KeyUpHandler(Object sender, System.Windows.Forms.KeyEventArgs e)
{
if ((e.KeyCode == System.Windows.Forms.Keys.Enter) || (e.KeyCode == System.Windows.Forms.Keys.Tab && mallowTab == true))
{
int j = ((System.Windows.Forms.Control)sender).TabIndex;
if (j >= ml.Count - 1) return;
string cname = ml[j + 1].ToString();
if (string.IsNullOrEmpty(cname)) return;
System.Windows.Forms.Control[] tca = mc.Controls.Find(cname, true);
if (tca == null || tca.Length == 0) return;
System.Windows.Forms.Control tc = tca[0];
if (tc == null) return;
if (tc.GetType()==typeof(System.Windows.Forms.Button))
{
((System.Windows.Forms.Button)tc).PerformClick();
}
else
{
if (tc.Visible == true) tc.Focus();
} }
}
#region "资源释放"
public void Dispose()
{
Disposing(true);
GC.SuppressFinalize(this);
}
private bool m_disposed = false;
protected void Disposing(bool disposing)
{
if (!m_disposed)
{
if (disposing)
{
//Release managed resources
ml.Clear();
ml = null;
i = 0;
mc = null;
}
//Release unmanaged Resources
m_disposed = true;
}
} ~TabEnter()
{
Disposing(false);
}
#endregion
}

  

[C#]Winform下回车或Tab键自动切换下一个控件焦点的更多相关文章

  1. winform显示word、ppt和pdf,用一个控件显示

    思路:都以pdf的格式展示,防止文件拷贝,所以要把word和ppt转换为pdf:展示用第三方组件O2S.Components.PDFView4NET.dll,破解版的下载链接:https://pan. ...

  2. 小技巧--tab键自动补齐Git命令

    Git是什么,你不清楚? 好吧,那么该篇内容对你也木有帮助,请绕道而行.. 我们在使用Git命令时,可以通过tab键,自动补齐Git,特别是在切换分支时特别有用. 如下,当我们想将当前分支切换到bug ...

  3. CentOS6.5(2)----安装Tab键自动补全功能:bash-completion

    首先要确保网络畅通,因为该过程要通过网络下载相关的软件包. 在 root 用户下,使用 cd ~/Downloads 命令进入下载文件夹,然后依次输入如下三个命令: [root@prime:~/Doc ...

  4. Python之Tab键自动补全

    首先备份一下Tab键自动补全代码: # python start file import sys import readline import rlcompleter import atexit im ...

  5. python学习笔记--导入tab键自动补全功能的配置

    今天开始学习Python,必须配置tab键补全功能 1.首先我们需要查看python的安装路径 [root@abc ~]# python Python 2.6.6 (r266:84292, Jan 2 ...

  6. python实现tab键自动补全

    一.查询python安装路径,一般默认是/usr/lib64/ [root@host2 ~]# python Python (r266:, Jul , ::) [GCC (Red Hat -)] on ...

  7. Python中tab键自动补全功能的配置

    新手学习Python的时候,如何没有tab键补全功能,我感觉那将是一个噩梦,对于我们这种菜鸟来说,刚接触python,对一切都不了解,还好有前辈们的指导,学习一下,并记录下来,还没有学习这个功能小伙伴 ...

  8. 修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615 在duilib中,按tab键会让焦点在Button一类的控 ...

  9. Winform开发中如何将数据库字段绑定到ComboBox控件

    最近开始自己动手写一个财务分析软件,由于自己也是刚学.Net不久,所以自己写的的时候遇到了很多问题,希望通过博客把一些印象深刻的问题记录下来. Winform开发中如何将数据库字段绑定到ComboBo ...

随机推荐

  1. time_t转换为DateTime

    最近解析文华财经的日线数据. 取得的第一个字段是日期,为time_t格式(long)的. 因为是用C#来写解析程序,所以要转换为DateTime的. time_t是世界时间,要转换为本地时间,所以要加 ...

  2. 让sublime text 3默认新建GBK文件

    想让sublime text支持显示或者保存中文,需要安装插件convertToUTF8,具体安装可以问度娘. 安装插件以后,想让保存的html文件支持中文,可以通过ctrl+shift+C来完成.但 ...

  3. hdu 2553 N皇后问题 (经典DFS)

    题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...

  4. windows 下实现函数打桩:拦截API方式

    windows 下实现函数打桩:拦截API方式            近期由于工作须要,開始研究函数打桩的方法. 由于不想对project做过多的改动,于是放弃了使用Google gmock的想法. ...

  5. BZOJ 1968: [Ahoi2005]COMMON 约数研究 水题

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  6. c# socket通信较完善方案

    c#的socket通信应用.文件较多.附件为工程.  core   AbstractBytesWorker.cs    字节工作器(基类),用于用于同一不同功能的字节工作器  BinaryHand.c ...

  7. codeforces 468B 2-sat

    今天明确了2-SAT; 表示对一对整数之间的关系是否存在 #include<cstdio> #include<algorithm> #include<iostream&g ...

  8. Android自己定义DataTimePicker(日期选择器)

    Android自己定义DataTimePicker(日期选择器)  笔者有一段时间没有发表关于Android的文章了,关于Android自己定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中.本篇 ...

  9. HDU 1498 50 years, 50 colors (行列匹配+最小顶点覆盖)

    题目:点击打开链接 题意:每个格子有不同颜色的气球用不同数字表示,每次可选某一行              或某一列来戳气球.每个人有K次机会.求最后哪些气球不能在             k次机会内 ...

  10. JS来推断文本框内容改变事件

       oninput,onpropertychange,onchange的使用方法 onchange触发事件必须满足两个条件: a)当前对象属性改变,而且是由键盘或鼠标事件激发的(脚本触发无效) b) ...