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(0, base.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 + 1, 0);
238 }
239 else
240 {
241 /// 有负号
242 this.Text = this.Text.Remove(0, 1);
243 if (startBase > 0)
244 this.Select(startBase - 1, 0);
245 else
246 this.Select(0, 0);
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(0, base.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 + 1, 0);
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 }
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(0, base.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 + 1, 0);
238 }
239 else
240 {
241 /// 有负号
242 this.Text = this.Text.Remove(0, 1);
243 if (startBase > 0)
244 this.Select(startBase - 1, 0);
245 else
246 this.Select(0, 0);
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(0, base.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 + 1, 0);
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 }