С# WinForms: как написать определенную букву в ячейку datagridview, если нажата определенная клавиша?

Я (я довольно новичок в С#) столкнулся с проблемой, которую пытался решить сам, но не смог найти решение.

дано: у меня есть Datagridview с 10 столбцами и x строками. (Заголовки столбцов достигают от 1 до 10)

Моя проблема: мне нужно только написать 1, 0 или = в ячейки, но для большей скорости заполнения при использовании цифровой клавиатуры я хотел бы автоматически писать = в текущую выбранную ячейку, когда я нажимаю 2 на цифровой клавиатуре.

Мое текущее решение (которое не работает):

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
   if(e.KeyChar == '2'||e.KeyChar.ToString() == "2")
   {
      dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex].Value = "=";
   }
}

Я пробовал это с помощью cellLeave и cellstatchanged, но это не работает.


person HCCFMT    schedule 24.07.2015    source источник
comment
Что не работает? Нажатие клавиши не фиксируется? Вы не можете получить правильную ячейку? Значение не вводится в ячейку. Кроме того, класс DataGridView имеет свойство CurrentCell.   -  person User92    schedule 24.07.2015


Ответы (3)


Вы не ответили на мой комментарий, но я предполагаю, что это не работает, потому что событие не фиксируется. Когда представление сетки данных находится в режиме редактирования, элемент управления редактированием ячеек получает ключевое событие, а не представление сетки данных.

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

E.g

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        var ctrl = e.Control as TextBox;
        if (ctrl == null) return;

        ctrl.KeyPress += Ctrl_KeyPress;
    }

    private void Ctrl_KeyPress(object sender, KeyPressEventArgs e)
    {
        // Check input and insert values here...
    }
person User92    schedule 24.07.2015
comment
Замените //Check input ... на if (e.KeyChar == '2') e.KeyChar = '='; и вы станете золотым. - person OhBeWise; 24.07.2015

Вы можете попробовать этот метод, используя DataGridView.KeyDown событие:

private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.NumPad2) {
        this.CurrentCell.Value = "=";
    }
}
person Ilshidur    schedule 24.07.2015

См. приведенный ниже код:

if (e.KeyChar == (char)Keys.NumPad2 || e.KeyChar == (char)Keys.Oem2)
{
     dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[dataGridView1.CurrentCell.ColumnIndex].Value = "=";
}

Надеюсь, это сработает для вас.

person Nirav Lalan    schedule 24.07.2015