0

假设在 WinForms 中,我有一个启用了多选的列表框,列表框包含 50 个项目,并且仅选择了列表框的第一项...

...然后,如果我选择(使用SetSelected方法)最后一项,那么列表框将跳到底部(与垂直滚动一起)以显示该项目。

我只希望列表框保持在原来的位置,而我SetSelected用来选择其他项目时,我不希望列表框每次都上下移动。

那么,当我使用方法时,如何防止 Listbox 和 listbox v.scrollbar 跳转到项目SetSelected?(上下两个方向)

我希望也许我可以使用WinAPI的功能来做到这一点。

4

2 回答 2

2

您可以尝试使用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 并使用BeginUpdateandEndUpdate来避免闪烁:

 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);

注意:您也可以在 中使用and BeginUpdate,但是正如我所说,如果您必须一起选择多个索引,则实现一些扩展方法,例如更好更方便(我们只使用一对and )。EndUpdateSetSelectedWithoutJumpingSetMultiSelectedWithoutJumpingBeginUpdateEndUpdate

于 2013-10-20T16:31:30.027 回答
0

我只想分享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
于 2013-10-20T17:44:22.320 回答