2009-02-11 55 views
4

當 的Selected屬性在Items 集合ListView的項目上設置爲true時,選擇計數.SelectedItems.Count不會更改。.NET:ListView布魯斯?

實施例:

lvPept.SelectedItems.Clear() 
    lvPept.Items(6).Selected = True 
    Dim newLen As Integer = lvPept.SelectedItems.Count 

lvPeptListView並且包含10個元素。

newLen預期爲1,但爲0時,出現問題時 和SelectedIndexChanged事件解僱。使用 其他數據集的預期值爲1,並觸發SelectedIndexChanged事件。

在什麼情況下或以什麼狀態可以lvPept在 發生這種情況? BeginUpdate()/ EndUpdate()是不是lvPept一起使用。

背景:

我試圖追查問題我 開源.NET應用程序的用戶之一,MSQuant (http://msquant.sourceforge.net/),遇到。

我已經用完了這個 問題的原因。

的問題是重複性好,我可以重現它在我 開發環境Visual Studio 2008中這似乎是 獨立的Windows版本(在Windows 2000/Windows XP中的32位/ Windows XP 64位), .NET運行時版本(2.0/3.5)和Visual Studio版本(2005/2008)。

其他上下文:該應用程序是用VB.NET編寫的,在 C#中,它是一個Windows窗體應用程序。 類的源代碼是http://shrinkster.com/14bgListView所在的 表單類最初由支持.NET的最早的正式版本的Visual Studio之一生成爲 。

更新1:因爲我有一個工作案例和一個破案I 比較了lvPept的內容。除了屬性「Handle」,「MousePosition」和「TopItem」 (因爲它是具有不同肽的不同蛋白質)之外唯一的區別 屬性 「已創建」。破案是假的。有意義的 部分構建的對象無法正常工作,但它怎麼會發生?

更新2:財產「創造」被錯誤地證明是一個 好主角。我認爲真正的問題是在 建設時間,而不是在窗體加載時間。我現在 添加斷言財產「創建」,重構和改變 所有的操作在窗體加載的時間發生。它現在按預期工作 ,並且出現問題的用戶已獲得該應用程序的新版本 。

因爲應用程序的 成立以來,老壞的方式已經在那裏於2002年。我只是想知道,如果有專家能對爲什麼它的工作時間99.9%,只有 未能在少數情況下和reproducably 投光所以。

回答

1

這是一個有趣的一個。

,我認爲可以做到這一點的唯一的事情是,如果ListView控件沒有意識到的是,列表項已經改變了它的「選定」的價值,因此沒有更新其選定的項目集合。

的.SelectedItems屬性不會每次你得到的財產時必然產生的 - 如果你反映System.Windows.Forms程序集:

if (this.selectedListViewItemCollection == null) 
    { 
     this.selectedListViewItemCollection = new SelectedListViewItemCollection(this); 
    } 
    return this.selectedListViewItemCollection; 

所以我傾向於認爲,你得到的過時的selectedListViewItemCollection。

我想嘗試,而不是在項目層面改變Selected屬性,嘗試,而不是添加選擇的索引到ListView的.SelectedIndices財產,看看是否能工程。這樣ListView不依賴於拾取ListViewItem變化。

0

我相信你也必須調用ListView.Select(),以觸發SelectedIndexChanged事件。

lvPept.SelectedItems.Clear() 
lvPept.Items(6).Selected = True 
lvPept.Select() 
Dim newLen As Integer = lvPept.SelectedItems.Count 
+0

我現在試着添加lsPept.Select()。它沒有任何區別。 – 2009-02-11 03:49:39