Шаг изменения шага в элементе управления WinForm NumericUpDown в зависимости от того, Shift / Ctrl / и т. Д.нажаты - PullRequest
0 голосов
/ 05 августа 2011

То, что я хочу, похоже на то, что происходит в конструкторе WinForm в Visual Studio, скажем, VS2010.Если я помещу кнопку, выберу ее и использую клавиши со стрелками, она переместится на 5 пикселей в любом направлении, которое я выбрал, нажав правую клавишу.Теперь, если я держу модификатор Shift или Ctrl, когда я делаю это (забыл, какой из них, извините), то кнопка будет перемещаться только на 1 пиксель за раз.

Я хочу, чтобы это произошло с моимЭлемент управления NumericUpDown в приложении C # WinForm.Скажем, приращение по умолчанию равно 100.0, а меньшее приращение - 10.0.Еще меньшее приращение (если возможно) может быть 1,0.Любые советы о том, как я могу это сделать?

Надеюсь, мне не нужно задавать это как отдельный вопрос: я также увлекаюсь идеей о том, чтобы приращение зависело от введенного текущего значения.Скажем, я могу ввести сумму в долларах от 1 до 100 миллиардов.Затем я хочу, чтобы значения по умолчанию, маленькие и меньшие значения приращения зависели от введенного значения.Я могу сам определить точную формулу.

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Извлеките свой собственный класс из NumericUpDown и переопределите методы UpButton () и DownButton ():

using System;
using System.Windows.Forms;

public class MyUpDown : NumericUpDown {
    public override void UpButton() {
        decimal inc = this.Increment;
        if ((Control.ModifierKeys & Keys.Control) == Keys.Control) this.Increment *= 10;
        base.UpButton();
        this.Increment = inc;
    }
    // TODO: DownButton
}

При необходимости настройте другие ключи, чтобы придать им другие эффекты.

2 голосов
/ 05 августа 2011

Это немного грубо, но немного проще, чем другой ответ (хотя и не лучше), и для 2-й части вопроса вам просто нужно заменить 100/10/1 вычислением, основанным на текущем значении.

Установите значение по умолчанию равным 100 (или что-то еще) и в событии keydown NumericUpDown (nUpDown)

private void nUpDown_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.Up)
        nUpDown.Value += 10;

    else if (e.Control && e.KeyCode == Keys.Down)
        nUpDown.Value -= 10;

    else if (e.Shift && e.KeyCode == Keys.Up)
        nUpDown.Value += 1;

    else if (e.Shift && e.KeyCode == Keys.Down)
        nUpDown.Value -= 1;
}
...