none
在一个TextBox中通过KeyEventArgs获取Table键的KeyValue总是得不到值啊!e.Handled=true已设置 RRS feed

  • 问题

  • 在KeyDown,KeyUp,KeyPress事件中 均设置了e.Handled=true;
    但就是捕捉不到 值 ,一按键就Table走了
    别直接告诉我他的KeyValue 关键不是这个KeyValue  而是这件事的解决方案,让我按Table键后 光标不移开 而且让我获取到了KeyValue
    假设 这个TextBox1旁边还有一个TextBox2,来接收KeyValue
    private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                e.Handled = true;
                textBox2.Text = e.KeyValue.ToString("X");
            }
    2009年5月25日 13:28

答案

  • 想在某个控件里让Tab键触发KeyDown事件,可以自定义控件,重写IsInputKey 方法
    using System;
    using System.Windows.Forms;
    public class MyTextBox :System.Windows.Forms.TextBox
    {
    	// Override IsInputKey method to identify the Special keys
    	protected override bool IsInputKey( System.Windows.Forms.Keys keyData ) 
    	{
    		switch ( keyData)
    		{
    			// Add the list of special keys that you want to handle 
    			case Keys.Tab: 
    				return true;
    			default:
    				return base.IsInputKey(keyData);
    		}
    	}
    }


    周雪峰
    • 已标记为答案 胖胖亮 2009年5月25日 14:39
    2009年5月25日 14:32
    版主

全部回复

  • 你好,你可以试试下面的方法

    1
            // Override From 的 ProcessCmdKey方法。
            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (keyData == Keys.Tab)
                {
                    MessageBox.Show("抓住Tab");
                    return true;
                }
    
                return base.ProcessCmdKey(ref   msg, keyData);
            }
    2 利用控件的 Leave 事件(焦点失去事件)



    知识改变命运,奋斗成就人生!
    2009年5月25日 13:52
    版主
  • 谢谢
    不过我的问题是这样的:

    关键不是这个KeyValue  而是这件事的解决方案,让我按Table键后 光标不移开 而且让我获取到了KeyValue
    假设 这个TextBox1旁边还有一个TextBox2,来接收KeyValue
    得到这个Table的KeyValue 很容易  但不是我想实现的方式
    我想解决  屏蔽Table键默认的处理 让它受程序的控制
    再次感谢你
    这个在很多时候都用的到
    2009年5月25日 14:05
  • 你好!
         这个键并不触发本控件KeyDown事件,所以你捕获不到这个键啊!但是有趣的是这个键可以触发接收焦点的KeyUp事件,比如你在textBox1里按Tab键,然后textBox2获得输入焦点,你可以在textBox2的KeyUp事件里捕获这个键:
             private void textBox2_KeyUp(object sender, KeyEventArgs e)
            {
               
                this.textBox2.Text = e.KeyValue.ToString("X");
               
            }
            你试试看!十分有趣的现象!
    周雪峰
    2009年5月25日 14:17
    版主
  • 想在某个控件里让Tab键触发KeyDown事件,可以自定义控件,重写IsInputKey 方法
    using System;
    using System.Windows.Forms;
    public class MyTextBox :System.Windows.Forms.TextBox
    {
    	// Override IsInputKey method to identify the Special keys
    	protected override bool IsInputKey( System.Windows.Forms.Keys keyData ) 
    	{
    		switch ( keyData)
    		{
    			// Add the list of special keys that you want to handle 
    			case Keys.Tab: 
    				return true;
    			default:
    				return base.IsInputKey(keyData);
    		}
    	}
    }


    周雪峰
    • 已标记为答案 胖胖亮 2009年5月25日 14:39
    2009年5月25日 14:32
    版主
  • 我十分想让 Table 键不要切换当前的焦点  没有办法让它停下来吗?让它在TextBox1里停留
    2009年5月25日 14:32
  • 试试我上面的方法!
    周雪峰
    2009年5月25日 14:34
    版主
  • 试试版主的方法
    知识改变命运,奋斗成就人生!
    2009年5月25日 14:36
    版主
  • 看来也只能重写控件了
    总算是达到了目的
    谢谢两位的关注
    2009年5月25日 14:40