Visual C# 2005 windows程序开发
重写textbox,要求该textbox中只能输入小数,该小数只有一个整数位(整数位可为零),小数点后面最多三位小数,从而整个textbox最大输入长度加上小数点为5。
先谢过了

解决方案 »

  1.   

    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;
    using FSSoft.Common;
    using FSSoft.Web.UI;
    namespace FSSoft.Web.Controls
    {
    /// <summary>
    /// 数字文本框WEB控件。
    /// </summary>
    /// <res>JS内需有RegularCheck和TrimControl函数。</res>
    [DefaultProperty("CheckNumType"),
    ToolboxData("<{0}:CNumTextBox runat=server></{0}:CNumTextBox>")]
    public class CNumTextBox : TextBox
    {
    private CheckType_Num checkType;
    private NotValidEvent validEvent;
    private string notValidMsgkey=string.Empty;
    /// <summary>
    /// 已屏蔽。
    /// </summary>
    [Browsable(false)]
    public override int Columns
    {
    get
    {
    return base.Columns;
    }
    }
    /// <summary>
    /// 已屏蔽。
    /// </summary>
    [Browsable(false)]
    public override int Rows
    {
    get
    {
    return base.Rows;
    }
    }
    /// <summary>
    /// 已屏蔽。
    /// </summary>
    [Browsable(false)]
    public override TextBoxMode TextMode
    {
    get
    {
    return base.TextMode;
    }
    }
    /// <summary>
    /// 已屏蔽。
    /// </summary>
    [Browsable(false)]
    public override bool Wrap
    {
    get
    {
    return base.Wrap;
    }
    }
    /// <summary>
    /// 设置或取得本控件数字检查类型。
    /// </summary>
    [
    Category("Check"),
    Description(@"设置或取得本控件数字检查类型:

    ZZValidNumeric1:數字(包含全角);
    ZZValidNumeric2:非負數字(包含全角);
    ZZValidInt1:非負整數(包含全角);
    ZZValidInt2:整數(包含全角);
    ZZValidInt3:負整數(包含全角);
    ZZValidInt4:正整數(包含全角);
    ZZValidInt5:非正整數(包含全角);")
    ]
    public virtual CheckType_Num CheckNumType
    {
    set
    {
    checkType=value;
    }
    get
    {
    return checkType;
    }
    }
    /// <summary>
    /// 设置或取得不正确文本验证事件处理类型。
    /// </summary>
    [
    Category("Check"),
    Description(@"设置或取得本控件事件处理:

    Clear:清空;
    AlertandSelect:弹出提示框并全选文本;
    AlertandClear:弹出提示框并清空文本;")
    ]
    public virtual NotValidEvent NotValidEventType
    {
    set
    {
    if(value==NotValidEvent.Clear)
    {
    notValidMsgkey=string.Empty;
    }
    validEvent=value;
    }
    get
    {
    return validEvent;
    }
    }
    /// <summary>
    /// 设置或取得提示框信息key。
    /// </summary>
    [
    Category("Check"),
    Description("设置或取得提示框信息key")
    ]
    public virtual string NotValidMsgkey
    {
    set
    {
    if(validEvent!=NotValidEvent.Clear)
    {
    notValidMsgkey=value;
    }
    else
    {
    notValidMsgkey=string.Empty;
    }
    }
    get
    {
    return notValidMsgkey.Trim();
    }
    }
    private bool imeDisabled=false;
    /// <summary>
    /// 输入法设置。
    /// </summary>
    [
    Category("Behavior"),
    Description("输入法设置。")
    ]
    public bool IMEDisabled
    {
    set
    {
    imeDisabled=value;
    }
    get
    {
    return imeDisabled;
    }
    }
    private Textalign textalign=Textalign.right;
    /// <summary>
    /// 文本框文本对齐方式。
    /// </summary>
    [
    Category("Appearance"),
    Description("文本框文本对齐方式设置。")
    ]
    public virtual Textalign TBTextAlign
    {
    set
    {
    textalign=value;
    }
    get
    {
    return textalign;
    }
    }
    /// <summary>
    /// 禁止TextChanged自动刷新。
    /// </summary>
    public override bool AutoPostBack
    {
    get
    {
    return base.AutoPostBack;
    }
    }
    /// <summary>
    /// 根据设置取得当前正则表达式验证字符串。
    /// </summary>
    /// <returns>返回当前正则表达式字符串。</returns>
    public string getRegularItem()
    {
    switch(checkType)
    {
    case CheckType_Num.ZZValidNumeric1:
    return RegularItems.ZZValidNumeric1;
    case CheckType_Num.ZZValidNumeric2:
    return RegularItems.ZZValidNumeric2;
    case CheckType_Num.ZZValidInt1:
    return RegularItems.ZZValidInt1;
    case CheckType_Num.ZZValidInt2:
    return RegularItems.ZZValidInt2;
    case CheckType_Num.ZZValidInt3:
    return RegularItems.ZZValidInt3;
    case CheckType_Num.ZZValidInt4:
    return RegularItems.ZZValidInt4;
    case CheckType_Num.ZZValidInt5:
    return RegularItems.ZZValidInt5;
    default:
    return RegularItems.ZZValidNumeric1;
    }
    }
    /// <summary>
    /// 属性修改。
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPreRender(EventArgs e)
    {
    base.OnPreRender(e);
    string strEvent=string.Empty;
    switch(NotValidEventType)
    {
    case NotValidEvent.Clear:
    strEvent="this.value='';this.focus();";
    break;
    case NotValidEvent.AlertandSelect:
    strEvent=string.Format("this.select();alert('{0}');",Language.Msg(NotValidMsgkey));
    break;
    case NotValidEvent.AlertandClear:
    strEvent=string.Format("this.select();alert('{0}');this.value='';this.select();",Language.Msg(NotValidMsgkey));
    break;
    }
    base.Attributes.Add("onblur","TrimControl(this);if(this.value!=''&&!RegularCheck(this.value,'"+getRegularItem()+"')){"+strEvent+"}");
    base.Attributes.Add("onpaste","return false");
    base.Attributes.Add("ondrop", "return false");
    if(imeDisabled)
    {
    base.Style.Add("ime-mode","disabled");
    }
    if(textalign!=Textalign.NoSet)
    {
    base.Style.Add("text-align",textalign.ToString());
    }
    }
    }
    }看看这个。,这是数字的
      

  2.   


    //给你参考下吧,在ProcessKeyEventArgs中来做处理,对于你说的长度之类的,我觉得最关键的是控制只能输入数字,长度你应该很容易搞定的。
    protected override bool ProcessKeyEventArgs(ref Message m)
    {
        int s = m.WParam.ToInt32();    if ((s < 48) || (s > 57))
        {
            /*
             * s==46表示"."
             * s==8表示"Backspace"键
             */
            if (s != 46 && s != 8)
            {
                return true;
            }        //如果已经输入了一个"."了,那么不能再输入".",也就是一个数值只能有一个"."
            if (s == 46)
            {
                if (this._Value.ToString().Contains("."))
                    return true;
            }
        }    return base.ProcessKeyEventArgs(ref m);
    }
    希望对你有帮助
      

  3.   

    参考下
    http://web.hnce.com.cn/hulianwang/wangluobiancheng/NET/2008/2/79664614.html
      

  4.   

    限定TEXTBOX只能输数字没必要重载TEXTBOX吧.....在TEXTBOX的CHANGE事件中.判断输入的合法性就可以了.
      

  5.   

    add 一个新web control library project,class命名为MyTextBoxpublic class MyTextBox : TextBox
    {
       //不用改变任何东东,只需重写Text Attribute:
       public override string Text
       {
           set { base.Text = StringIWant(value); }
           get { return base.Text;}
       }   private string StringIWant(string originalString)
       {
            //logic how to mask the string       return stringIWant; 
       }
    }
      

  6.   

    Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress        If TextBox1.Text.Length > 4 Then
                e.KeyChar = Chr(0)
            End If
            If TextBox1.Text.Length = 1 Then
                If e.KeyChar <> Chr(46) Then’判断第二位是否为'.'
                    e.KeyChar = Chr(0)
                End If
            Else
                If (e.KeyChar < Chr(48) Or e.KeyChar > Chr(57)) And _
                            e.KeyChar <> Chr(8) And e.KeyChar <> Chr(13) And e.KeyChar <> Chr(9) Then '判断是否为数字且不为退格键及Enter键 
                    e.KeyChar = Chr(0) '不是数字则为空 
                End If
            End If
        End Sub
      

  7.   

    Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress 
            If TextBox1.Text.Length = 1 Then 
                If e.KeyChar <> Chr(46) Then’判断第二位是否为'.' 
                    e.KeyChar = Chr(0) 
                End If 
            Else 
                If (e.KeyChar < Chr(48) Or e.KeyChar > Chr(57)) And _ 
                            e.KeyChar <> Chr(8) And e.KeyChar <> Chr(13) And e.KeyChar <> Chr(9) Then '判断是否为数字且不为退格键及Enter键 
                    e.KeyChar = Chr(0) '不是数字则为空 
                End If 
            End If 
            If TextBox1.Text.Length > 4 Then 
                e.KeyChar = Chr(0) 
            End If 
        End Sub 
    这样子效果可能会好一点。
      

  8.   

    刚写的,小程序不长,还绕了下,呵呵,如果不按格式就不能输入        string undotext = "";
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                string s = textBox1.Text;
                if (s.IndexOf('.') == -1 && s.Length >= 2)
                {
                    textBox1.Text = undotext;
                }
            }
            private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                undotext = textBox1.Text;
                if (e.KeyChar == '.' && undotext.IndexOf('.') != -1)
                    e.KeyChar = '\0';
                else if (e.KeyChar == '.' && undotext.Length == 0)
                    e.KeyChar = '\0';
                else
                {
                    if ((Convert.ToInt32(e.KeyChar) < 48 || Convert.ToInt32(e.KeyChar) > 57 ) && e.KeyChar != '.' && e.KeyChar != '\b')
                        e.KeyChar = '\0';
                }
            }
      

  9.   

    感觉没必要重写吧?!
    在validing事件写上就行,
    用正则应该可以.
      

  10.   


    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Windows.Forms;namespace OverrunPrint
    {
    /// <summary>
    /// MaskTextBox 的摘要说明。
    /// </summary>
    public class MaskTextBox : System.Windows.Forms.TextBox
    { #region  系统定义内容 /// <summary> 
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public MaskTextBox():base()
    { //初始化正则表达式类
    this.regex = new System.Text.RegularExpressions.Regex(this.sRegExInner); //将TextChanged事件与自定义的该事件的处理方法进行关联 一般说,如果直接在TextChanged事件做,由于不断的对this.Text进行赋值操作,
    //则会不断的引起该事件  所以可以采取委托与其进行关联,当触发时,只进行了一次触发,而不是连续触发
    this.TextChanged += new EventHandler(this.fCheck); } /// <summary> 
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #endregion  系统定义内容 #region   自定义变量
    //设置正则表达式串,默认为 可以输入26个英文字母、数字、下划线等(在外部输入中,系统会自动处理"\"的问题,所以不用在加@)
    private string sRegExInner = @"^\d*$"; private System.Text.RegularExpressions.Regex regex; public string sRegEx 
    {
    get
    {
    return sRegExInner;
    }
    set
    {
    //在设置变量的时候声明正则表达式类;否则由于对象已生成,则正则表达式形式已固化在对象之中,则外部设置是没有任何意义的(已更改不了已生成对象的正则表达式形式)
    this.sRegExInner = value;
    regex = new System.Text.RegularExpressions.Regex(this.sRegExInner);
    }
    }
             
    //用于记录先前的TextBox中的值,当输入不合法的字符串时,要对其进行
    private string sOldValue =""; #endregion #region 自定义方法
    //进行校验
    private void fCheck(object sender,System.EventArgs e)
    {
    if(this.regex.Match(this.Text).Success)
    {
    this.sOldValue = this.Text;
    }
    else
    {
    //以下内容,涉及到对this.Text进行了两次赋值,一次赋值时,并没有当时就再引发TextChanged事件,第二次才引发
                    if (this.sOldValue==string.Empty)
                    {
        this.Text = this.sOldValue;
        //追加空串,目的是将光标移至最后
        this.AppendText("");
                    }
                    else
                    {
                        this.Text = "";
                        //追加空串,目的是将光标移至最后
                        this.AppendText("");
                    }
    }
    }//函数体结束 #endregion 自定义方法
    }//类定义结束
    }