Использование + (плюс) и - (минус) клавиш клавиатуры в качестве инкрементов и декрементов в DataGridView - PullRequest
5 голосов
/ 25 августа 2010

В приложении WinForms, которое я пишу на C #, у меня есть DataGridViewTextBoxColumn с ячейками, содержащими целочисленные значения, которые я бы хотел, чтобы пользователи могли увеличивать или уменьшать с помощью клавиш + и - на своих клавиатурах.

Я обработал событие KeyDown, так как оно обычно используется для обработки клавиш удаления и т. Д., Но оно не работает для клавиш «плюс» и «минус», так как нажатие на них приводит к переходу ячейки в режим редактирования, и В результате событие KeyDown никогда не запускается для этих ключей. То же самое для события KeyPress

На самом деле, это срабатывает, если я устанавливаю ячейки только для чтения, но я не доволен этим решением, так как оно заставит меня установить для свойства значение true в false в нескольких областях моего кода и может быстро стать грязным.

Каким будет наилучший способ добиться этого?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 23 ноября 2011

Вы пробовали с этим:

вместо использования этого: Keys.OemMinus используйте это: Keys.Subtract

и вместо этого: Keys.Oemplus используйте это: Keys.Add

2 голосов
/ 25 августа 2010

Ух ты, эта статья в КБ довольно плохая.Это должно быть сделано путем переопределения IsInputKey ().

Меня не волнует DGV, это ошибка для настройки.Но вы, вероятно, можете сделать это в какой-то форме:

using System;
using System.Windows.Forms;

class MyDgv : DataGridView {
    public event EventHandler Increment;
    public event EventHandler Decrement;

    protected override void OnKeyDown(KeyEventArgs e) {
        bool used = false;
        if (this.EditingControl == null) {
            if (e.KeyData == Keys.Oemplus) {
                if (Increment != null) { Increment(this, EventArgs.Empty); used = true; }
            }
            else if (e.KeyData == Keys.OemMinus) {
                if (Decrement != null) { Decrement(this, EventArgs.Empty); used = true; }
            }
        }
        if (used) e.SuppressKeyPress = e.Handled = true;
        else base.OnKeyDown(e);
    }
}
2 голосов
/ 25 августа 2010

Вам нужно перехватить нажатие клавиши, прежде чем они попадут в сетку данных.

Это выглядит удивительно близко к тому, что вы пытаетесь сделать: http://support.microsoft.com/kb/320584

...