2014-01-29 32 views
3

我有WPF c#TextBox,必須限制爲最多20個英文字符,10個簡體中文字符或其他類似的字符集。我將MaxLength屬性設置爲20個字符,並且在使用英文鍵盤時工作正常,但如果我選擇了中文鍵盤,則可以輸入20個簡體字符。我們的數據庫字段限制爲20個字節。 謝謝你的幫助。TextBox限制爲20個字符英文,10個簡體中文字符

+2

您是否嘗試過動態設置MaxLength屬性? – dferraro

+1

漢字是2字節 – Jesse

+0

@Jesse,我以爲c#全是unicode,所以所有的字符都是2個字節。 – gunr2171

回答

4

MaxLength計算字符數,而不是表示它們所需的字節數。實際上,字符串的字節表示取決於使用的字符編碼。 .NET本身使用UTF-16,其中所有字符(英文和中文)佔用2個字節。我假設你的數據庫使用UTF-8,其中英文字符佔1個字節,中文字符佔2個字節。

您需要動態強制執行限制。您可以通過執行ValidationRule這樣做,例如下面的。請閱讀Data validation in WPF,以獲得如何與您的TextBox一起使用的說明。

public class Byte20ValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     int byteCount = Encoding.UTF8.GetByteCount(value.ToString()); 
     if (byteCount <= 20) 
      return new ValidationResult(true, null); 

     return new ValidationResult(false, "Too many bytes."); 
    } 
} 
+0

感謝您的輸入。真的很有幫助。 –

+1

「.NET本身使用UTF-16,其中所有字符(英文和中文)佔用2個字節。」這不是完全準確的。所有「正常」字符將佔用2個字節,但我相信字符上仍然有奇怪的註釋,甚至可能導致UTF-16必須使用多於2個字節的單個字符。 –

+0

@TimothyShields:你說得對,但OP的文本很可能適用於基本多語言平面(BMP)。這架飛機外的人物將使用代理對來表示。 – Douglas

相關問題