C# ProcessCmdKey未传递Enter键
发生了一些事情,导致我的代码总是捕获Enter键,但从未处理它。这意味着我所有的数据输入框、网格控件等都已损坏。这就好像Enter键已关闭 我已尝试完全删除C# ProcessCmdKey未传递Enter键,c#,winforms,controls,keystroke,C#,Winforms,Controls,Keystroke,发生了一些事情,导致我的代码总是捕获Enter键,但从未处理它。这意味着我所有的数据输入框、网格控件等都已损坏。这就好像Enter键已关闭 我已尝试完全删除ProcessCmdKey例程,但它仍在执行 我有一段相当长的代码来处理选项卡式表单上的enter键,但它会弄乱其他选项卡,这意味着无论何时按下enter键,它都会捕获它 所以,我只是查看它在哪个选项卡上,如果不是正确的选项卡,就忽略它,简单吗?没有 无论出于何种原因,无论我做什么,我的表单都不会处理enter键 我回到了最基本的代码: pr
ProcessCmdKey
例程,但它仍在执行
我有一段相当长的代码来处理选项卡式表单上的enter键,但它会弄乱其他选项卡,这意味着无论何时按下enter键,它都会捕获它
所以,我只是查看它在哪个选项卡上,如果不是正确的选项卡,就忽略它,简单吗?没有
无论出于何种原因,无论我做什么,我的表单都不会处理enter键
我回到了最基本的代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
return base.ProcessCmdKey(ref msg, keyData);
}
据我所知,上述操作实际上不应执行任何操作,只需将按键向后传递,然后进行处理
这适用于除enter键以外的所有功能。如果我有一个文本框或任何控件,那么它将接受所有输入,但它只是完全忽略enterkey。我尝试了返回false代码>也是,但这不起作用
我甚至尝试过完全取消这个常规,但它仍然被打破。以防万一
编辑:
好的,这是我开始“修复”之前完整的原始代码。这可以正常工作,但它会阻止Enter键在程序中的任何其他位置工作。正如你所能想象的那样,最终用户并不十分欣赏这一点
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (ActiveControl.Name.ToString() != "order_creation_grid") //ensures that we don't caputre keypresses in the datagrid
{
//if (keyData == (Keys.Tab | Keys.Shift)) //tabbing backwards
//{
// if (ActiveControl.Parent.Name.ToString() == "order_con_name_DD")
// {
// order_con_name_DD.Select();
// order_con_name_DD.ShowDropDown();
// }
//}
if (keyData == Keys.Tab || keyData == Keys.Enter)
{
if (ActiveControl.Parent.Name.ToString() == "order_shipper_dd")
{
var test = keyData;
//getAllConsignees(); remove
get_all_addresses(); //load up the address dd
order_address_dd.SelectedIndex = 0;
order_address_dd.Select();
order_address_dd.Focus();
return true;//lets the system know that the control key was handled and not to fire it again
}
else if (ActiveControl.Parent.Name.ToString() == "order_address_dd")
{
if (order_address_dd.SelectedIndex != -1)//only do this if there is not a new address in the address chooser ie: found one in database
{
order_match_dd.Select();
order_match_dd.Focus();
order_match_dd.ShowDropDown();
return true;
}
else
{
order_address_eb.Value = order_address_dd.Text;
order_consignee_eb.Select();
order_consignee_eb.Focus();
return true; ;
}
}
else if (ActiveControl.Name.ToString() == "order_match_dd")
{
if (order_match_dd.SelectedIndex != -1)//fire off when a valid selection is made
{
//check if it is a new item
if (order_match_dd.Text == "1 New")
{
//blank out the fields and position cursor to Consignee
clear_order_fields();
order_consignee_eb.Select();
order_consignee_eb.Focus();
}
else //parse the value in the match box useing the seperator | into strings and load up the correct fields
{
char[] delimiterChars = { '|' };
string[] fields = order_match_dd.Text.Split(delimiterChars);
clear_order_fields();
order_consignee_eb.Value = fields[0].ToString().Trim(); ;
order_address_eb.Value = fields[1].ToString().Trim();
order_city_eb.Value = fields[2].ToString().Trim();
order_state_eb.Value = fields[3].ToString().Trim();
order_zip_eb.Value = fields[4].ToString().Trim();
//go try and match the driver and facility with this zipcode
get_driver_facility();
order_BOL_eb.Select();
order_BOL_eb.Focus();
}
return true;
}
}
else if (ActiveControl.Parent.Name.ToString() == "order_BOL_eb")
{
int custID = Convert.ToInt16(order_shipper_dd.SelectedValue);
string testFor = order_BOL_eb.Value.ToString();
var lookFor = (from l in dbContext.stop_details
where l.cust_unique_id == testFor && l.customer_id == custID
select l).ToArray();
int count = lookFor.Count();
if (count > 0)
{
MessageBox.Show("WARNING..this BOL has been used before for this customer, make sure you really want to use it again.");
}
order_loose_qty.Focus();
return true;
}
else if (ActiveControl.Parent.Name.ToString() == "order_consignee_eb")
{
order_address_eb.Select();
order_address_eb.Focus();
return true;
}
else if (ActiveControl.Parent.Name.ToString() == "order_address_eb")
{
order_city_eb.Select();
order_city_eb.Focus();
return true;
}
else if (ActiveControl.Parent.Name.ToString() == "order_city_eb")
{
order_state_eb.Select();
order_state_eb.Focus();
return true;
}
else if (ActiveControl.Parent.Name.ToString() == "order_state_eb")
{
order_zip_eb.Select();
order_zip_eb.Focus();
return true;
}
else if (ActiveControl.Parent.Name.ToString() == "order_zip_eb")
{
// get_driver_facility();
order_BOL_eb.Select();
order_BOL_eb.Focus();
return true;
}
else if (ActiveControl.Parent.Name.ToString() == "order_note")
{
//auto send to the grid if checkboxed
if (autoSend_cb.Checked)
{
send_to_orderGrid();
}
//otherwise just sit there...
return true;
}
}
if (keyData == Keys.Enter) //On enter key for these controls fire the tab key so that it will move to the next control
{
if (ActiveControl.Parent.Name.ToString() == "order_loose_weight")
{
SendKeys.Send("{TAB}");
}
else if (ActiveControl.Parent.Name.ToString() == "order_loose_qty")
{
SendKeys.Send("{TAB}");
}
else if (ActiveControl.Parent.Name.ToString() == "order_pallets_qty")
{
SendKeys.Send("{TAB}");
}
else if (ActiveControl.Parent.Name.ToString() == "order_pallets_weight")
{
SendKeys.Send("{TAB}");
}
else if (ActiveControl.Parent.Name.ToString() == "order_hazmat_weight")
{
SendKeys.Send("{TAB}");
}
else if (ActiveControl.Parent.Name.ToString() == "order_COD")
{
SendKeys.Send("{TAB}");
}
}
if (keyData == (Keys.Control | Keys.OemCloseBrackets))
{
this.order_shipper_dd.Select();
this.order_shipper_dd.ShowDropDown();
return true;
}
if (keyData == (Keys.Control | Keys.Enter)) //when ctrl-enter is pressed in the Order Entry screen
{
send_to_orderGrid();
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
我甚至可以注释掉整个程序,但它仍然可以> P>直到发现输入键的真正问题,请考虑以下事项:
private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Return)
e.IsInputKey = true;
}
关于它的作用相当明显,但它现在应该能解决你的问题。那有用吗?我不确定你需要什么。您尚未定义enter键的“流程”含义。我最好的猜测是:
1-是否希望enter键在文本框中执行新行?将AcceptsReturn属性从False更改为True,文本框应允许您使用enter键创建新行
2-使用enter键切换到下一个控件?将keyDown事件添加到文本框,然后执行以下操作:
switch (e.KeyCode)
{
case Keys.Enter:
SendKeys.Send("{TAB}");
break;
}
您的第一行有一个return
!代码在第一行返回,下面的所有代码都无法访问。是的…我知道。忽略它的其余部分。它仍然锁定了我的返回键。好主意…让我试试,我正在等待远程重新启动完成。我用sendKey做了类似的尝试,但没有效果。我从来没有见过这样的事情。@JoeRuder Yeah似乎真的很奇怪。。不知道在没有看到代码的情况下我还能帮你做些什么。你百分之百确定函数没有意外覆盖吗?你能准确地指出这在你的项目中第一次发生的时间吗?在哪一次更改之后?不是真的…直到客户刚才打电话给我,因为他们无法输入数据而惊慌失措。我让其中一个数据输入屏幕使用enter键而不是tab键,这非常有效。它打破了所有其他屏幕。它使用的是telerik标签控件(意思是像标签一样的文件夹,而不是标签键)。为了以防万一,我会把所有的程序都发布在那里。对不起……不,我真的只是想让回车键恢复工作。当用户按下“回车”键时,它会强制忽略它。它正在捕获它,但从未返回。如果我设置了一个断点,它就会触发。所有其他键都会传回,这意味着tab键可以工作,箭头键可以工作,它们键入的任何键都可以工作。但当他们按enter键时,它被捕获,然后由于缺少更好的术语而被“丢弃”。这就像我在使用一个返回真;“但我不是。”约鲁德说得很好。如果你能发布更多的代码,我会看看我是否能提供进一步的帮助。我上传了完整的例程,我真是不知所措。我将尝试看看是否有其他捕获键,但当程序处于调试模式时,它不会显示类似的内容…因此基本上您希望此函数处理基于不同条件的enter键,但这样做只允许enter键用于概述的场景,而不允许其他情况?如果在该例程的顶部放置一个断点并逐步执行到底,它是否达到“return base.ProcessCmdKey”?是。是的。它正确地到达最后一个命令。如果我先执行最后一个命令(意味着例程应该退出),它仍然会阻止Enter键执行任何操作。