【问题标题】:Why is the SelectedItem property of my DataGrid subclass set to Nothing?为什么我的 DataGrid 子类的 SelectedItem 属性设置为 Nothing?
【发布时间】: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 变量为空。

标签: wpf vb.net datagrid


【解决方案1】:

当您在最后一个单元格中按下 Tab 键时,您基本上从数据网格中跳出,这就是我猜测您的 SelectedItem 为空的原因。

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2019-10-24
    • 2010-10-03
    • 2010-11-10
    • 2021-04-11
    相关资源
    最近更新 更多