![](/img/trans.png)
[英]C#: In the keydown event of a textbox, how do you detect currently pressed modifiers + keys?
[英]How do I detect a NumberDecimalSeparator in a KeyDown event (C#)
我試圖查看用戶是否在文本框中按下了小數點分隔符,並根據其他參數允許或禁止它。
NumberdecimalSeparator 返回 46 或 '.' 在我的美國系統上。 許多其他國家/地區使用“,”作為分隔符。 當我按下句點時,KeyDown 事件將 KeyValue 設置為 190。
我是繼續尋找逗號/句點,還是有更好的方法?
電話
CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator
獲取當前用戶界面文化的小數點分隔符。 您可以使用其他文化來獲取其他語言的分隔符。
編輯
從我的系統中報告的 166 種文化( CultureInfo.GetCultures(CultureTypes.SpecificCultures).Count()
)來看,似乎只使用了兩個分隔符:句點和逗號。 你可以在你的系統中試試這個:
var seps = CultureInfo.GetCultures(CultureTypes.SpecificCultures)
.Select(ci => ci.NumberFormat.NumberDecimalSeparator)
.Distinct()
.ToList();
假設這是真的,此方法可能會有所幫助(請注意, keyCode
與modifiers
標志進行 OR 運算以消除無效組合):
private bool IsDecimalSeparator(Keys keyCode, Keys modifiers)
{
Keys fullKeyCode = keyCode | modifiers;
if (fullKeyCode.Equals(Keys.Decimal)) // value=110
return true;
string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
if (uiSep.Equals("."))
return fullKeyCode.Equals(Keys.OemPeriod); // value=190
else if (uiSep.Equals(","))
return fullKeyCode.Equals(Keys.Oemcomma); // value=188
throw new ApplicationException(string.Format("Unknown separator found {0}", uiSep));
}
最后一點:根據Keys enumeration ,您提到的值 46 對應於 DEL(刪除)鍵(即 Num Lock 關閉時的點)。
這里的問題是KeyEventArgs
中的值是鍵代碼,而不是字符。 如果您改為處理KeyPress
,您將在KeyPressEventArgs
獲得一個字符,您可以將其用於比較。
注意:您應該真正比較NumberDecimalSeparator
字符,因為它是一個字符串,而不是單個字符,因此您需要考慮字符串中有多個字符的情況。
如果您需要知道按下的字符是否是十進制分隔符:
private void Control_KeyPress(object sender, KeyPressEventArgs e)
{
char separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
if (e.KeyCahr == separador)
{
// true
}
else
{
// false
}
}
但是,如果您需要接受十進制數字鍵作為任何文化的十進制分隔符:
private bool decimalSeparator = false;
private void Control_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Decimal)
decimalSeparator = true;
}
private void Control_KeyPress(object sender, KeyPressEventArgs e)
{
if (decimalSeparator)
{
e.KeyChar = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
decimalSeparator = false;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.