Viết một điều khiển thừa kế từ Textbox hỗ
trợ thêm thuộc tính NumericOnly; Nếu NumericOnly = true thì sẽ bật chế độ chỉ
nhập số như sau :
-
Chỉ cho phép nhập giá
trị số hợp lệ , các giá trị số hợp lệ (là số nguyên hoặc số thực, có dấu hoặc
không có dấu, vv.)
-
Nếu nhập dữ liệu không
hợp lệ , chương trình
thông báo lỗi và bắt nhập lại đến khi đúng
-
Một số trường hợp ngoại
lệ :
o
Nếu ký tự đầu tiên là dấu
bằng “=” thì text được hiểu là 1 công thức, chương trình sẽ tự động tính công
thức và thay text hiện thời bằng giá
trị của công thức sau khi người dùng nhấn enter hoặc thoát khỏi điều khiển nếu
công thức hợp lệ ngược lại sẽ báo lỗi và yêu cầu user nhập lại
o
Có ngoại lệ với một số trường hợp, các ký tự
t,n được thay thế = các cụm số 0 để tăng tốc nhập liệu cho người dùng cuối; ví
dụ : 3t = 300 , 3n = 3000. Khi người dùng nhấn t thì hệ thống sẽ thay thế tự động
bằng “000”
o
Dữ liệu hiển thị trên
textbox phải được phân tách thành các cụm 3 số, ví dụ: 3 000 000 cho dễ đọc, với số sau dấu . thì không được
phân tách, ví dụ: 200 000.12234
Coding:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ControlTextBoxByQuangIT
{
public partial class TextBoxByQuangIT : TextBox
{
bool
fPoint;
string[]
cong;
string[]
tru;
string[]
nhan;
string[]
chia;
string
first;
string
last;
/// <summary>
/// Contructor
/// </summary>
public
TextBoxByQuangIT()
: base()
{
InitializeComponent();
//Đăng ký
hàm xử lý sự kiện KeyPress
this.KeyPress
+= new KeyPressEventHandler(OnKeyPress);
}
//Định nghĩa
thuộc tính NumericOnly miêu tả chế độ làm việc
private
int intValidType = (int)NumericOnly.False;
public NumericOnly ValidateFor
{
get
{ return (NumericOnly)intValidType;
}
set
{ intValidType = (int)value;
}
}
/// <summary>
/// Hàm xử lý sự kiện gõ phím KeyPress
/// </summary>
/// <param
name="sender"></param>
/// <param
name="e"></param>
protected
void OnKeyPress(object
sender,
KeyPressEventArgs
e)
{
//Xác định
mã ký tự được nhập
char
ch = e.KeyChar;
//Kiểm
tra chế độ hoạt động để thực hiện
switch
(intValidType)
{
case
(int)NumericOnly.True:
if
(ch == '.' && fPoint == false)
{
fPoint = true; return;
}
else
if (ch == '+'
|| ch == '-' || ch == '*' || ch == '/'
|| ch == '=')
{
return;
}
else
if (ch == 't')
{
this.Text = this.Text + "00";
e.KeyChar = (char)0;
return;
}
else
if (ch == 'n')
{
this.Text = this.Text + "000";
e.KeyChar = (char)0;
return;
}
else
if (ch == (char)13)
{
string sub = this.Text.Substring(0,
this.Text.Length - (this.Text.Length
- 1));
if (sub == "=")
{
this.Text = this.Text.Replace("=", "");
cong = this.Text.Split('+');
first = cong[0];
last =
cong[cong.Length - 1];
if (cong.Length > 1)
{
this.Text = (Convert.ToInt32(first)
+ Convert.ToInt32(last)).ToString();
}
tru = this.Text.Split('-');
first = tru[0];
last =
tru[tru.Length - 1];
if (tru.Length > 1)
{
this.Text = (Convert.ToInt32(first)
- Convert.ToInt32(last)).ToString();
}
nhan = this.Text.Split('*');
first = nhan[0];
last =
nhan[nhan.Length - 1];
if (nhan.Length > 1)
{
this.Text = (Convert.ToInt32(first)
* Convert.ToInt32(last)).ToString();
}
chia = this.Text.Split('/');
first = chia[0];
last =
chia[chia.Length - 1];
if (chia.Length > 1)
{
if (Convert.ToInt32(last)
!= 0)
this.Text =
(Convert.ToInt32(first) / Convert.ToInt32(last)).ToString();
else
MessageBox.Show("Không
thể chia cho 0");
}
}
}
else
if (!char.IsControl(e.KeyChar)
&& !char.IsDigit(e.KeyChar))
{
this.Text = "";
MessageBox.Show("Lỗi. Mời nhập
lại");
e.KeyChar = (char)0;
}
return;
}
}
/// <summary>
/// Sử dụng enum để định nghĩa thứ tự tên sẽ xuất hiện
/// </summary>
public enum NumericOnly
{
True = 0,
False
}
}
}