2013-10-20 121 views
0

假設在一個WinForms我有一個列表框與多選啓用,列表框包含50個項目,只選擇了列表框的第一項...如何防止Listbox跳轉到ítem?

...那麼,如果我選擇(使用SetSelected法)的最後項目,然後列表框將跳轉到底部(與垂直滾動一起)以向我顯示該項目。

我只想讓列表框保持原來的位置,而我使用SetSelected來選擇其他項目,我不希望列表框每次都上下移動。

那麼當我使用SetSelected方法時,如何防止Listbox和ListBox v。滾動條跳轉到ítem? (在兩個方向向上或向下)

我希望也許我可以使用函數WinAPI來做到這一點。

回答

1

您可以嘗試使用TopIndex設置頂部可見指數是這樣的:

​​

您也可以嘗試定義一些方法來選擇設置指標的收集和使用BeginUpdateEndUpdate避免閃爍:

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

注意:您還可以使用BeginUpdateEndUpdateSetSelectedWithoutJumping,但正如我所說,如果你必須一起選擇多指標,實施一些擴展方法,如SetMultiSelectedWithoutJumping更好,更方便(我們只使用1對BeginUpdateEndUpdate)。

+0

我都掛起/恢復外觀,還採用的BeginUpdate/endupdate但閃爍的是不是我的問題,謝謝你的答案我不不知道Topindex屬性,至少現在列表框已經回到了前一個位置,但是仍然在移動(當listbox包含很多項目時,它可以被更多地理解),所以現在Listbox正在跳轉,但是在跳轉之後它返回到之前的位置,我希望如果存在一種方法來禁止這種運動,而不是試圖做一些棘手的事情(跳到那裏並返回),真的非常感謝! – ElektroStudios

+1

@ElektroStudios **這不是棘手的**,這是應該如何做。當你調用'SetSelected'時,原生'LB_SETSEL'總是具有類似的行爲(跳到選定的項),實際上'LB_SETSEL'消息被髮送。所以你沒有任何所謂的「直路」。 'BeginUpdate'和'EndUpdate'是爲了解決這個問題而設計的。當你不需要的時候抑制每一個繪圖,只需調用'EndUpdate'來接受當前的'UI狀態'。 –

+0

現在它已經解決了,你的擴展可以和beginupdate/endupdate一起完美地完成工作,它不會產生任何噁心的視覺效果(我的意思是跳躍),很好的回答! – ElektroStudios

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 [email protected] 
    ' 
    ' 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