VB.Net ListView滚动条和ListView.ItemChecked问题
我有一个带有复选框的列表视图 我有几个问题似乎无法找到答案: 我似乎找不到任何属性来从左向右更改垂直滚动条?所有其他滚动条默认为右侧-但否 我想在触发ItemChecked事件时更新标签,以指示列表中已检查的项目数。我知道在填充列表时会触发ItemChecked事件,但我在应用程序的其他地方已将“DoEvents”变量设置为false,直到填充表单为止,并在触发类似事件时检查该变量的状态,如下所示:VB.Net ListView滚动条和ListView.ItemChecked问题,.net,vb.net,listview,events,.net,Vb.net,Listview,Events,我有一个带有复选框的列表视图 我有几个问题似乎无法找到答案: 我似乎找不到任何属性来从左向右更改垂直滚动条?所有其他滚动条默认为右侧-但否 我想在触发ItemChecked事件时更新标签,以指示列表中已检查的项目数。我知道在填充列表时会触发ItemChecked事件,但我在应用程序的其他地方已将“DoEvents”变量设置为false,直到填充表单为止,并在触发类似事件时检查该变量的状态,如下所示: Private Sub SpecificUsers_ItemChecked(ByVal send
Private Sub SpecificUsers_ItemChecked(ByVal sender as System.Object, ByVal e as System.Windows.Forms.ItemCheckedEventArgs) Handles lstSpecificUsers.ItemChecked
If DoEvents Then
' Set standard string
Dim s as String = "You have currently selected " & lstSpecificUsers.CheckedItems.Count & " users"
If lstSpecificUsers.CheckedItems.Count = 1 Then
' if only 1 selected, show user not users
s = s.SubString(0, s.Length - 1)
End If
lblSpecificUsers.Text = s
End If
End Sub
问题是,listview位于选项卡中;在打开选项卡之前,列表似乎不会实际填充,因此DoEvents已经是真的,这意味着加载要花很长时间,因为它要执行上面的代码几千次
为什么listview在加载选项卡之前不填充
任何帮助都将不胜感激 首先,有这么多项目和一个数据库,DataGridView可能是更好的选择。对于错误一侧的滚动,您可能已将RightToLeft设置为True。如果Form属性为True,我认为它不会让您在孩子身上更改它 检查的问题在于,许多控件仅在需要时绘制/更新。如果没有人能看到LV,它就不能完成所有的绘画,包括勾选支票。要解决此问题,请首先强制它在表单加载中加载填充的内容:
Private Sub Form1_Load(sender etc etc etc
Dim lvi As ListViewItem
For n As Integer = 0 To something
LV.Items.Add(lvi)
If foo Then
lvi.Checked = True ' I assume...
Next
' LV.RedrawItems doesnt work because there is no one looking
' force it to scroll
LV.TopItem = LV.Items(LV.Items.Count - 1)
End Sub
从事件处理程序中删除Handles子句:
Private lvDrawn As Boolean = False
Private Sub LV_ItemChecked(sender As Object, e As ItemCheckedEventArgs)
'Handles LV.ItemChecked REMOVED
If lvDrawn Then
' your code here
End If
End Sub
当控件可见时,使用TabControl将其连接起来:
Private Sub TabCtrl_Selected(sender As Object, e As TabControlEventArgs)
Handles TabControl1.Selected
If e.TabPage Is tabWithLV Then
If lvDrawn = False Then
' first time thru, so Add the handler
AddHandler LV.ItemChecked, AddressOf LV_ItemChecked
' we left it at the bottom, so reset
LV.TopItem = LV.Items(0)
' set the just_do_this_once flag
lvDrawn = True
End If
End If
End Sub
将TopItem设置为底部将强制加载列表;卸下句柄可防止检查事件触发。然后,只有当处理程序变得可见时,才将其挂起。您可能可以使用LV.VisibleChanged事件而不是TabControl事件-这只是我想到的第一件事。LV中大致有多少项以及从何处填充?列表中大约有1500项。数据从数据库收集到一个数据集中,然后填充listview-全部在表单上加载事件-但只有当您第一次单击包含列表视图的选项卡时,数据才会实际填充,并且在该点为每个项目触发itemchecked事件否,当您向LV添加项目时,LV实际上已填充,设置断点并轮询项目计数;只是有些东西在第一次展示给用户之前是不会被绘制的。对于滚动条,将RightToLeft属性更改为FALSE。@RightToLeft属性不会更新;当我尝试改变它时,它只是保持“是”,这就是为什么我感到困惑。至于listview,我知道这一点,但不明白为什么或如何解决这个问题-因此问题就来了。如果表单也是RightToLeft,它可能不允许您更改它感谢您的回复。我的问题是,我有不同控件的其他选项卡,“DoEvents”是在加载所有内容后设置的。此解决方案意味着,如果用户从未加载包含listview的选项卡,则DoEvents永远不会设置为true,这意味着表单上的其他地方将出现问题。。。。实际上,我刚刚发布了第二个'DoEvents'变量。啊!这就是为什么我使用了一个不同的var名称的部分原因——这是为了服务于这种情况,而不是干扰其他东西