Правильный способ выбора предыдущей и следующей строки с помощью горячей клавиши через DataGridView - PullRequest
3 голосов
/ 23 февраля 2012

Немного новичок в разработке на .NET 4.0 C # и быстрый вопрос. Я работаю над основным приложением формы Windows, в котором я использую DataGridView для просмотра данных, хранящихся в базе данных Access.

Я хотел бы использовать ALT + N, чтобы выбрать следующую строку вниз, и ALT + P, чтобы выбрать следующую строку вверх (обтекание, если возможно, или, возможно, просто не двигаться вообще, если уже находится вверху списка строк или внизу). 1003 *

Я довольно много разобрался с этим через Интернет, и я просто не вижу, как мне это сделать, и я не вижу опции через свойства элемента управления. : - /

Может ли кто-нибудь предложить решение, которое будет работать в среде разработки .NET 4.0 C #?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2012

В итоге я использовал приведенный ниже код события для кнопок «Далее» и «Предыдущий», используя горячие клавиши «Alt + N» и «Alt + P». Спасибо «Чаку Уилбуру» за его вклад и в это решение.

private void btnNext_Click(object sender, EventArgs e)
        {
            //Get number of records displayed in the data grid view and subtract one to keep in line with index that starts with 0
            int numOfRows = dataGrdViewCases.Rows.Count - 1;

            //Get current row selected
            int index = dataGrdViewCases.SelectedRows[0].Index;

            // Determine if the next record exists or cycle back to the first record in the set
            if (index < numOfRows)
            {
                //Change the selected row to next row down in the data set
                dataGrdViewCases.CurrentCell = dataGrdViewCases[0, index + 1];
            }
            else
            {
                // Select the first record of the data set
                dataGrdViewCases.CurrentCell = dataGrdViewCases[0, 0];
            }
        }

        private void btnPrevious_Click(object sender, EventArgs e)
        {
            //Get number of records displayed in the data grid view and subtract one to keep in line with index that starts with 0
            int numOfRows = dataGrdViewCases.Rows.Count - 1;

            //Get current row selected
            int index = dataGrdViewCases.SelectedRows[0].Index;

            // Determine if the previous record exists or cycle back to the last record in the set
            if (index != 0)
            {
                //Change the selected row to next row down in the data set
                dataGrdViewCases.CurrentCell = dataGrdViewCases[0, index - 1];
            }
            else
            {
                // Select the first record of the data set
                dataGrdViewCases.CurrentCell = dataGrdViewCases[0, numOfRows];
            }
        }

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

Еще раз спасибо за помощь и нашли время, чтобы помочь "Чак Уилбур"!

0 голосов
/ 24 февраля 2016

Чтобы перейти к следующей строке, пока ячейка редактируется, и между ними пользователь хочет перейти к следующим строкам. 1-й столбец. Я изменил приведенный выше ответ Чака Уилбура, чтобы он соответствовал моей потребности, и все заслуги перед Чаком Уилбуром

//Jump To Next & Prior Row
        if (this.CurrentRow != null)
        {
            if ((keyData & Keys.Alt) == Keys.Alt)
            {
                int selIndex = this.CurrentRow.Index;
                int newSelIndex = selIndex + 1;
                if ((keyData & Keys.N) == Keys.N)
                {
                    if (newSelIndex >= Rows.Count) newSelIndex = 0;
                }
                else if ((keyData & Keys.P) == Keys.P)
                {
                    newSelIndex = selIndex - 1;
                    if (newSelIndex < 0) newSelIndex = Rows.Count - 1;
                }
                else return base.ProcessDialogKey(keyData);

                this.SetSelectedRowCore(selIndex, false);
                this.SetSelectedRowCore(newSelIndex, true);
                this.CurrentCell = this[0, newSelIndex];
                this.SetSelectedRowCore(newSelIndex, false);
                return true;
            }
        }
        //
0 голосов
/ 23 февраля 2012

Это может или не может быть то, что вы ищете, но я думаю, что он движется в правильном направлении.По крайней мере, он обрабатывает нужные вам клавиши и перемещает выделение с переносом.Он перемещает выделение строк, а не выделение ячеек, поэтому, если вы хотите, вам придется добавить / изменить небольшой код (и убрать проверку this.SelectedRows.Count == 1)

class RowSelectDataGridView : DataGridView
{
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if ((keyData & Keys.Alt) == Keys.Alt && this.SelectedRows.Count == 1)
        {
            int selIndex = this.SelectedRows[0].Index;
            int newSelIndex = selIndex + 1;
            if ((keyData & Keys.N) == Keys.N)
            {
                if (newSelIndex >= Rows.Count) newSelIndex = 0;
            }
            else if ((keyData & Keys.P) == Keys.P)
            {
                newSelIndex = selIndex - 1;
                if (newSelIndex < 0) newSelIndex = Rows.Count - 1;
            }
            else return base.ProcessDialogKey(keyData);

            this.SetSelectedRowCore(selIndex, false);
            this.SetSelectedRowCore(newSelIndex, true);
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...