在我们的应用程序中,有一个usercontrol,它允许输入一个数字(在numericupdown
内),然后是combobox
,允许选择SI-Prefix([p, n, µ, m, -, k, M, G, T]
小大)
现在,为了便于使用,我认为在KeyPress
上捕获numericUpDown
- 事件并相应地设置combobox
会很好。 (如果按下m
,请选择mili (m)
,如果按下G
,请选择Giga (G)
)
使用以下处理程序/选择器完美无缺:
private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsLetter(e.KeyChar))
{
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(e.KeyChar)
{
e.Handled = true;
}
}
}
TrySelect
只做以下事项:
public Boolean TrySelect(Char chr)
{
var entry = this.comboBox_siPrefix.Items.Cast<KeyValuePair<String,Double>>().Where(e => e.Key.Contains("(" + chr + ")")).FirstOrDefault();
if (!entry.Equals(new KeyValuePair<String, Double>()))
{
this.comboBox_siPrefix.SelectedItem = entry;
return true;
}
return false;
}
没关系,但只要在numericupdown
上按下非数字键,用户每次听到“BING”。
我读到了e.SuppressKeyPress
,遗憾的是KeyPressEventArgs
无法使用{ - {}仅适用于KeyEventArgs
。
所以,尝试使用KeyDown
- 事件的整个过程。 (没有“BING”) - 但我无法捕获大写字母,因为每个KeyDown
都会立即触发事件......
private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
KeysConverter kc = new KeysConverter();
if (char.IsLetter(kc.ConvertToString(e.KeyCode)[0]))
{
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(kc.ConvertToString(e.KeyCode)[0]))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
}
任何想法?
答案 0 :(得分:2)
想出办法:
使用KeyDown
- 事件时,您可以使用e.Modifiers
检查其他键是否同时关闭。
我不知道为什么,但对于KeyDown
- 事件e.KeyValue
以及e.KeyCode
始终返回密钥的CAPITAL版本。
因此,我修改了处理程序以将每个char转换为小写,并且只有在同时按下SHIFT
的情况下才将其转换为大写:
作品 - 没有&#34; BING&#34; (对于有效的SI前缀)。 :-)
private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
KeysConverter kc = new KeysConverter();
char c = char.ToLower(kc.ConvertToString(e.KeyValue)[0]);
if (char.IsLetter(c))
{
//Caps?
if (e.Modifiers == Keys.Shift)
{
c = char.ToUpper(c);
}
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(c))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
}
以上解决方案不适用于µ
(CTRL + ALT + m或ALT GR + m)
更新:这不是100%,但我现在还没有得到它:
更新2:
所以,我不得不排除&#34; m&#34;从beeing匹配char.isLetter()
(如果按下alt
),最后添加另一个检查。
我发现,比较e.KeyValue==77
按预期工作,而比较c=='m'
没有......(然后µ
被插入numericupdown
,它不应该
if (ctrl && alt && c=='m')
:
if (ctrl && alt && e.KeyValue==77)
Dunno为什么 - 想法?
private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
KeysConverter kc = new KeysConverter();
char c = char.ToLower(kc.ConvertToString(e.KeyValue)[0]);
Boolean ctrl = e.Control;
Boolean alt = e.Alt;
Boolean shift = e.Shift;
int keyPadStart = (int)Keys.NumPad0;
int keyPadEnd = (int)Keys.NumPad9;
if (e.KeyValue >= keyPadStart && e.KeyValue <= keyPadEnd)
{
//send to numeric updown.
return;
}
if (char.IsLetter(c) && !alt)
{
if (shift) c = char.ToUpper(c);
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect(c))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
//not working: if (ctrl && alt && c=='m')
if (ctrl && alt && e.KeyValue==77)
{
//Check, if its valid for si prefixes.
if (this.siSelector1.TrySelect('µ'))
{
e.Handled = true;
e.SuppressKeyPress = true;
}
}
}