我想有一个自定义的DataGrid其能,
- 当回车键也被压,如果它是在编辑模式下移动到下一个单元格。
- 如果当前行中的最后一列是达到,重点应转移到下一行的第一个单元格。
- 在到达下一个细胞,如果细胞是可编辑的,它会自动变成可编辑的。
- 如果单元格包含一个
ComboBox
不comboboxcolumn,组合框应该DropDownOpen。
请帮我在这。 我已经从过去几日通过创建自定义的DataGrid尝试,写了一些代码
protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e)
但我失败了。
private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.Key == Key.Enter)
{
e.Handled = true;
var cell = GetCell(dgIssuance, dgIssuance.Items.Count - 1, 2);
if (cell != null)
{
cell.IsSelected = true;
cell.Focus();
dg.BeginEdit();
}
}
}
catch (Exception ex)
{
MessageBox(ex.Message, "Error", MessageType.Error);
}
}
public static DataGridCell GetCell(DataGrid dg, int row, int column)
{
var rowContainer = GetRow(dg, row);
if (rowContainer != null)
{
var presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);
if (presenter != null)
{
// try to get the cell but it may possibly be virtualized
var cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
if (cell == null)
{
// now try to bring into view and retreive the cell
dg.ScrollIntoView(rowContainer, dg.Columns[column]);
cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
}
return cell;
}
}
return null;
}
一个更简单的实现。 这样做是为了捕捉到keydown事件,如果关键是“回车”,然后移动到下一个标签是网格的下一个单元格。
/// <summary>
/// On Enter Key, it tabs to into next cell.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataGrid_OnPreviewKeyDown(object sender, KeyEventArgs e)
{
var uiElement = e.OriginalSource as UIElement;
if (e.Key == Key.Enter && uiElement != null)
{
e.Handled = true;
uiElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
}
public class DataGrid : System.Windows.Controls.DataGrid
{
private void PressKey(Key key)
{
KeyEventArgs args = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key);
args.RoutedEvent = Keyboard.KeyDownEvent;
InputManager.Current.ProcessInput(args);
}
protected override void OnCurrentCellChanged(EventArgs e)
{
if (this.CurrentCell.Column != null)
if (this.CurrentCell.Column.DisplayIndex == 2)
{
if (this.CurrentCell.Item.ToString() == "--End Of List--")
{
this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
}
}
else if (this.CurrentCell.Column != null && this.CurrentCell.Column.DisplayIndex == this.Columns.Count() - 1)
{
PressKey(Key.Return);
DataGridCell cell = DataGridHelper.GetCell(this.CurrentCell);
int index = DataGridHelper.GetRowIndex(cell);
DataGridRow dgrow = (DataGridRow)this.ItemContainerGenerator.ContainerFromItem(this.Items[index]);
dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
}
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
DataGridRow rowContainer = (DataGridRow)this.ItemContainerGenerator.ContainerFromItem(this.CurrentItem);
if (rowContainer != null)
{
int columnIndex = this.Columns.IndexOf(this.CurrentColumn);
DataGridCellsPresenter presenter = UIHelper.GetVisualChild<DataGridCellsPresenter>(rowContainer);
if (columnIndex == 0)
{
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);
request.Wrapped = true;
cell.MoveFocus(request);
BeginEdit();
PressKey(Key.Down);
}
else
{
CommitEdit();
DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);
request.Wrapped = true;
cell.MoveFocus(request);
}
this.SelectedItem = this.CurrentItem;
e.Handled = true;
this.UpdateLayout();
}
}
}
}
暂且,我写了这个和它的工作对我来说。
Public Sub SendKey(ByVal key As Key)
Dim args As New KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, key)
args.RoutedEvent = Keyboard.KeyDownEvent
InputManager.Current.ProcessInput(args)
End Sub
Private Sub dataGrid_PreviewKeyDown(sender As Object, e As KeyEventArgs) Handles dataGrid.PreviewKeyDown
Dim i As UIElement = e.OriginalSource
Dim DG As DataGrid = sender
If (e.Key = Key.Enter Or e.Key = Key.Return) AndAlso i IsNot Nothing Then
MyBase.OnKeyDown(e)
DG.CommitEdit()
SendKey(Key.Tab)
e.Handled = True
End If
End Sub