如何防止列表框跳转到 ítem
本文关键字:tem 何防止 列表 | 更新日期: 2023-09-27 18:36:04
>假设在WinForms中,我有一个启用了多选的列表框,列表框包含50个项目,并且只选择了列表框的第一项...
。然后,如果我选择(使用SetSelected
方法)最后一项,则列表框将跳到底部(与垂直滚动一起)以显示该项目。
我只希望列表框保持在原来的位置,当我使用 SetSelected
选择其他项目时,我不希望列表框每次都上下移动。
那么当我使用SetSelected
方法时,如何防止列表框和列表框与滚动条跳转到 ítem?(向上或向下两个方向)
我希望也许我可以使用WinAPI的功能来做到这一点。
您可以尝试使用 TopIndex
设置最可见的索引,如下所示:
//Use this ListBox extension for convenience
public static class ListBoxExtension {
public static void SetSelectedWithoutJumping(this ListBox lb, int index, bool selected){
int i = lb.TopIndex;
lb.SetSelected(index, selected);
lb.TopIndex = i;
}
}
//Then just use like this
yourListBox.SetSelectedWithoutJumping(index, true);
您还可以尝试定义一些方法来为索引集合设置 selected,并使用 BeginUpdate
和 EndUpdate
来避免闪烁:
public static class ListBoxExtension {
public static void SetMultiSelectedWithoutJumping(this ListBox lb, IEnumerable<int> indices, bool selected){
int i = lb.TopIndex;
lb.BeginUpdate();
foreach(var index in indices)
lb.SetSelected(index, selected);
lb.TopIndex = i;
lb.EndUpdate();
}
}
//usage
yourListBox.SetMultiSelectedWithoutJumping(new List<int>{2,3,4}, true);
注意:您也可以在SetSelectedWithoutJumping
中使用BeginUpdate
和EndUpdate
,但是正如我所说,如果您必须同时选择多索引,实现一些扩展方法(例如SetMultiSelectedWithoutJumping
更好,更方便(我们只使用1对BeginUpdate
和EndUpdate
)。
我只想分享 VB.NET 版本:
#Region " [ListBox] Select item without jump "
' [ListBox] Select item without jump
'
' Original author of code is "King King"
' Url: stackoverflow.com/questions/19479774/how-to-prevent-listbox-jumps-to-item
'
' // By Elektro H@cker
'
' Examples :
'
' Select_Item_Without_Jumping(ListBox1, 50, ListBoxItemSelected.Select)
'
' For x As Integer = 0 To ListBox1.Items.Count - 1
' Select_Item_Without_Jumping(ListBox1, x, ListBoxItemSelected.Select)
' Next
Public Enum ListBoxItemSelected
[Select] = 1
[Unselect] = 0
End Enum
Public Shared Sub Select_Item_Without_Jumping(lb As ListBox, index As Integer, selected As ListBoxItemSelected)
Dim i As Integer = lb.TopIndex ' Store the selected item index
lb.BeginUpdate() ' Disable drawing on control
lb.SetSelected(index, selected) ' Select the item
lb.TopIndex = i ' Jump to the previous selected item
lb.EndUpdate() ' Eenable drawing
End Sub
#End Region