凯锐

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  96 随笔 :: 39 文章 :: 212 评论 :: 23 引用
在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;
        }
posted on 2006-03-01 16:15 凯锐 阅读(2497) 评论(8)  编辑 收藏 所属分类: C# Programing

评论

#1楼  2006-03-02 17:24 东海风      
第一种方法利用了异常机制,检测结果可靠但效率较低。不过楼主在程序中用了Convert.ToInt32,应该是检查整数的方法,好象与以下两种方法的检测范围不一致。
第二种用正则表达式相对高效,但表达式中对.(Dot)的检测存在问题,会将连接几个小数点检测为合法。
如果利用第三种方法检测,则漏洞就非常多了:1.如果利用中文输入法,完全可以输入汉字或全角字符。2.用粘贴方法可输入任意字符。3.无法处理诸如负数、小数点之类的问题。
  回复  引用  查看    

#2楼 [楼主] 2006-03-02 18:18 精浪      
@东海风
真是明眼人﹐第一種方法確實是只檢測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");
}
}
}

  回复  引用  查看    

#3楼  2006-09-04 13:23 gzj [未注册用户]
用Int.tryParse方法
  回复  引用    

#4楼 [楼主] 2006-09-04 19:15 精浪      
@gzj
这个是2.0才有的方法,在VS.Net2003版中还没有这个方法呢!

  回复  引用  查看    

#5楼  2007-03-15 16:02 堅 [未注册用户]
double dTmp;
if(double.TryParse(Request["ver"].ToString().Trim(),System.Globalization.NumberStyles.Integer,null,out dTmp))
{
// number
}
else
{
// not number
}
  回复  引用    

#6楼  2008-03-27 14:22 wingfay      
谢谢你提供的方法
Int.tryParse 虽然好 如果数字长度过大也是不能检测的
  回复  引用  查看    

#7楼  2008-03-27 14:39 费哥      
判斷輸入的keyCode从没试过,有机会试试看
  回复  引用  查看    

#8楼  2008-09-01 22:47 addongo [未注册用户]
不好意思那請問如果還要區分全形長度是2,半形長度是1,該如何判斷呢?ex:全形數字8長度為2,半形數字8長度為1,謝謝
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: