■■■

2016年4月2日土曜日

DataGridView上でEnterキーを押下すると隣のセルへ移動する方法

DataGridView上でEnterキーを押下すると隣のセルへ移動する方法
ProcessDialogKey、ProcessDataGridViewKeyを活用する方法
VB.NET
Imports System
Imports System.Windows.Forms

Public Class DataGridViewEx
Inherits DataGridView

<System.Security.Permissions.UIPermission( _
System.Security.Permissions.SecurityAction.Demand, _
Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _
Protected Overrides Function ProcessDialogKey( _
ByVal keyData As Keys) As Boolean
If (keyData And Keys.KeyCode) = Keys.Enter Then
Return Me
.ProcessTabKey(keyData)
End If
Return MyBase
.ProcessDialogKey(keyData)
End Function

<System.Security.Permissions.SecurityPermission( _
System.Security.Permissions.SecurityAction.Demand, _
Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Function ProcessDataGridViewKey( _
ByVal e As KeyEventArgs) As Boolean
If e.KeyCode = Keys.Enter Then
Return Me
.ProcessTabKey(e.KeyCode)
End If
Return MyBase
.ProcessDataGridViewKey(e)
End Function
End Class
C#
using System;
using System.Windows.Forms;

public class DataGridViewEx : DataGridView
{
[System.Security.Permissions.UIPermission(
System.Security.Permissions.SecurityAction.Demand,
Window = System.Security.Permissions.UIPermissionWindow.AllWindows)]
protected override bool ProcessDialogKey(Keys keyData)
{
if ((keyData & Keys.KeyCode) == Keys.Enter)
{
return this.ProcessTabKey(keyData);
}
return base.ProcessDialogKey(keyData);
}

[System.Security.Permissions.SecurityPermission(
System.Security.Permissions.SecurityAction.Demand,
Flags = System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)]
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
return this.ProcessTabKey(e.KeyCode);
}
return base.ProcessDataGridViewKey(e);
}
}
DataGridViewのイベントで制御する方法
VB.NET
Private Sub dgv1_KeyDown(sender As Object, _
e As KeyEventArgs) Handles dgv1.KeyDown

If e.KeyCode = Keys.Enter Then
Dim
dgv As DataGridView = DirectCast(sender, DataGridView)

If (dgv.CurrentCellAddress.X = dgv.ColumnCount - 1) AndAlso _
(dgv.CurrentCellAddress.Y = dgv.RowCount - 1) Then
Return
End If


SendKeys.Send("{TAB}")
e.Handled = True
End If
End Sub


Private Sub dgv1_CellEndEdit(sender As Object, _
e As DataGridViewCellEventArgs) Handles dgv1.CellEndEdit

Dim dgv As DataGridView = DirectCast(sender, DataGridView)

If (e.ColumnIndex = dgv.ColumnCount - 1) AndAlso _
(e.RowIndex = dgv.RowCount - 1) Then
Return
End If


If e.RowIndex < dgv.RowCount - 1 Then
SendKeys.Send("{UP}")
End If
SendKeys.Send("{TAB}")
End Sub
C#
private void dgv1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
DataGridView dgv = (DataGridView)sender;

if ((dgv.CurrentCellAddress.X == dgv.ColumnCount - 1) &&
(dgv.CurrentCellAddress.Y == dgv.RowCount - 1))
{
return;
}

SendKeys.Send("{TAB}");
e.Handled = true;
}
}

private void dgv1_CellEndEdit(
object sender, DataGridViewCellEventArgs e)
{
DataGridView dgv = (DataGridView)sender;

if ((e.ColumnIndex == dgv.ColumnCount - 1) &&
(e.RowIndex == dgv.RowCount - 1))
{
return;
}

if (e.RowIndex < dgv.RowCount - 1)
{
SendKeys.Send("{UP}");
}
SendKeys.Send("{TAB}");
}



■■■