Фиксация редактирования ячейки DataGridView только при нажатии определенной клавиши - PullRequest
0 голосов
/ 25 ноября 2010

У меня есть DataGridView, подключенный к источнику данных XML. Каждый раз, когда пользователь редактирует ячейку, программа автоматически обновляет соответствующий XML-файл. Для обработки редактирования я использую оба:

private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
       //do edit
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
       //do edit
}

Редактирование работает так, пользователь нажимает на ячейку и меняет значение. Затем он должен нажать клавишу Enter , чтобы все работало нормально, но, например, если он нажимает кнопку мыши снаружи или выходит из ячейки с помощью клавиши со стрелкой влево, программа выходит из строя. Это работает в любом случае, потому что мне удалось обработать это исключение, но я хотел бы, чтобы моя программа справилась с этой ситуацией лучше. Например, когда пользователь входит в ячейку, я хочу отказать ему в переходе в другие ячейки с помощью клавиш со стрелками. Я пытался поймать событие KeyDown, но оно не сработало:

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.Right)) //etc...
        {
            e.Handled = true;
        }
    }

Обычно, когда начинается начало редактирования, я хочу редактировать ячейку ТОЛЬКО, если пользователь нажимает Введите . Есть идеи? Если элемент управления (в данном случае ячейка) теряет фокус во время редактирования (пользователь нажимает Esc , щелкает мышью за пределами элемента управления и т. Д.), Мне нужно предотвратить запуск события EndEdit .

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Вы можете использовать событие RowValidating для отмены события и событие RowValidated для сохранения следующим образом:

    private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
    {
        string data = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        if(!ValidateData(data))
            e.Cancel = true;
    }

    private bool ValidateData(string data)
    {
        // do validation which u want to do.
    }

    private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
    {
        string data = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        SaveData(data);
    }

    private void SaveData(string data)
    {
        // save data
    }
1 голос
/ 25 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...