ProcessCmdKey不通过Enter键

问题描述 投票:-1回答:2

发生了某种事情,导致我的代码总是捕获了Enter键,但从未对其进行处理。含义all我的数据输入框,网格控件等已损坏。就像Enter键已关闭。

我已经尝试完全删除ProcessCmdKey例程,并且仍在执行此操作。

我有一段相当长的代码来处理选项卡式表单上的enter键,但是它弄乱了其他选项卡,这意味着每当按下[[enter时,它就会捕获它。

所以,我只是检查一下它所在的标签,如果标签不正确,就忽略它,简单吗?号

出于任何原因,无论

做什么我做的表单都不会处理回车键。

我回到最基本的代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { return base.ProcessCmdKey(ref msg, keyData); }

根据我的理解,以上内容实际上不应该执行任何操作,只需将按下的键传递回去然后对其进行处理。

而且这对除

enter

键之外的所有内容都有效。如果我有一个文本框或任何控件,则它将接受所有输入,但是它将完全忽略enter键。我也尝试过return false;,但这不起作用。我什至完全尝试过

removing例程,并且still坏了。重新启动VS,以防万一。

编辑:好的,这是我开始“修复”问题之前的完整原始代码。这可以正常工作,只不过它使Enter键无法在程序中的

anywhere

上运行。您可以想象的是,最终用户对此并不十分满意。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); }
我什至可以注释掉

entire

例程,它仍然会执行。
c# winforms controls keystroke
2个回答
0
投票
我不确定您需要什么。您尚未定义回车键意味着什么“处理”。我最好的猜测:

1-您是否希望Enter键在文本框中执行换行?将AcceptsReturn属性从False更改为True,并且您的文本框应允许您使用Enter键创建新行。

2-使用Enter键跳到下一个控件?将keyDown事件添加到文本框中,然后执行以下操作:

switch (e.KeyCode) { case Keys.Enter: SendKeys.Send("{TAB}"); break; }


0
投票
除非您使用Enter键发现真正的问题,请考虑这样做:

private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Return) e.IsInputKey = true; }

关于它的作用很明显,但是它现在应该可以解决您的情况。有帮助吗?
© www.soinside.com 2019 - 2024. All rights reserved.