|
分類:[C#]
お世話になっております。
DataGridViewで以下のようなものを実現したいのですがうまくいきません。
1.Enterキーで横移動を可能とする。
2.値を入力後に文字数がMaxLengthとなった場合次のセルに移動
横移動はMoveFocusメソッドでReadonlyの場合は次の横のセルをフォーカスするようにしています。
以下のプログラムでうまく動作しない点は
2をテキストボックスのKeyUpイベントで実装しているのですが
既にMaxLengthとなっているテキストボックスを選択し全角でキーを入力すると次のセルに移動してしまいます。
例えば「あ」と打つと変換確定しない前から次のセルに移動してしまう。
これを「あ」と入力後に変換確定後に移動としたいのですが、良い方法ないでしょうか。
[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 false;
}
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)
{
MoveFocus(); // 次のセルにフォーカスを移動します。
return false;
}
return base.ProcessDataGridViewKey(e);
}
private void dataGridViewTextBox_KeyUp(object sender,
KeyEventArgs e)
{
if (tb.Text.Length == tb.MaxLength)
{
MoveFocus(); // 次のセルにフォーカスを移動します。
}
}
private void MoveFocus()
{
int row = this.CurrentCell.RowIndex;
int column = this.CurrentCell.ColumnIndex;
MovefocusSub(ref row, ref column);
this.CurrentCell = this[column, row];
}
private void MovefocusSub(ref int row, ref int column)
{
column++;
if (this.ColumnCount <= column)
{
row++;
column = 2;
}
if (this[column, row].ReadOnly)
{
MovefocusSub(ref row, ref column);
}
}
|