目标是新做的textbook控件只接收键盘输入的数字。但是我测试的时候根本没有反应,不管输入什么字符,textbook都会接受。是不是哪个地方是错误的,请达人给指出错误,谢谢!using System;
using System.Collections.Generic;
using System.Text;namespace WindowsControlLibrary4
{
    public class Class1 : System.Windows.Forms.TextBox
    {
        protected override void WndProc(ref System.Windows.Forms.Message m)
        {
            if (m.Msg == 0x0102 && !Char.IsControl((char)m.LParam))
            {
                if (Char.IsNumber((char)m.LParam))
                    base.WndProc(ref m);
                else return;
            }
            else
                base.WndProc(ref m);
        }
    }
}

解决方案 »

  1.   

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;namespace Tangxu.Controls
    { [ToolboxItem(true)]
    [ToolboxBitmap(typeof(System.Windows.Forms.TextBox))]
        public class TextBox : System.Windows.Forms.TextBox, IUIControlSkin
    {
    [DllImport("user32.dll")]
    static extern IntPtr GetWindowDC(IntPtr hWnd);
    [DllImport("user32.dll")]
    static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);        private Color _BorderColor = ControlCommon.BorderColor;
    private bool _checkChar = false;
            private bool _checkNum = false; #region 属性
    [ Category("外观"),
    Description("获得或设置控件的边框颜色")]
    public Color BorderColor
    {
    get

    return this._BorderColor; 
    }
    set

    this._BorderColor = value; 
    this.Invalidate(); 
    }
    }   
    [ Category("外观"),
    Description("设置控件检查字母与数字"), DefaultValue(false)]
    public bool CheckChar
    {
    get

    return this._checkChar; 
    }
    set

    this._checkChar = value; 
    }
    }
            [Category("外观"),
            Description("设置控件检查数字"), DefaultValue(false)]
            public bool CheckNum
            {
                get
                {
                    return this._checkNum;
                }
                set
                {
                    this._checkNum = value;
                }
            }   
    #endregion 属性 /// <summary>
    /// 
    /// </summary>
    public TextBox():base()
    {
    // _BorderColor = Color.FromArgb(198,197,202);
                _BorderColor = ControlCommon.BorderColor;
                this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                if (_checkChar || _checkNum)
                {
                    this.ImeMode = ImeMode.Disable;
                }
    } protected override void WndProc(ref Message m)
    {
    base.WndProc (ref m);
    if (m.Msg==0xf || m.Msg==0x133)
    {
    IntPtr hDC = GetWindowDC(m.HWnd); 
    if (hDC.ToInt32() == 0) 

    return; 
    }  if(this.BorderStyle == System.Windows.Forms.BorderStyle.FixedSingle)
    {
    Pen pen = new Pen(this._BorderColor,1);
    pen.Color = this._BorderColor ;
    Graphics g  = Graphics.FromHdc(hDC); 
    g.SmoothingMode = SmoothingMode.AntiAlias;      
    g.DrawRectangle(pen,0,0,this.Width-1, this.Height-1) ;

    pen.Dispose();
    }
    m.Result = IntPtr.Zero; 
    ReleaseDC(m.HWnd,hDC);
    }
    } protected override void OnKeyPress(KeyPressEventArgs e)
    {
                base.OnKeyPress(e);
                if (_checkChar)
                {
                    if (IsCharAndNum(e.KeyChar))
                        e.Handled = false;//允许输出
                    else
                        e.Handled = true;//禁止输出
                }            if (_checkNum)
                {
                    if (IsNum(e.KeyChar))
                        e.Handled = false;//允许输出
                    else
                        e.Handled = true;//禁止输出
                }
    } private bool IsCharAndNum(char keyChar)
    {
    if (( keyChar >= 48 && keyChar <= 57 ) || ( keyChar >= 65 && keyChar <= 90 ) || ( keyChar >= 97 && keyChar <= 122 ) || keyChar == 32 || keyChar == 8 )
    return true;
    else
    return false;
    }        private bool IsNum(char keyChar)
            {
                if ((keyChar >= 48 && keyChar <= 57))
                    return true;
                else
                    return false;        }        public void SkinChanged(UISkin newSkin)
            { 
            
            }
    }
    }
      

  2.   

    dunao 我真的很感谢你能分享这么好的代码。可是我只希望你能看下我的代码到底错出在哪了?
      

  3.   

    请参考拙文:定制C# TextBox中只允许输入数字的解决方法
      

  4.   

    LZ你希望的是只接收数字???那么Char.IsControl你用的就有问题了吧,我看了下Char.IsControl的解释,好像是判断输入字符是否是 控制字符 ,好像并不是你要求的字母吧
      

  5.   

    你好jy251  我用的是!Char.IsControl  就是排除掉了 控制字符啊。
      

  6.   

    你好hulihui 你的方法也很棒,你可以帮我看下问题到底出在哪吗?