簡體   English   中英

在 C# 中對 TextBox 實施輸入限制的最佳方法是什么?

[英]What is the best way to implement input restrictions on a TextBox in C#?

TextBox控件(或 .NET 3.5 標准的其他任何東西)的輸入限制為浮點數的最優雅的方法是什么?

目前,我正在通過從TextBox繼承並覆蓋OnKeyPress來完成所有繁重的工作。 但是,我不禁想知道我是否在重新發明輪子。

如果您沿着建議的路線走 go,請不要忘記以下問題/極端情況:

  • 用戶可以使用Ctrl - VShift - Insert將“無效”值粘貼到其中(第二個有點難以捕捉)......但用戶可能應該被允許將合法值粘貼到控件中
  • 用戶可以右鍵單擊,使用默認上下文菜單粘貼無效值
  • 即使您嘗試通過為文本框提供自己的上下文菜單來解決上一個問題,用戶也可以在您的控件之外右鍵單擊,按住右鍵,拖動您的文本框並讓 go 訪問默認的上下文菜單(並粘貼無效值)
  • 無論您做什么鍵處理都不應該禁用諸如Alt - F4等鍵組合(是的,如果您為所有不是有效數字的內容設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM