我有一個DataGrid
與幾個可編輯的單元格。用戶可以通過每個單元格標籤來編輯內容。現在我想實現與標籤一樣工作的右箭頭鍵。因此,當用戶完成編輯一個單元格並按下右箭頭鍵時,焦點將移至下一個可編輯單元格並開始編輯。如何實現WPF Datagrid箭頭鍵導航像Tab導航
例如,我有如下畫面:
當用戶按下右箭頭鍵,我想我的DataGrid是這樣的:
我有一個DataGrid
與幾個可編輯的單元格。用戶可以通過每個單元格標籤來編輯內容。現在我想實現與標籤一樣工作的右箭頭鍵。因此,當用戶完成編輯一個單元格並按下右箭頭鍵時,焦點將移至下一個可編輯單元格並開始編輯。如何實現WPF Datagrid箭頭鍵導航像Tab導航
例如,我有如下畫面:
當用戶按下右箭頭鍵,我想我的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}
);
}
}
我希望我的回答可以幫助的人。
如果你的情況是WPF 託管窗口,它叫無模WPF。
而且解決方案可能是這樣的:
Window window = new Window();
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(window);
window.Show();
我見過的解決方案here
感謝您的答覆。我的數據網格正如你現在所說的那樣工作。但是,我想讓我的datagrid單元格在焦點時直接進入編輯模式。謝謝 – Jing 2011-01-05 03:56:25
我剛剛編輯了我的答案。 HTH! – user1234567 2011-01-05 04:04:00
再次感謝您的回覆。現在,我的datagrid單元格直接進入編輯模式。但是當我完成一個單元格的編輯並按下右箭頭鍵時,它仍然保留在同一單元格中,而不會轉到下一個可編輯單元格。你能給我一些關於這個的想法嗎?謝謝 – Jing 2011-01-05 04:11:29