【发布时间】:2019-09-11 10:20:01
【问题描述】:
我在我的 VB.NET 应用程序中对 WPF DataGrid 进行了子类化,因为我需要经常使用这个组件,但还需要一些额外的功能,在这种情况下,当按下右下角的 tab 键时添加一个新行细胞。
我已经覆盖了基类的 OnKeyDown 事件。当在网格聚焦时按下 tab 键时,这会被触发,这正是我想要的。但是,当事件被触发时,我需要能够确定我是否在右下角的单元格中。为此,我想获取我的 DataGrid 的 SelectedItem 属性并使用它来确定选择了哪个单元格。
我以编程方式完成所有这些工作,因为我不希望用户编写比常规数据网格更多的 XAML。它应该以完全相同的方式运行,除非您在右下角的单元格上添加一个新行并选择该行的第一个单元格。无论用户在数据网格中有多少行/列,这都应该适用。
下面的代码显示了我想要执行的操作,但未设置 SelectedItem。
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
MyBase.OnKeyDown(e)
If e.Key = Key.Tab Then
Dim colIndex As Integer = Me.Columns.IndexOf(Me.CurrentColumn)
Dim colCount As Integer = Me.Columns.Count - 1
If -1 = colIndex Then
'the next line throws a System.NullReferenceException because SelectedItem is not set
If SelectedItem.Equals(Items(Items.Count - 1)) Then
Focus()
Dim dgrCI = New DataGridCellInfo(Items(Items.Count - 1), Columns(colIndex))
ScrollIntoView(Items(Items.Count - 1))
BeginEdit()
End If
End If
End If
End Sub
SelectedItem 属性应设置为表中的最后一项,但应设置为 Nothing。这是为什么呢?
编辑: Ppp的答案是正确的。似乎在触发 OnKeydown 事件时,DataGrid 已经失去了焦点。我改用 OnPreviewKeydown 事件解决了这个问题。
【问题讨论】:
-
当前列的索引是怎么变成-1的?
-
当我在右下角的单元格上按标签时,我在调试模式下检查了 colIndex 变量的值。值为-1。那部分似乎工作正常。只是 SelectedItem 变量为空。