none
Установка фокуса на ячейку после редактирования ячейки DataDridView RRS feed

  • Вопрос

  • После редактирования ячейки DataGridView и нажатия Enter, фокус устанавливается на ячейку, которая ниже редактируемой. Где определяется это стандартное поведение и как его переопределить? Как после нажатия Enter установить фокус на соседнюю ячейку справа и чтобы она сразу была  в состоянии редактирования?

    9 апреля 2013 г. 12:22

Ответы

  • Чтобы переопределить данное стандартное поведение необходимо унаследоваться от стандартного DataGridView:

        public class CustomDataGridView : DataGridView {
            protected override bool ProcessDialogKey(Keys keyData) {
                if (keyData == Keys.Enter && this.CurrentCell.IsInEditMode)
                {
                    this.EndEdit(DataGridViewDataErrorContexts.Commit);
                    MoveFromCell(this.CurrentCell);
                    return true;
                }
    
                return base.ProcessDialogKey(keyData);
            }
    
            protected override void OnKeyDown(KeyEventArgs e) {
                if (e.KeyCode == Keys.Enter) {
                    e.SuppressKeyPress = true;
                    MoveFromCell(this.CurrentCell);
                    return;
                }
                base.OnKeyDown(e);
            }
    
            private void MoveFromCell(DataGridViewCell cell) {
                int iRow = cell.RowIndex;
                int iColumn = cell.ColumnIndex;
                if (iColumn == this.Columns.Count - 1) {
                    if (iRow == this.Rows.Count - 1) {
                        // Поведение при достижении последней строки
                        //dataGridView1.Rows.Add(); // Добавить новую
                        //return; // Игнорировать
                        // Нужное раскомментировать
                    }
    
                    this.CurrentCell = this[0, iRow + 1];
                }
                else {
                    this.CurrentCell = this[iColumn + 1, iRow];
                }
                this.BeginEdit(true);
            }
    
        }

    Скомпилируйте проект, после этого у вас в Toolbox появится CustomDataGridView, который вам и нужно будет использовать для вышеописанной функциональности.


    • Изменено Varlamov Oleg 9 апреля 2013 г. 18:29
    • Помечено в качестве ответа lutik 9 апреля 2013 г. 20:22
    9 апреля 2013 г. 18:27

Все ответы

  • Чтобы переопределить данное стандартное поведение необходимо унаследоваться от стандартного DataGridView:

        public class CustomDataGridView : DataGridView {
            protected override bool ProcessDialogKey(Keys keyData) {
                if (keyData == Keys.Enter && this.CurrentCell.IsInEditMode)
                {
                    this.EndEdit(DataGridViewDataErrorContexts.Commit);
                    MoveFromCell(this.CurrentCell);
                    return true;
                }
    
                return base.ProcessDialogKey(keyData);
            }
    
            protected override void OnKeyDown(KeyEventArgs e) {
                if (e.KeyCode == Keys.Enter) {
                    e.SuppressKeyPress = true;
                    MoveFromCell(this.CurrentCell);
                    return;
                }
                base.OnKeyDown(e);
            }
    
            private void MoveFromCell(DataGridViewCell cell) {
                int iRow = cell.RowIndex;
                int iColumn = cell.ColumnIndex;
                if (iColumn == this.Columns.Count - 1) {
                    if (iRow == this.Rows.Count - 1) {
                        // Поведение при достижении последней строки
                        //dataGridView1.Rows.Add(); // Добавить новую
                        //return; // Игнорировать
                        // Нужное раскомментировать
                    }
    
                    this.CurrentCell = this[0, iRow + 1];
                }
                else {
                    this.CurrentCell = this[iColumn + 1, iRow];
                }
                this.BeginEdit(true);
            }
    
        }

    Скомпилируйте проект, после этого у вас в Toolbox появится CustomDataGridView, который вам и нужно будет использовать для вышеописанной функциональности.


    • Изменено Varlamov Oleg 9 апреля 2013 г. 18:29
    • Помечено в качестве ответа lutik 9 апреля 2013 г. 20:22
    9 апреля 2013 г. 18:27
  • Примного благодарен!
    9 апреля 2013 г. 20:21