在Textbox的輸入中﹐我們常常需要控制輸入的類型﹐比如說只能輸入數字﹐當然實現的方法很多﹐我總結了一下我做過的一些項目﹐我常會使用以下這三種﹕
1﹑使用Try...Catch
private
static
bool
IsNumeric(
string
itemValue,
int
intFLag)
{
try
{
int i = Convert.ToInt32(itemValue);
return true;
}
catch
{
return false;
}
}
2﹑使用正則表達式
using
System.Text.RegularExpressions;
private
static
bool
IsNumeric(
string
itemValue)
{
return (IsRegEx("^(-?[0-9]*[.]*[0-9]{0,3})$", itemValue));
}

private
static
bool
IsRegEx(
string
regExValue,
string
itemValue)
{
try
{
Regex regex = new System.Text.RegularExpressions.Regex(regExValue);
if (regex.IsMatch(itemValue)) return true;
else return false;
}
catch (Exception )
{
return false;
}
finally
{
}
}
3﹑判斷輸入的keyCode
public
static
bool
IsNumeric(System.Windows.Forms.KeyPressEventArgs e)
{
if ((e.KeyChar >= (char)48 && e.KeyChar<=(char)57) ||
e.KeyChar ==(char)8 || e.KeyChar ==(char)45 || e.KeyChar ==(char)47)
{
}
else
{
e.Handled=true;
}
return true;
}
@东海风
真是明眼人﹐第一種方法確實是只檢測0~9的整數的﹗
第二種方法﹐說實在的﹐你是第一個幫我指出來的。謝謝﹗
return (IsRegEx(@"^/-?/(?([0-9]{0,3}(/,?[0-9]{3})*(/.?[0-9]*))/)?$", itemValue));
第三種方法﹐我是在KeyPress中調用﹐如果粘貼過來的是無法保存的(因為我是有綁定數據﹐綁定的類型是數值型)。而且是無法輸入漢字的﹐你可以試試。
當然﹐要禁止粘貼的話﹐我是有寫一個新Textbox控件的﹐一并將源碼貼出來﹕
///
/// 只有輸入數字的TextBox控件﹐如果去掉ProcessKeyEventArgs方法﹐而可實現只粘貼數字。
///
[Designer(typeof(NumberTextBox.NumberTextBoxDesigner))]
public class NumberTextBox:System.Windows.Forms.TextBox
{
public const int WM_PASTE = 0x0302;//粘貼消息
public const int WM_CHAR = 0x0102;//輸入字符消息(鍵盤輸入的)
[DllImport("user32.dll")]
public static extern bool MessageBeep(uint UType);
protected override bool ProcessKeyEventArgs(ref Message m)
{
int nKey = m.WParam.ToInt32();
if ((nKey >= (char)48 && nKey<=(char)57) ||
nKey ==(char)8 || nKey ==(char)45 || nKey ==(char)46)
{
return base.ProcessKeyPreview(ref m);
}
else
{
if (m.Msg==256 && nKey ==46)
return base.ProcessKeyPreview(ref m);
if (m.Msg ==258)
{
MessageBeep(0);
}
}
return true;
}
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_CHAR)//取m.WParam 進行判斷m.WParam 就是用戶輸入的字元的 int 表示方式,如果是被限制的字元直接 Return不走base.WndProc(ref m);
{
int keyChar = m.WParam.ToInt32();
bool charOk=(keyChar>47 && keyChar<58) || //數字
keyChar==8 || //退格
keyChar==3 || keyChar==22 || keyChar==24;//拷貝﹑粘貼﹑刪除
if(!charOk)return;
}
if(m.Msg == WM_PASTE)//判斷剪貼板的資料是否是符合要求如果符合不做任何處理否則 Return不走base.WndProc(ref m)
{
IDataObject iData = Clipboard.GetDataObject();//取剪貼板物件
if(iData.GetDataPresent(DataFormats.Text)) //判斷是否是Text
{
string str;
str = (String)iData.GetData(DataFormats.Text); //取資料
/*如果需要正負號,先要判斷TextBox 上游標的位置,如果游標在最前面可以用這個,^(((/+|-)/d)?/d*)$ */
if (!System.Text.RegularExpressions.Regex.IsMatch(str,@"^(/d{1,})$")) return;//如果是數位(可以粘貼跳出)
}
}
base.WndProc (ref m);
}
internal class NumberTextBoxDesigner:ControlDesigner
{
protected override void PostFilterProperties(System.Collections.IDictionary properties)
{
properties.Remove("Text");
}
}
}
原文地址“http://www.cnblogs.com/jinliangliu/archive/2007/03/15/340496.html
1﹑使用Try...Catch




































