模拟 Enter Key Press 从 Button 的 Click 事件发送?

Simulating Enter Key Press sending from a Button on it's Click Event?

你好,我有一个问题,不太知道如何解决,我对 C# 编程和一般的面向对象编程还很陌生,对过程编程的了解真的很有限,因为我主要是Dynamics NAV Developer,这个解决方案也应该是一个插件。 所以我有一个面板作为用户控件,这个用户控件填充了一些文本框和按钮,这些按钮被安排代表一个小键盘,并且也像相应的小键盘键一样命名。
所以现在在以下场景中对我的实际问题说几句话: 我正在输入一个文本框,使用 Numpad 按钮或键盘输入内容,然后我想按键盘上的 Tab/Enter 键或使用 Button Enter 进入下一个字段,如果我按下实际的键盘键,例如“输入”或“制表符”我使用以下代码获得下一个文本框的焦点:

        private void PerformEnter(object sender, KeyEventArgs e)
    {
        try
        {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
            {
                this.SelectNextControl((Control)sender, true, true, true, true);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "An error has occurred", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

在我现有文本框的所有 KeyUp 事件处理程序中执行。但是如果我现在按 Enter 这个解决方案不会这样做,因为我正在使用的 Form/Panel 中的下一个控件不是它应该去的下一个文本框,因为我从我的文本框跳了然后失去了焦点到 Numpad Button Enter 然后获得焦点,但是我如何设法跳转到下一个 TabIndex 比我最近的文本框更大的文本框?我的文本框有以下 TabIndex:

txtInputField1.TabIndex = 1;
txtInputField2.TabIndex = 2;
txtInputField3.TabIndex = 3;
txtInputField4.TabIndex = 4;

我还有一个名为 _recentTextBox 的字段来跟踪有效的 recentTextBox。

private TextBox _recentTextBox;

然后在每个文本框中设置离开事件处理程序。

    private void txtInputField1_Leave(object sender, EventArgs e)
    {
        _recentTextBox = (TextBox)sender;
    }

因此,当我输入例如 txtInputField1 单击 NumPad 按钮上的 Enter 时,我该如何实现这一点,然后选择的下一个控件需要是 txtInputField2 而不是在我的情况下下一个 TabIndex 大于 TabIndex 的控件我的输入按钮? 提前致谢,如有任何帮助,我们将不胜感激。
如果有任何帮助,还有我的 UserControl 的布局。

您可以将您的输入框收集到 Dictionary<int, TextBox> 映射的 TabIndex 中,并为当前 select 编辑的输入字段设置一个单独的字段。

private Dictionary<int, TextBox> inputFieldsTabOrder = new Dictionary<int, TextBox>();

private TextBox selectedInputField;

public YourForm()
{
    InitializeComponent();

    // Set the first TextBox as the initially selected input field and focus it.
    this.selectedInputField = this.txtInputField1;
    this.selectedInputField.Focus();

    // Collect the other TextBox input fields mapped by TabIndex to your Dictionary.
    this.inputFieldsTabOrder.Add(this.txtInputField1.TabIndex, this.txtInputField1);    
    this.inputFieldsTabOrder.Add(this.txtInputField2.TabIndex, this.txtInputField2);
    this.inputFieldsTabOrder.Add(this.txtInputField3.TabIndex, this.txtInputField3);
    this.inputFieldsTabOrder.Add(this.txtInputField4.TabIndex, this.txtInputField4);   
}

在输入字段的 Enter 事件中,只需将 selectedInputField 值设置为 sender 值,该值应该是刚刚获得焦点的 TextBox

private void InputField_OnEnter(object sender, EventArgs e)
{
    this.selectedInputField = (TextBox)sender;
}

在输入字段的 KeyUp 事件和 Enter 按钮的 Click 事件中,调用相同的 FocusNextInputField 方法,该方法应该调用下一个 TextBox 在行中。

private void InputField_OnKeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
    {
        this.FocusNextInputField();
    }
}

private void ButtonEnter_OnClick(object sender, EventArgs e)
{
    this.FocusNextInputField();
}

FocusNextInputField方法的定义应该如下。

private void FocusNextInputField()
{
    int nextInputFieldIndex = this.selectedInputField.TabIndex % inputFieldsTabOrder.Count + 1;
    this.selectedInputField = this.inputFieldsTabOrder[nextInputFieldIndex];
    this.selectedInputField.Focus();
}

这里发生的是当前 selected 输入字段索引增加了一个,允许我们 select 行中的下一个输入字段。计算中使用模数,以便再次从最后一个输入字段切换到第一个输入字段。