如何以编程方式设置列表视图焦点项



如何以编程方式设置 FocusedItem 属性?

到目前为止,我已经尝试过这个没有成功:

If lvw.FocusedItem Is Nothing Then
    If lvw.Items.Count > 0 Then
    lvw.Focus()
    lvw.HideSelection = False
    lvw.Items(0).Selected = True
    lvw.Items(0).Focused = True
    lvw.FocusedItem = lvw.Items(0)
    lvw.Select()
    End If
End If

顺便说一句,列表视图所在的窗体尚未调用 ShowDialog 方法。这可能是这不起作用的原因吗?

您必须了解窗体上的每个控件和窗体本身都是一个窗口,要使窗口具有焦点,必须首先创建窗口并为其分配句柄。

有关这方面的基本说明,我参考: 关于 Windows 窗体中的句柄 以下摘录来自引用的文章。

什么是句柄?

句柄 (HWND) 是 CreateWindowEx 的返回值,Windows 操作系统使用它来标识窗口。win32 中的"窗口"是一个比您想象的更广泛的概念 - 每个单独的按钮、组合框、列表框等都包含一个窗口。(有关详细信息,请参阅关于窗口类)注意:框架中还有其他称为"句柄"的内容 - 例如,位图的 GDI 句柄或设备上下文 (HDC) 的句柄 - 本文仅讨论 HWND。

控件何时创建其句柄?(控件何时调用 CreateWindowEx?)

控件尽可能推迟创建其句柄。这是因为设置属性会强制 CLR 和 user32 之间进行聊天互操作。

通常,所有控件的句柄都是在调用 Form.Load 事件。如果"句柄",也可以创建句柄属性被调用,但尚未创建句柄,或者调用 CreateControl()。

因此,实例化控件时不会立即创建窗口的句柄。 但是,可以通过引用控件的 Handle 属性来强制控件创建其句柄。

因此,如果首先让 ListView 创建其句柄,则在设置所需的属性时

Dim f2 As New Form2
' you do not need this condition, it is here only for demonstration purposes
' so that you can step through the code in the debugger and observe the
' code execution.
If Not f2.ListView1.IsHandleCreated Then
   ' retrieval of the Handle will cause a handle to be created
   ' if it has not yet been created
   ' if you delete the If-Then block, you will need to retain the 
   ' following statement
   Dim h As IntPtr = f2.ListView1.Handle
End If
f2.ListView1.FocusedItem = f2.ListView1.Items(2)
f2.ListView1.Items(2).Selected = True
f2.ListView1.Items(2).Focused = True
f2.ActiveControl = f2.ListView1
f2.ShowDialog()

正如其他人所评论的那样,您的代码应该按编写的方式工作。如果您只需要以编程方式访问代码中的焦点项,则应该不会遇到任何困难。(如果是,请描述一下。

如果您正在寻找视觉效果(突出显示的行),我的猜测是您的代码位于另一个控件的事件中,并且在代码运行后立即自动将焦点设置回该控件。您的代码很可能需要放在原处,尝试将其移动到其他地方以防止此问题会浪费时间。

但是,还有其他方法可以在视觉上将行分开。当列表视图不太可能保持焦点时,我的首选方法是使用不同的前/背颜色区分所选项目。(如果您愿意,可以使用重点项目,但我发现所选项目更有用。您的来电。

以下示例直观地突出显示了所选行,而不考虑焦点:

Private Sub lvw_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lvw.SelectedIndexChanged
    If lvw.Items Is Nothing Then Exit Sub
    For Each lvi As ListViewItem In lvw.Items
        If lvi.Selected = True Then
            lvi.ForeColor = Color.DarkGray
            lvi.BackColor = Color.LightCyan
        Else
            lvi.ForeColor = Color.Black
            lvi.BackColor = Color.White
        End If
    Next
End Sub

编辑:

响应此表单正在使用ShowDialog显示的附加信息,是的,这可能是问题的根源。

ShowDialog创建窗体的新实例。因此,如果设置了窗体或其控件的任何属性,并在以后调用 ShowDialog 来显示该窗体,则显示的窗体是原始窗体的新副本,不会反映以编程方式所做的更改。

想象一下,您坐在一台已经打开空白 Word 文档的计算机前。在其中键入内容,然后打开一个新文档。您在第一个文档中键入的文本不会复制到第二个文档中。我认为这是你在这里烦恼的根源。

最新更新