0

我有一个带有搜索框的表单和一个带有结果的 datagridview。我需要的是搜索框,以便在我按下字符或数字键时始终获得焦点,然后处理该键。因此,例如,如果我的焦点在数据网格上,并且我按下一个字符,它将转到搜索框。(此外,每当在表单中按下向上或向下箭头时,焦点将转到数据网格,但我对此没有任何问题。)

现在,下面的代码将作为字符的魅力。但是,当我得到数字时,我不能这样做(因为我e.KeyCode.ToString()不会给我数字,而是“d0”或“numpad0”)。

    private void Form_KeyDown(object sender, KeyEventArgs e)
    {
        if (!this.tbxSearch.Focused)
        {
            if ((e.KeyCode >= Keys.A) && (e.KeyCode <= Keys.Z))
            {
                this.tbxSearch.Focus();
                this.tbxSearch.Text = (e.Shift) ? e.KeyCode.ToString() : e.KeyCode.ToString().ToLower();
                this.tbxSearch.SelectionStart = this.tbxSearch.Text.Length;
            }
        }
    }

当然,我可能会以几乎相同的方式进行操作,只需获取“ e.KeyCode.ToString()”中的最后一个字符,但这对我来说似乎不太合适。我的意思是,必须有一种更简单的方法来改变焦点,然后让控件处理按下的键。

我已经尝试在PreviewKeyDown事件中创建它,但它不会被表单触发(即使KeyPreview属性设置为true):

    private void Form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.Up))
            this.dgvResults.Focus();
        else
            this.tbxSearch.Focus();
    }

所以我想知道:我怎样才能改变表单的焦点,让新的控件处理关键?

4

1 回答 1

0

您可以检查密钥是否是这样的数字:

private Keys[] numericKeys =
        {
             Keys.D1,
             Keys.D2,
             Keys.D3,
             Keys.D4,
             Keys.D5,
             Keys.D6,
             Keys.D7,
             Keys.D8,
             Keys.D9,
             Keys.D0,
             Keys.NumPad0,
             Keys.NumPad1,
             Keys.NumPad2,
             Keys.NumPad3,
             Keys.NumPad4,
             Keys.NumPad5,
             Keys.NumPad6,
             Keys.NumPad7,
             Keys.NumPad8,
             Keys.NumPad9
};

...

bool isDigit = numericKeys.Contains(e.KeyCode);

或像这样:

bool isDigit = Char.IsDigit((char)e.KeyCode);

或者:

bool isLetterOrDigit = char.IsDigit((char)e.KeyCode);
于 2013-04-05T14:30:56.740 回答