我正在使用文本框keypress
事件来处理所选输入。基本上textbox
允许用户输入可以计算的值。
即。您可以输入(5*5)- (10/5)
。
当前方法检查如Convert.ToChar("*")==e.KeyChar
等...
目前它不允许用户复制粘贴值。
是否有可以检测到ctrl+v
keypress
事件的 static IEnumerable<char> ValidFiancialCharacters
{
get
{
if(_validFiancialCharacters==null)
{
_validFiancialCharacters = new List<char>();
_validFiancialCharacters.Add(Convert.ToChar("0"));
_validFiancialCharacters.Add(Convert.ToChar("1"));
_validFiancialCharacters.Add(Convert.ToChar("2"));
// till 9 and
_validFiancialCharacters.Add(Convert.ToChar("+"));
_validFiancialCharacters.Add(Convert.ToChar("-"));
_validFiancialCharacters.Add(Convert.ToChar("/"));
//and some other
}
return _validFiancialCharacters;
}
}
public static bool ValidateInput(KeyPressEventArgs e)
{
if (ValidFiancialCharacters.Any(chr => chr == e.KeyChar))
{
e.Handled = false;
}
else
{
e.Handled = true;
}
return e.Handled;
}
?
更新
我现在在做什么
private void txtRate_KeyPress(object sender, KeyPressEventArgs e)
{
NumberExtension.ValidateInput(e);
}
并在按键
{{1}}
答案 0 :(得分:4)
如果你需要同时处理两者,可以使用类似的方法来完成
看看Key Codes。您可以检测按键的按键
所以..
创建一个包含所需输入的列表
public List<int> KeyCodes = new List<int>() { 8, 17, 37, 39.....etc};
并使用KeyDown
事件并使用KeyEventArgs.SuppressKeyPress属性
private void Txt1_KeyDown(object sender, KeyEventArgs e)
{
if (KeyCodes.Contains(e.KeyValue) || (e.KeyCode==Keys.V && e.Control))
e.SuppressKeyPress = false;
else
e.SuppressKeyPress=true;
}
您可能需要验证leave event
中的复制粘贴值,因为用户可以粘贴任何内容!!!
答案 1 :(得分:3)
只需查看KeyDown
的{{1}}或KeyUp
事件中的修饰符属性
修饰符获取KeyDown或KeyUp事件的修饰符标志。标志指示按下了CTRL,SHIFT和ALT键的组合。
<强>的KeyDown 强>
Keys.Control
或 KeyUp
this.myTextBox.KeyDown += new KeyEventHandler(myTextBox_KeyDown);
private void myTextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
MessageBox.Show("Hello world");
}
}
要仅允许某些输入,您可以使用 this.myTextBox.KeyUp += new KeyEventHandler(myTextBox_KeyUp);
private void myTextBox_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
MessageBox.Show("Hello world");
}
}
事件。
KeyPress
答案 2 :(得分:2)
KeyPress
事件无法捕获&#34; Ctrl + V&#34;由于某些原因。使用KeyDown
事件:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
//Ctrl + V
}
}
或
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.Control | Keys.V))
{
//Ctrl + V
}
}
答案 3 :(得分:1)
可以通过KeyPressEvent捕获Ctrl + V序列。
您只是无法通过以下方式进行检查:
(Keys)e.KeyChar == Keys.V && Control.ModifierKeys == Keys.Control <br>
您必须使用:
(int)e.KeyChar==22 && Control.ModifierKeys == Keys.Control <br>
因为键盘会生成ASCII = 22(同步空闲)。
下面的示例使TextBox可以使用逗号分隔符接受+-数量,并允许通过Ctrl + V
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (!( char.IsNumber(e.KeyChar) ||
((Keys)e.KeyChar == Keys.Back) ||
(e.KeyChar == ',') ||
(e.KeyChar == '-') ||
((int)e.KeyChar==22 && Control.ModifierKeys == Keys.Control)
))
{
e.Handled = true;
}
if (e.KeyChar == ',' && base.Text.IndexOf(',') > 0)
{
e.Handled = true;
}
base.OnKeyPress(e);
}
答案 4 :(得分:0)
您应该使用KeyDown或KeyUp,因为KeyLress事件不是由CTRL按钮引发的,而是由“character”按钮引发的。如果您使用KeyDown事件,则可以通过检查:
来检测ctrl+v
if (e.Control && e.KeyCode == Keys.V)
{
...
}