DataGrid
編集可能なセルがほとんどありません。ユーザーは、各セルをタブで移動してコンテンツを編集できます。ここで、タブと同じように機能する右矢印キーを実装したいと思います。したがって、ユーザーが 1 つのセルの編集を終了して右矢印キーを押すと、フォーカスは次の編集可能なセルに移動して編集を開始します。
たとえば、次の画面があります。
ユーザーが右矢印キーを押すと、データグリッドは次のようになります。
DataGrid
編集可能なセルがほとんどありません。ユーザーは、各セルをタブで移動してコンテンツを編集できます。ここで、タブと同じように機能する右矢印キーを実装したいと思います。したがって、ユーザーが 1 つのセルの編集を終了して右矢印キーを押すと、フォーカスは次の編集可能なセルに移動して編集を開始します。
たとえば、次の画面があります。
ユーザーが右矢印キーを押すと、データグリッドは次のようになります。
DataGrid は、実際には右、左、上、下の矢印キーを自動処理します。そうは言っても、これらのキーのいずれかを使用してセルのフォーカスを移動し、入力を開始して編集モードにすることができます (セルが編集可能な場合)。キー押下イベントをリッスンする必要はありません。「Enter」を押すと、次の行に移動することに注意してください。
編集:
もちろん、デフォルトでは矢印キーはセルを編集モードにしません。代わりに、何かを入力するか、マウス ポインターを使用する必要があります。ただし、次のことができます。
private void myDataGrid_CurrentCellChanged(object sender, EventArgs e)
{
myDataGrid.BeginEdit();
}
これにより、フォーカスのあるセルが強制的に編集モードになります。キー イベント ハンドラーを使用してみましたが、DataGrid ではユーザーが矢印キーと Enter キーをリッスンできないようです (ただし、WIN32 API を使用する場合は可能です)。これで、矢印キーのいずれかを使用するたびに、新しく選択したセルが編集モードになります。Esc を押してこのモードから抜け出してください。
これは、矢印キーを使用したナビゲーションに使用するコードです
Datagrid_KeyUp イベント内に配置されます
DataGridCell DGcell = new DataGridCell();
DGcell = GetCell(index, _Header);
if (DGcell != null)
{
CurrentCellContentType = DGcell.Content.GetType().Name.ToString();
}
DataGridCell ProdCodeCell = GetCell(index, 0);
DataGridCell DescCell = GetCell(index, 1);
DataGridCell CostPriceCell = GetCell(index, 4);
DataGridCell VatRateCell = GetCell(index, 9);
DataGridCellInfo PCell = new DataGridCellInfo(ProdCodeCell);
DataGridCellInfo DCell = new DataGridCellInfo(DescCell);
DataGridCellInfo PriceCell = new DataGridCellInfo(CostPriceCell);
DataGridCellInfo VatCell = new DataGridCellInfo(VatRateCell);
string ProdCellContentType = PCell.Column.GetCellContent(PCell.Item).GetType().Name.ToString();
string DescCellContentType = DCell.Column.GetCellContent(DCell.Item).GetType().Name.ToString();
string PriceCellContentType = PriceCell.Column.GetCellContent(PriceCell.Item).GetType().Name.ToString();
string VatCellContentType = VatCell.Column.GetCellContent(VatCell.Item).GetType().Name.ToString();
switch (e.Key)
{
case Key.Left:
if (CurrentCellContentType == "TextBlock") e.Handled = false;
else if (CurrentCellContentType == "TextBox")
{
DataGridCellInfo cellLeft = new DataGridCellInfo(GetCell(index, _Header - 1));
DgInvoiceLines.CurrentCell = cellLeft;
}
break;
case Key.Right:
if (CurrentCellContentType == "TextBlock") else e.Handled = false;
else if (CurrentCellContentType == "TextBox")
{
DataGridCellInfo cellRight = new DataGridCellInfo(GetCell(index, _Header + 1));
DgInvoiceLines.CurrentCell = cellRight;
}
break;
case Key.Up:
if (index != 0)
{
if (CurrentCellContentType == "TextBlock") e.Handled = false;
else if (CurrentCellContentType == "TextBox")
{
DataGridCellInfo cellUp = new DataGridCellInfo(GetCell(index - 1, _Header));
DgInvoiceLines.CurrentCell = cellUp;
DgInvoiceLines.SelectedItem = DgInvoiceLines.Items[index - 1];
}
}
break;
case Key.Down:
if (CurrentCellContentType == "TextBlock") e.Handled = false;
else if (CurrentCellContentType == "TextBox")
{
DataGridCellInfo cellDown = new DataGridCellInfo(GetCell(index + 1, _Header));
DgInvoiceLines.CurrentCell = cellDown;
DgInvoiceLines.SelectedItem = DgInvoiceLines.Items[index + 1];
}
break;
switch ステートメントを使用して、各列ヘッダーに番号を割り当てます
HTH。
これが私の解決策です。
コンストラクターで:
dataGridSubmissionData.KeyUp += DataGridSubmissionDataOnKeyUp;
dataGridSubmissionData.BeginningEdit += DataGridSubmissionDataOnBeginningEdit;
dataGridSubmissionData.CellEditEnding += DataGridSubmissionDataOnCellEditEnding;
dataGridSubmissionData.CurrentCellChanged += DataGridSubmissionDataOnCurrentCellChanged;
ボディクラス:
private bool isCellInEditionMode = false;
private void DataGridSubmissionDataOnCurrentCellChanged(object sender, EventArgs eventArgs)
{
dataGridSubmissionData.BeginEdit();
}
private void DataGridSubmissionDataOnCellEditEnding(object sender, DataGridCellEditEndingEventArgs dataGridCellEditEndingEventArgs)
{
isCellInEditionMode = false;
}
private void DataGridSubmissionDataOnBeginningEdit(object sender, DataGridBeginningEditEventArgs dataGridBeginningEditEventArgs)
{
isCellInEditionMode = true;
}
private void DataGridSubmissionDataOnKeyUp(object sender, KeyEventArgs keyEventArgs)
{
if (keyEventArgs.Key == Key.Up || keyEventArgs.Key == Key.Down || keyEventArgs.Key == Key.Left || keyEventArgs.Key == Key.Right)
{
if (!isCellInEditionMode)
return;
dataGridSubmissionData.CommitEdit();
var key = keyEventArgs.Key; // Key to send
var target = dataGridSubmissionData; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key) {RoutedEvent = routedEvent}
);
}
}
私の答えが誰かに役立つことを願っています。