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
я также использую другое событие, такое как конкретный отпуск ячейки,выбранное значение изменено клавишей вниз,кроме клавиши Enter, событие datagridview design and painting и многое другое...
0x01AA
Я вижу, извини, что сосредоточился только на том, чтобы войти.
Таким образом, для i. e. EndEdit вы можете переопределить protected virtual void OnCellEndEdit(DataGridViewCellEventArgs e);
из DataGridView.