zoukankan      html  css  js  c++  java
  • winform 数字输入控件初稿

    直接贴上代码
      1 using System;
      2 using System.ComponentModel;
      3 using System.Globalization;
      4 using System.Runtime.InteropServices;
      5 using System.Windows.Forms;
      6 
      7 namespace SimpleControl
      8 {
      9     /*
     10      * 1.只能输入数字和小数点
     11      * 2.在最前面输入0无效
     12      * 3.只能输入一个小数点,输入小数点时检查是否已经存在小数点了,存在就把光标移到小数点的后面
     13      */
     14     //[ToolboxBitmap(typeof(NumericTextBox), "NumericTextBox.ico")]
     15     public class SimNumericTextBox : TextBox, ISupportInitialize
     16     {
     17 
     18         #region -- ISupportInitialize --
     19         public void BeginInit()
     20         {
     21 
     22         }
     23 
     24         public void EndInit()
     25         {
     26 
     27         }
     28         #endregion -- ISupportInitialize --
     29 
     30         #region -- 属性 --
     31         public event EventHandler ValueChanged;
     32 
     33         bool showUpDown = true;
     34         public bool ShowUpDown
     35         {
     36             get { return showUpDown; }
     37             set { showUpDown = value; }
     38         }
     39 
     40         public double increment = 1;
     41         public double Increment
     42         {
     43             get { return increment; }
     44             set { increment = value; }
     45         }
     46 
     47 
     48         public override string Text
     49         {
     50             get
     51             {
     52                 return base.Text;
     53             }
     54             set
     55             {
     56                 try
     57                 {
     58                     double d = 0;
     59                     double.TryParse(value, out d);
     60                     base.Text = d.ToString(displayFormat);
     61                     return;
     62                 }
     63                 catch
     64                 {
     65                 }
     66             }
     67         }
     68 
     69         public double Value
     70         {
     71             get
     72             {
     73                 double d = 0;
     74                 double.TryParse(this.Text, out d);
     75                 return d;
     76             }
     77             set
     78             {
     79                 try
     80                 {
     81                     base.Text = value.ToString(displayFormat);
     82                     return;
     83                 }
     84                 catch
     85                 {
     86                 }
     87             }
     88         }
     89 
     90         private string displayFormat = "f2";
     91         [DefaultValue("f2")]
     92         public string DisplayFormat
     93         {
     94             get
     95             {
     96                 return displayFormat;
     97             }
     98             set
     99             {
    100                 displayFormat = value;
    101             }
    102         }
    103 
    104 
    105         double maxValue = double.MaxValue;
    106         [DefaultValue(double.MaxValue), Description("Indicates maximum value that can be entered.")]
    107         public double MaxValue
    108         {
    109             get
    110             {
    111                 return this.maxValue;
    112             }
    113             set
    114             {
    115                 this.maxValue = value;
    116             }
    117         }
    118 
    119         double minValue = double.MinValue;
    120         [Description("Indicates minimum value that can be entered."), DefaultValue(double.MinValue)]
    121         public double MinValue
    122         {
    123             get
    124             {
    125                 return this.minValue;
    126             }
    127             set
    128             {
    129                 this.minValue = value;
    130             }
    131         }
    132 
    133 
    134         #endregion -- 属性 --
    135 
    136         /// <summary>
    137         /// Required designer variable.
    138         /// </summary>
    139         private System.ComponentModel.Container components = null;
    140 
    141         private void Init()
    142         {
    143             InitializeComponent();
    144             this.BorderStyle = BorderStyle.FixedSingle;
    145             this.TextAlign = HorizontalAlignment.Right;
    146         }
    147 
    148         public SimNumericTextBox(System.ComponentModel.IContainer container)
    149         {
    150             container.Add(this);
    151 
    152             Init();
    153         }
    154 
    155         public SimNumericTextBox()
    156         {
    157             Init();
    158         }
    159 
    160         #region Component Designer generated code
    161         /// <summary>
    162         /// Required method for Designer support - do not modify
    163         /// the contents of this method with the code editor.
    164         /// </summary>
    165         private void InitializeComponent()
    166         {
    167             components = new System.ComponentModel.Container();
    168         }
    169         #endregion
    170 
    171 
    172         //ProcessCmdKey
    173         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    174         {
    175             //return base.ProcessCmdKey(ref msg, keyData);
    176             if (keyData == (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作
    177             {
    178                 string text = Clipboard.GetText();
    179                 this.Text = text;
    180                 return true;
    181             }
    182             if (keyData == (Keys)Shortcut.Del)
    183             {
    184                 if (base.SelectionStart < this.Text.Length && Text.Substring(base.SelectionStart, 1) == ".")
    185                 {//在小数点的前面点击del
    186                     return true;
    187                 }
    188 
    189                 if (base.SelectionStart < this.Text.Length && this.SelectedText != null && this.SelectedText.Length > 0)
    190                 {
    191                     int start = base.SelectionStart;
    192                     string previewText = this.Text.Substring(0base.SelectionStart) + this.Text.Substring(base.SelectionStart + this.SelectedText.Length);
    193                     this.Text = previewText;
    194                     LoadValue();
    195                     return true;
    196                 }
    197                 LoadValue();
    198             }
    199             return base.ProcessCmdKey(ref msg, keyData);
    200         }
    201 
    202         protected override void OnKeyUp(KeyEventArgs e)
    203         {
    204             LoadValue();
    205             base.OnKeyUp(e);
    206         }
    207 
    208         ///失去焦点时格式化数据,复制进来的数据,如果非正常数字格式,则为0
    209         protected override void OnLostFocus(EventArgs e)
    210         {
    211             LoadValue();
    212             //this.Select(this.Text.Length, 0);
    213 
    214             base.OnLostFocus(e);
    215         }
    216 
    217 
    218 
    219         ///处理按键事件
    220         protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
    221         {
    222             //e.Handled = true;//true输入无效  false能输入
    223             //return;
    224             int ch = (int)e.KeyChar;
    225             e.Handled = true;
    226             int startBase = base.SelectionStart;
    227             /// 处理负号
    228             if (ch == 45)
    229             {
    230 
    231                 if (this.Text == "")
    232                     e.Handled = false;
    233                 else if (!this.Text.StartsWith("-"))
    234                 {
    235                     /// 没有负号
    236                     this.Text = "-" + this.Text;
    237                     this.Select(startBase + 10);
    238                 }
    239                 else
    240                 {
    241                     /// 有负号
    242                     this.Text = this.Text.Remove(01);
    243                     if (startBase > 0)
    244                         this.Select(startBase - 10);
    245                     else
    246                         this.Select(00);
    247                 }
    248                 return;
    249             }
    250 
    251             /// 数字,Backspace
    252             if ((ch > 47 && ch < 58) || ch == 8)
    253             {
    254                 e.Handled = false;
    255 
    256                 if (this.Text == "" || this.Text == "-")
    257                 {
    258                     return;
    259                 }
    260                 /*
    261                 if (this.Text == "0" || this.Text == "-0")
    262                 {
    263                     if (ch == 48)
    264                         e.Handled = true;
    265                     else
    266                     {
    267                         if (this.Text.StartsWith("-"))
    268                             this.Text = "-";
    269                         else
    270                             this.Text = "";
    271                         this.Select(this.Text.Length, 0);
    272                     }
    273                     return;
    274                 }
    275                 if (this.Text == "0." || this.Text == "-0.")
    276                 {
    277                     return;
    278                 }
    279                 */
    280 
    281 
    282                 if (ch == 8)//退格键
    283                 {
    284                     if (base.SelectionStart == (Text.IndexOf(".") + 1))
    285                     {//在小数点的后面点击退格键
    286                         e.Handled = true;
    287                         return;
    288                     }
    289                 }
    290                 else
    291                 {
    292                     if (base.SelectionStart <= this.Text.Length)
    293                     {
    294                         int start = this.SelectionStart;
    295                         string previewText = this.Text.Substring(0base.SelectionStart) + e.KeyChar.ToString() + this.Text.Substring(base.SelectionStart + this.SelectedText.Length);
    296                         this.Text = previewText;
    297                         if (previewText.IndexOf("0") == 0)
    298                         {
    299                             this.Select(start, 0);
    300                         }
    301                         else
    302                         {
    303                             this.Select(start + 10);
    304                         }
    305                         /*double oldValue = 0;
    306                         double isValue = 0;
    307                         double.TryParse(previewText, out isValue);
    308                         double.TryParse(this.Text, out oldValue);
    309 
    310                         if (isValue != 0)
    311                         {
    312                             this.Text = isValue.ToString(displayFormat);
    313                             if (oldValue != isValue)
    314                                 this.Select(start + 1, 0);
    315                             else
    316                                 this.Select(start, 0);
    317                         }*/
    318                         e.Handled = true;
    319                     }
    320                 }
    321                 return;
    322             }
    323 
    324             /// 小数点
    325             if (ch == 46)
    326             {
    327                 if (this.Text.IndexOf(".") < 0)
    328                     e.Handled = false;
    329                 else
    330                 {
    331                     this.SelectionStart = this.Text.IndexOf(".")+1;
    332                     e.Handled = true;
    333                 }
    334             }
    335         }
    336 
    337         /// <summary>
    338         /// 加载值
    339         /// </summary>
    340         private void LoadValue()
    341         {
    342             string oldText = this.Text;
    343             double v = 0;
    344             double.TryParse(this.Text, out v);
    345 
    346             if (v > maxValue)
    347                 v = maxValue;
    348             if (v < minValue)
    349                 v = minValue;
    350             this.Text = v.ToString(displayFormat);
    351             if (Text.Length > 0 && (Text == "0" || Text.IndexOf("0.") == 0))//初始输入状态
    352             {
    353                 this.SelectionStart = 1;
    354             }
    355             if (ValueChanged != null)
    356             {
    357                 EventArgs e = new EventArgs();
    358                 ValueChanged(this, e);
    359             }
    360         }
    361 
    362     }

    363 } 

  • 相关阅读:
    latin1
    分享:Django博客开发笔记之博客摘要
    分享:RethinkDB 1.3 发布,分布式 JSON 数据库
    分享:RethinkDB 1.3 发布,分布式 JSON 数据库
    分享:RethinkDB 1.3 发布,分布式 JSON 数据库
    网络神采 最专业的网络信息采集系统! 采集软件_网站采集器_采集程序_新闻采集系统_网络信息采集_文章采集
    分享:RethinkDB 1.3 发布,分布式 JSON 数据库
    分享:RethinkDB 1.3 发布,分布式 JSON 数据库
    'module' object has no attribute 'setdefaultencoding'_阿King's blog_百度空间
    QTreeWidget Class Reference
  • 原文地址:https://www.cnblogs.com/OwenWu/p/2633868.html
Copyright © 2011-2022 走看看