[英]What is the best way to implement input restrictions on a TextBox in C#?
將TextBox
控件(或 .NET 3.5 標准的其他任何東西)的輸入限制為浮點數的最優雅的方法是什么?
目前,我正在通過從TextBox
繼承並覆蓋OnKeyPress
來完成所有繁重的工作。 但是,我不禁想知道我是否在重新發明輪子。
如果您沿着建議的路線走 go,請不要忘記以下問題/極端情況:
SuppressKeyPress
,您將打破這一點)"-."
,因為他們開始輸入"-.23"
)而您的文本框不會懲罰他們"-.1e-2"
這樣的數字可以被認為是合法的float
的值道德? 執行您的建議可能非常棘手。
您可能想要執行以下組合:
TextChanged
事件中進行基本驗證(並做一些被動的事情,比如更改文本框背景顏色)Parse
用戶的價值看一下MaskedTextBox控件。 它還繼承自 TextBoxBase 並且可能具有您正在構建的功能。
使用 NumericUpDown 怎么樣?
我認為輪子還沒有被發明出來(至少在 .NET 框架中)。 我敢肯定 CodeProject 或類似的東西有一些東西,做的和你一樣,所以它可能值得谷歌。
不過,繁重的工作應該不會太糟糕。 它比乍一看要多一點。
過於簡化的示例是您可以處理OnKeyPress
,執行Float.TryParse
並附加新字符。如果為真,請保持按鍵; 如果為假,則取消它( e.Handled = true
)。
困難的部分是如果他們刪除、剪切或粘貼選擇。 另一件事是當他們剛剛開始時(您可能希望接受“-”作為部分有效輸入)......
或使用檢查匹配
void TextBox_KeyUp(object sender, KeyEventArgs e)
{
if(..) // your condition
{
e.SuppressKeyPress = false;
}
else
{
e.SuppressKeyPress = true;
}
}
或者
void TextBox_KeyUp(object sender, KeyEventArgs e)
{
e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method
}
我發現了一個 maskedTextBox 的 ValidatingType 屬性:
maskedTextBox1.ValidatingType = typeof(System.Double);
它確實告訴你它是否有效。 不幸的是,它似乎只驗證焦點何時發生變化(即使這樣它實際上也沒有做任何事情); 但也許有一些方法可以使用它。
是否有必要在數據輸入期間進行驗證,或者一旦失去焦點,您是否可以檢查輸入的最終值?
如果是后者,您還可以使用ErrorProvider控件來幫助限制功能,直到輸入被解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.