Member 12365816 Ответов: 1

Как изменить вступления ключа в элементе управления datagridview


Moves the focus to the next cell in the current row. If the focus is in the last cell of the row, moves the focus to the first cell in the next row. If the focus is in the last cell in the control, moves the focus to the next control in the tab order of the parent container.
If the current cell is in edit mode and pressing TAB causes focus to move away from the current row, any changes that were made to the row are committed before focus is changed.
but i want to make these all tab functions on Enter Key
Can any one help me...


Что я уже пробовал:

я использую этот код
private void Earnings_KeyDown(отправитель объекта, KeyEventArgs e)
{
если(электронная.Данные KeyCode==Ключи.Побег)
{
этот.Закрывать();
}
остальное, если(электронная.Данные KeyCode==Ключи.Входить)
{
Посылайте ключи.Отправить ("{TAB}");
е.Обработано = истина;
e. Suppressskeypress = true;
}
остальное, если(электронная.Данные KeyCode==Ключи.Входить)
{
Посылайте ключи.Send ("{home}"); / / перейти к первому столбцу
resetRow = истина;
}
}
частная dataGridView1_CellEndEdit недействительным(объект отправителя, DataGridViewCellEventArgs е)
{
если (dataGridView1.Свойств - 1 == е.Значение columnindex) //если последний столбец
{
KeyEventArgs forKeyDown = новый KeyEventArgs(ключи.Входить);
resetRow = ложь;
Earnings_KeyDown(dataGridView1, forKeyDown);
}
ещё
{
Посылайте ключи.Имитация}");
Посылайте ключи.Отправить ("{справа}");
}
}

1 Ответов

Рейтинг:
2

0x01AA

Решить этот запрос, используя только "стандартные события", практически невозможно. Особенно обработка ввода, когда сетка находится в режиме редактирования, я не вижу, как это решить.

Поэтому я предлагаю решить запрос, введя свою собственную сетку, производную от DataGridView На первый взгляд это может показаться трудным, но, пожалуйста, не бойтесь, это проще, чем вы думаете.

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

Чтобы сделать это проще в самом начале, я рекомендую сначала добавить этот пользовательский элемент управления в небольшой тестовый проект, чтобы протестировать и адаптировать его под ваши требования. После того как вы будете довольны элементом управления, вы можете позже переместить его в отдельную сборку и использовать в любом своем проекте.

Большую часть информации для специальной обработки ввода я нашел здесь: https://msdn.microsoft.com/query/dev11.запрос?идентификатор AppID=Dev11IDEF1&амп;дл=де-де&амп;К=К(Системы.Окна.Формы.Практическое руководство.ProcessDialogKey);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true[^]

public class DataGridViewX : DataGridView
{
    // A public property which controls the behaviour. You can set this
    // programatically or you will find it also in the VS property view.
    //      true    : Default behaviour, like DataGridView
    //      false   : Special ENTER key handling
    public bool DefaultEnterKeyBehavior { get; set; }

    public DataGridViewX()
    {
        DefaultEnterKeyBehavior = true;
        //InitializeComponent();
    }


    //
    // https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=DE-DE&k=k(System.Windows.Forms.DataGridView.ProcessDialogKey);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true
    //
    [System.Security.Permissions.UIPermission(
        System.Security.Permissions.SecurityAction.LinkDemand,
        Window = System.Security.Permissions.UIPermissionWindow.AllWindows)]
    protected override bool ProcessDialogKey(Keys keyData)
    {
        // This method will handle ENTER while grid is InEdit

        // Extract the key code from the key value. 
        Keys key = (keyData & Keys.KeyCode);

        // Default behaviour are any other key than ENTER
        if (DefaultEnterKeyBehavior || (key != Keys.Enter))
        {
            return base.ProcessDialogKey(keyData);
        }

        // Special handling for ENTER key
        return false;
    }

    //
    // https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=DE-DE&k=k(System.Windows.Forms.DataGridView.ProcessDialogKey);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true
    //
    [System.Security.Permissions.SecurityPermission(
        System.Security.Permissions.SecurityAction.LinkDemand, Flags =
        System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)]
    protected override bool ProcessDataGridViewKey(KeyEventArgs e)
    {
        // Default behaviour are any other key than ENTER 
        if (DefaultEnterKeyBehavior || (e.KeyCode != Keys.Enter))
        {
            return base.ProcessDataGridViewKey(e);
        }
        else
        {
            // Special ENTER key handling
            if (this.CurrentCell.ColumnIndex < (this.ColumnCount - 1))
            {
                // Next Column
                this.ProcessRightKey(e.KeyData);
            }
            else if (this.CurrentCell.RowIndex < (this.RowCount - 1))
            {
                // Next Row, Column 0
                this.ProcessHomeKey(e.KeyData);
                this.ProcessDownKey(e.KeyData);
            }
            else
            {
                // Simulate Tab, not nice... but did not find a better solution until now for this 
                SendKeys.Send("{TAB}");
            }
            // Either way we handled the ENTER key
            return true;
        }
    }
}

Замечание к множителю return в методе:
Обычно я избегаю иметь умножение return операторы в методе. Но в этом случае-почему бы и нет-для меня код легче читать с их помощью...

Заключительное замечание:
- При использовании новой сетки не забудьте установить свойство DefaultEnterKeyBehavior к ложному, либо в конструкторе, либо в коде.
- Для получения справочной информации о создании пользовательских элементов управления для .В сети вы найдете множество учебных пособий от google.
- Попробуйте найти лучшее имя, чем DataGridViewX :)
Надеюсь, это поможет.


Member 12365816

мне нравится ваше предложение,и я использую его по вашей рекомендации .

Member 12365816

я также использую другое событие, такое как конкретный отпуск ячейки,выбранное значение изменено клавишей вниз,кроме клавиши Enter, событие datagridview design and painting и многое другое...

0x01AA

Я вижу, извини, что сосредоточился только на том, чтобы войти.
Таким образом, для i. e. EndEdit вы можете переопределить protected virtual void OnCellEndEdit(DataGridViewCellEventArgs e); из DataGridView.