C#自定义ENTER键行为

时间:2017-08-13 09:27:38

标签: c# button onclick enter ctrl

我有一个小型项目,其中我想要几个按钮在Clicked或Ctrl + Clicked时表现不同。为实现这一点,每个按钮都有这种功能附加到他们的Click()事件:

private void Button1_Click(object sender, EventArgs e)
    {
        int value = 10 //default value
        bool boool = false; 
        if (ModifierKeys == Keys.Control)
        {
            using (var form = new NUP_Popup(0, value, value, "maximum ?")) 
            { //creates a simple window that allows user to change the value of 'value'
                form.ShowDialog();
                if (form.DialogResult == DialogResult.OK)
                {
                    value = form.retVal;
                    boool = true;
                }
                else return;
            }
        }
        //do stuff here, either with default or user value
    }

现在,单击或Ctrl + Clicking按此功能运行。我的问题是,当使用Enter键激活我的按钮时,此行为不适用:单独输入键会触发"正常"行为但Ctrl + Enter不执行任何操作(按钮未激活)。

当按下Escape时,我已经覆盖了ProcessDialogKey()函数来关闭窗口,所以我想我可以使用它来使Enter键按下触发Click()事件函数:

protected override bool ProcessDialogKey(Keys keyData)  //Allows quit when Esc is pressed
    {
        if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }
        if (keyData == Keys.Return)
        {
            this.OnClick(new EventArgs());
        }
        return base.ProcessDialogKey(keyData);
    }

那就是我被困的地方。当然,这并没有做任何事情,但我真的不知道在我的第二个条件中键入什么才能使它发挥作用。

也许我使用了错误的做法?有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:0)

假设您放置了带有ID Label1的Label和带有ID Button1的按钮,以下将执行:

if (e.KeyChar == '\n') Button1_Click(sender, new EventArgs());

到你的解决方案,只需将一个KeyPress事件添加到你的Button1并在keypress事件中应用以下代码Button1_KeyPress:

ServiceModule

答案 1 :(得分:0)

我找到了一个解决方案,可让您点击Enter或Ctrl + Enter:

<!DOCTYPE html>
<html>
<title> Happy number</title>
<head>
<script>
function fun(){

var input = document.myform.t1.value;
do{

var output = [];
var sNumber = input.toString();
var len = sNumber.length;

var sum = 0;

for (var i = 0; i < len; i++) 
{
    output.push(+sNumber.charAt(i));
}


var j;
var ret= [];
var outlen = output.length;
    for (j = 0; j < outlen; j++) 
    {
        ret.push(output[j] * output[j]);
    }
    
var sum = ret.reduce(getSum);
     
input = sum;

}while(input >= 9);

if(input == 1)
{
document.getElementById("para1").innerHTML = (" given number is happynumber");
}
else
{ 
document.getElementById("para1").innerHTML = ("not happy number");
}
}
function getSum(total, num) {
    return total + num;}
</script>
</head>
<body>
<center>
<form name="myform" method="post" onsubmit="fun(); return false;">

<table border="1">

<tr>
<th colspan="2"> Happy Number </th>  
</tr>

<tr>
<th> input number : </th>
<td> <input type="text" name="t1" id="text1" pattern="[0-9]{2,}" title="only numbers allowed" ></td>
</tr>

<tr>
<td colspan="2"> <center><button onclick="fun()">alert</button></center></td>
</tr>

<tr>
<td colspan="2"> <center>  <p id="para1"  style="color:red;"> </p> </center></td>
</tr>

</table>
</form>
</center>
</body>
</html>

答案 2 :(得分:-1)

好的,所以我终于通过将其添加到我的重写ProcessDialogKey()方法中找到了一个有效的解决方案:

if (keyData == (Keys.Enter | Keys.Control))
        {
            (this.ActiveControl as Button).PerformClick();
        }

我不知道它是否符合&#34;清洁&#34;代码,但它具有满足我的2个要求的优点:将Ctrl + Enter函数设置为Ctrl + Click,而不必为每个Button声明2个方法。