Невозможное задание для пользовательского DGV Установить фокус на следующий элемент управления при нажатии клавиши Enter - PullRequest
0 голосов
/ 06 августа 2011

Это настоящий вызов, который я привожу здесь для вас.Решите это, если можете.

Клавиша ввода на Datagridview Это хорошая идея?Или это возможно для любого тела здесь, чтобы работать в соответствии со следующим условием?.

Если нет, Datagridview Control бесполезен при нажатии клавиши ввода.

У меня есть следующие пользовательские DGV:

public class MyDataGridView : DataGridView
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            Keys key = (keyData & Keys.KeyCode);
            if (key == Keys.Enter)
            {
                Tab(keyData);
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }
        protected override bool ProcessDataGridViewKey(KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Tab(e.KeyData);
                return true;
            }
            return base.ProcessDataGridViewKey(e);
        }
        private void Tab(Keys KeyData)
        {
            Point cca = CurrentCellAddress;
            bool Forward = ((KeyData & Keys.Shift) != Keys.Shift);
            if (Forward)
                if (cca.Y == Rows.Count - 1)            // last row?
                    if (cca.X == Columns.Count - 1)     // last column?
                        ToNextControl(Forward);
                    else
                        ProcessTabKey(KeyData);
                else
                    ProcessTabKey(KeyData);
            else
                if (cca.Y == 0)         // first row?
                    if (cca.X == 0)     // first column?
                        ToNextControl(Forward);
                    else
                        ProcessTabKey(KeyData);
                else
                    ProcessTabKey(KeyData);
        }

        /// <summary>
        /// Go to the next control, forward or backword. This does not support
        /// wrapping from the first to the last or the last to the first.
        /// </summary>
        /// <param name="Forward">Whether to go forward</param>
        private void ToNextControl(bool Forward)
        {
            Control c = Parent.GetNextControl(this, Forward);
            while (c != null && !c.TabStop) // get next control that is a tabstop
                c = Parent.GetNextControl(c, Forward);
            if (c != null)
                c.Select();
        }
    }

То же самое хорошо работает в обычном режиме, оно позволяет фокусироваться на следующем элементе управления при нажатии клавиши ввода, но это не работает, если вы установите AllowUserToAddRows = false в режиме привязки к данным.Точная проблема возникает, когда вы редактируете значение ячейки в последнем столбце и нажимаете клавишу ввода, это не позволяет установить фокус на следующем элементе управления.

Как преодолеть это?как решить проблему?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Я нашел решение, которое должно работать для вас, добавив событие фокуса на текущий элемент управления.Я думаю, что это то, что вы хотите, но не могли понять ваш вопрос.Дайте мне знать, если это что-то другое.Работает на AllowUserToAddRows = false или true.

 private void ToNextControl(bool Forward)
    {
        Control c = Parent.GetNextControl(this, Forward);         
        while (c != null && !c.TabStop) // get next control that is a tabstop
            c = Parent.GetNextControl(c, Forward);
        if (c != null)
        {
            //c.Select(); // Not needed for it to work
            c.Focus(); // force it to focus
        }
    }
0 голосов
/ 08 августа 2011

Проблема, которую я вижу, просто глядя на код без запуска, это:

Пользователь получает последний элемент управления в DataGridView, и для GetNextControl нет элемента управления для возврата.

Возможно, вы захотите добавить некоторую логику для решения этого вопроса. Например, вы можете установить фокус на кнопку «Отправить» или «Далее», если это в форме мастера.

...