2013-10-16 25 views
0

我有一個系統Windows在C#窗體ListView(VS 2008)與AutoArrange =假LargeIconView。我讓用戶更改the position of an item in my ListView並將所有位置更改保存在txt文件中。然後我從txt文件加載它,並驗證我的信息是好的,但無論如何,如果我嘗試將位置設置回ListViewItems它不會改變任何東西。如果我直接使用硬編碼值處理一個項目,它似乎可以工作。我不知道發生了什麼事。我怎樣才能將保存的位置設置回我的ListViewItems?集ListViewItem的位置從文本文件中LargeIconView(更新一)

我感動的裝載部分從的Form_Load到Form_Shown事件只是一個案例,以確保ListView控件將肯定加載,而我嘗試分配的位置,但它並沒有幫助在這個問題上。 listViewItem位置不會更改爲已保存的位置,但它們具有默認對齊方式。我檢查過我的autoarrange設置爲false,並且我什麼也找不到我可以在這裏做什麼。也許你知道嗎?也許另一個環境起作用?

如果我只是這樣做的一個項目,它沒有問題的變化,但加載的值不適用。

listView1.Items[0].Position = new Point(300, 400); 

在這裏,我加載了我的價值觀,我的ListViewItem的.TAG和得到點的數據。 POINT-Data是有效的,真的在那裏,我驗證了它。但它不能以某種方式工作。 項目保持默認對齊排列,並且位置不會更改。經過進一步的測試

private void Form1_Shown(object sender, EventArgs e) 
    { 
     foreach (ListViewItem LVI in listView1.Items) 
     { 
      Point PNT1 = (Point)LVI.Tag; 
      int x = PNT1.X; 
      int y = PNT1.Y; 
      LVI.Position = new Point(x, y); 
     } 
    } 

更新: 自從我加入約25000項我的ListView我使用的AddRange 方法AddRange方法似乎放棄我的位置先前設置爲ListViewItems列表中的所有ListViewItems。 使用AddRange可以在不到1-2分鐘的時間內添加這些項目,並且.Add-Method位置將被保留,但我不能僅使用.Add。它看起來像是微軟在這裏的一個bug。 我能做些什麼呢? .Add方法毫無疑問,添加項目需要1小時47分鐘,而不是1-2分鐘。

List<ListViewItem> L1 = new List<ListViewItem>(); 
//...Load data from file - the data is valid loaded (checked/debugged) 
ListViewItem LV1 = new ListViewItem(); 
      LV1.Tag = P1; 
      LV1.Text = Text1; 
      LV1.ImageKey = Name1; 
      LV1.ToolTipText = ToolTip1; 
      LV1.ForeColor = ForeColor1; 
      LV1.BackColor = BackColor1; 
      LV1.Position = Position1; //here comes the problem, that seems to be lost 
      L1.Add(LV1); 
      //listView1.Items.Add(LV1); //this would work but it is to slow - AddRange required 
     } 
     listView1.Items.AddRange(L1.ToArray()); //here the position seems to get lost 
+0

你的代碼和你試圖完成似乎很好。我能想出的唯一原因是標籤中的輸入信息不正確。如果你在'Point PNT1 =(Point)LVI.Tag;'行設置了一個斷點,你不應該發現任何問題來找到並解決問題。 – varocarbas

+0

我試了一個類似的代碼,它對我來說工作正常。你的問題現在有點奇怪。 –

+1

看起來像是'winforms'的限制,事實上,當你將'.Position'賦值給某個值時,**將會有'LVM_SETITEMPOSITION'發送到'ListView' **,但是當你設置'Position 'ListViewItem'沒有任何'ListView'作爲它的容器,所以消息不會被髮送,因此'Positions'不會像你期望的那樣被更新。無論如何,向ListView添加如此大量的項目對於「winforms ListView」來說太「重載」了,您可能想嘗試一些「線程化方法」。 –

回答

0

我在這個主題上收到的一個答案不符合我的問題/與我的問題無關,所以我不能選擇它。我自己找到了解決方案。 Microsoft不會序列化ListViewItem的位置屬性,並且在ListViewItem-List上執行.AddRange方法時不會考慮該屬性。它可以被認爲是Microsoft的錯誤/限制(我個人認爲)。我完全重新編寫了結構,並對ListView進行了一些改寫以修復這些內容。由於「修復代碼」大約有幾頁,並且與我的問題中的代碼不兼容,因此它不適合這裏,但我告訴如何處理這個問題。對於序列化 我寫了一個自己的類型ListViewItem2(這種類型我標記爲可序列化),它存儲了我想要保存的所有屬性包括位置。然後我重寫OnItemAdded事件,以便在通過AddRange方法添加項目時它的位置將保持不變。我希望這對遇到類似困難的人有幫助。 ListView的autoarrange-property也必須關閉以設置位置。

0

嗯,你在做什麼,有你採取的每一項,並從中獲取X/Y值(當它已經被放到列表)並分配相同的X/Y值回到它,導致沒有淨變化。

您需要從文件中加載點數據,然後將其分配給視圖中的項目。例如:

for(int I = 0; I < listView1.Items.Count(); I++) 
{ 
    listView1.Items[I].Position = new Point(GetYourXForIndex(I),GetYourYForIndex(I)); 
} 

哪裏GetYourXForIndex(int)是你定義它返回給定指標的適當的X值的函數。 GetYourYForIndex(int)

+1

我恐怕你還沒有理解OP在做什麼(或者Tag可以容納什麼)。他聲稱存儲了正確的信息;而Tag只是一個「放任何你想在這裏」的地方。實際上,似乎信息是不正確的,但你不能建議作爲不依賴於標籤的解決方案,標籤可以包含任何東西(對或錯的信息---標籤不包括給定元素的位置,但是值OP已經在那裏輸入)。請刪除/更新此答案。 – varocarbas

相關問題