如何以编程方式设置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
顺便说一下listview的形式还没有调用ShowDialog方法。 这可能是不起作用的原因吗?
答案 0 :(得分:3)
您必须了解表单和表单本身上的每个控件都是一个窗口,并且要使窗口具有焦点,必须首先创建它并为其分配句柄。
有关此内容的基本描述,我建议你:All About Handles in Windows Forms以下摘录来自参考文章。
什么是句柄?
句柄(HWND)是CreateWindowEx的返回值,Windows操作系统使用该值来识别窗口。 win32中的“窗口”是一个比你想象的更广泛的概念 - 每个单独的按钮,组合框,列表框等都包含一个窗口。 (有关更多信息,请参阅关于窗口类)注意:框架中还有其他称为“句柄”的内容 - 例如GDI处理从位图或句柄到设备上下文(HDC) - 本文仅讨论HWND。
...
Control什么时候创建它的句柄? (控件什么时候调用CreateWindowEx?)
控件尽可能地推迟创建其句柄。这是因为设置属性会强制CLR和user32之间的混乱互操作。
通常在所有控件的句柄之前创建 调用Form.Load事件。如果“手柄”也可以创建手柄 调用属性并且尚未创建句柄,或 调用CreateControl()。
因此,在实例化控件时不会立即创建窗口的句柄。但是,您可以通过引用其Handle property来强制控件创建其句柄。
因此,如果您首先让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()
答案 1 :(得分:1)
正如其他人所评论的那样,您的代码应该按照书面形式运行。如果您只需要以编程方式访问代码中的焦点项,那么您就不应该遇到任何困难。 (如果有,请描述一下。)
如果您正在寻找视觉效果(正在突出显示的行),我的猜测是您的代码处于另一个控件的事件中,并且在您的代码运行后,焦点将自动设置回该控件。您的代码很可能需要在其他位置,并尝试将其移动到其他位置以防止此问题,这将浪费时间。
但是,还有其他方法可以直观地设置行。当列表视图不可能保持聚焦时,我首选的方法是用不同的前/后颜色区分所选项目。 (如果您愿意,可以使用重点项目,但我发现所选项目更有用。您的电话。)
以下是一个视觉突出显示所选行的示例,无论焦点如何:
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
来显示该表单,则显示的表单是原始表单的新副本,不会反映您以编程方式所做的更改。 / p>
想象一下,您坐在已打开空白Word文档的计算机上。您在其中键入内容然后打开一个新文档。您在第一个文档中键入的文本不会复制到第二个文档。我认为这是你麻烦的根源。