2012-01-20 46 views
0

我有一個顯示約300項的ListView。當某些東西被改變,我需要重新填充列表時,我希望滾動位置保持不變,因此相同的項目仍然可見並且位於列表中的相同位置。 「EnsureVisible」方法很糟糕,因爲它符合「可見」而不是相同的位置(結果是感興趣的項目總是滾動到列表的底部)。.NET:ListView的TopItem屬性失敗,並顯示「ShowGroups」= true

我對這個問題的解決方案是保存列表 - > TopItem的(我)「ID」,重新填充列表,然後調用列表 - > TopItem = newItemWithSameID(需要設置兩次,出於某種原因)。這可以作爲基本「未分組」列表的魅力。

但 - 如果列表中有「ShowGroups = true」,這將無法工作。屬性TopItem將始終是列表中的第一個項目,而不是文檔中所說的第一個VISIBLE項目。

有沒有解決方案?我搜索了一下,發現了另一個失去靈魂的同樣的問題。他對微軟的支持很有趣,但沒有成功。(http://social.msdn.microsoft.com/Forums/en/winforms/thread/8a81c5a6-251c-4bf9-91c5-a937b5cfe9f3)。

所以 - 我的問題是:有沒有解決方法?我真的需要將這個列表分組,當我的列表跳轉時,我真的很討厭什麼時候發生了變化。

我不會在這裏粘貼任何代碼,因爲所有需要重現的代碼都在上面的討論中。

非常感謝!

回答

0

下面是我已經使用了此問題的方法:

public ListViewItem RealTopItem 
{ 
    int i = 0; 
    while (i < Items.Count && !ClientRectangle.Contains(Items[i].Bounds)) 
     i++; 

    return Items[i]; 
} 

不幸的是,它只是最近未能在while語句客戶在我的代碼已經工作了一年後。在我的故障排除中,我首先嚐試關閉組,並且問題消失。然後當我再次激活組時,問題再也沒有發生。我現在不知道那裏有什麼可能是錯的。

+0

很久以前,謝謝,但我只是重新討論這個問題,你的解決方案工作。但是,如果listitem比客戶區域寬,ClientRectangle.Contains會失敗,這可能是您的問題。 所以我改變檢查第一個項目在哪裏(Items [i] .Bounds.Y> 0),無論寬度如何工作。 –

相關問題