3﹑判斷輸入的keyCode












真是明眼人﹐第一種方法確實是只檢測0~9的整數的﹗
第二種方法﹐說實在的﹐你是第一個幫我指出來的。謝謝﹗
return (IsRegEx(@"^/-?/(?([0-9]{0,3}(/,?[0-9]{3})*(/.?[0-9]*))/)?$", itemValue));
第三種方法﹐我是在KeyPress中調用﹐如果粘貼過來的是無法保存的(因為我是有綁定數據﹐綁定的類型是數值型)。而且是無法輸入漢字的﹐你可以試試。
當然﹐要禁止粘貼的話﹐我是有寫一個新Textbox控件的﹐一并將源碼貼出來﹕
///
/// 只有輸入數字的TextBox控件﹐如果去掉ProcessKeyEventArgs方法﹐而可實現只粘貼數字。
///
[Designer(typeof(NumberTextBox.NumberTextBoxDesigner))]
public class NumberTextBox:System.Windows.Forms.TextBox
{
public const int WM_PASTE = 0x0302;//粘貼消息
public const int WM_CHAR = 0x0102;//輸入字符消息(鍵盤輸入的)
[DllImport("user32.dll")]
public static extern bool MessageBeep(uint UType);
protected override bool ProcessKeyEventArgs(ref Message m)
{
int nKey = m.WParam.ToInt32();
if ((nKey >= (char)48 && nKey<=(char)57) ||
nKey ==(char)8 || nKey ==(char)45 || nKey ==(char)46)
{
return base.ProcessKeyPreview(ref m);
}
else
{
if (m.Msg==256 && nKey ==46)
return base.ProcessKeyPreview(ref m);
if (m.Msg ==258)
{
MessageBeep(0);
}
}
return true;
}
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_CHAR)//取m.WParam 進行判斷m.WParam 就是用戶輸入的字元的 int 表示方式,如果是被限制的字元直接 Return不走base.WndProc(ref m);
{
int keyChar = m.WParam.ToInt32();
bool charOk=(keyChar>47 && keyChar<58) || //數字
keyChar==8 || //退格
keyChar==3 || keyChar==22 || keyChar==24;//拷貝﹑粘貼﹑刪除
if(!charOk)return;
}
if(m.Msg == WM_PASTE)//判斷剪貼板的資料是否是符合要求如果符合不做任何處理否則 Return不走base.WndProc(ref m)
{
IDataObject iData = Clipboard.GetDataObject();//取剪貼板物件
if(iData.GetDataPresent(DataFormats.Text)) //判斷是否是Text
{
string str;
str = (String)iData.GetData(DataFormats.Text); //取資料
/*如果需要正負號,先要判斷TextBox 上游標的位置,如果游標在最前面可以用這個,^(((/+|-)/d)?/d*)$ */
if (!System.Text.RegularExpressions.Regex.IsMatch(str,@"^(/d{1,})$")) return;//如果是數位(可以粘貼跳出)
}
}
base.WndProc (ref m);
}
internal class NumberTextBoxDesigner:ControlDesigner
{
protected override void PostFilterProperties(System.Collections.IDictionary properties)
{
properties.Remove("Text");
}
}
}
原文地址“http://www.cnblogs.com/jinliangliu/archive/2007/03/15/340496.html