【问题标题】:ProcessCmdKey does not pass Enter KeyProcessCmdKey 不通过 Enter Key
【发布时间】:2017-08-08 13:56:54
【问题描述】:

发生了一些事情,导致我的代码总是捕获 Enter 键但从未处理它。意思是所有我的数据输入框、网格控件等都坏了。这就像 Enter 键已被关闭。

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

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

所以,我只是检查了它在哪个标签上,如果不是正确的标签,就忽略它,简单吗?没有。

无论出于何种原因,无论做什么,我的表单都不会处理回车键。

我又回到了最基本的代码:

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

据我了解,上述内容应该什么都不做,只需将按下的键传回去,然后处理它。

这适用于除了 enter 键之外的所有内容。如果我有一个文本框或任何控件,那么它将接受所有输入,但它只是完全忽略了 enter 键。我也试过return false;,但还是不行。

我什至尝试过完全删除例程,但它仍然坏了。重新启动VS以防万一。

编辑: 好的,这是我开始“修复”之前的完整原始代码。这可以正常工作,除了它会阻止 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);
    }

我什至可以注释掉 整个 例程,它仍然可以这样做。

【问题讨论】:

  • 你的第一行有一个return
  • 第一行代码返回,下面所有代码都无法访问。
  • 是的……我知道。忽略它的其余部分。它仍然锁定了我的返回键。

标签: c# winforms controls keystroke


【解决方案1】:

我不确定您需要什么。您尚未定义回车键的“处理”含义。我的最佳猜测:

1- 您希望输入键在您的文本框中换行吗?将 AcceptsReturn 属性从 False 更改为 True,您的文本框应该允许您使用 enter 键创建一个新行。

2 - 使用回车键切换到下一个控件?将 keyDown 事件添加到文本框并执行以下操作:

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

【讨论】:

  • 对不起...不,我真的只是想让 Enter 键恢复工作。当用户按下“输入”时,它会忽略它。它正在捕获它,但永远不会返回它。如果我设置断点,它会触发。所有其他键都被传回,这意味着 Tab 键有效,箭头键有效,他们键入的任何内容都有效。但是当他们按下回车键时,它会被捕获,然后因为没有更好的术语而被“扔掉”。就像我正在使用 return true;但我不是。
  • @JoeRuder 好的。如果您可以发布更多代码,我会看看我是否可以提供更多帮助。
  • 我上传了完整的套路,我很茫然。我将尝试看看是否还有其他东西可以捕获密钥,但是当程序处于调试模式时,它不会显示类似的东西...
  • 所以基本上你希望这个函数根据不同的条件来处理 enter 键,但是这样做只允许 enter 键用于概述的场景而没有别的?如果你在这个例程的顶部放置一个断点并单步执行到最后,它会到达“return base.ProcessCmdKey”吗?
  • 是的。是的。它正确地到达最后一个命令。如果我把最后一个命令放在首位(意味着例程应该退出),它仍然会阻止 Enter 键执行任何操作。
【解决方案2】:

在您发现 Enter 键的真正问题之前,请考虑这样做:

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

它的作用相当明显,但它现在应该可以解决您的问题。这有帮助吗?

【讨论】:

  • 好主意...让我试试,我正在等待远程重启完成。我尝试使用 sendKey 进行类似的操作,但没有效果。我从来没有见过像这样的东西。
  • @JoeRuder 是的,看起来真的很奇怪.. 不知道在没有看到代码的情况下我还能帮助你什么。您 100% 确定没有意外覆盖该功能?您能否准确指出在您的项目中第一次发生这种情况的时间?发生了哪些变化?
  • 不是真的...直到客户刚才打电话给我才惊慌失措,因为他们无法输入数据。我正在让其中一个数据输入屏幕使用 enter 键而不是 tab 键,并且 that 运行良好。它只是打破了所有其他屏幕。它使用 Telerik Tabbed 控件(意思是选项卡之类的文件夹,而不是 TAB 键)。为了以防万一,我将发布整个程序,以防万一。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多