我有一個系統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
你的代碼和你試圖完成似乎很好。我能想出的唯一原因是標籤中的輸入信息不正確。如果你在'Point PNT1 =(Point)LVI.Tag;'行設置了一個斷點,你不應該發現任何問題來找到並解決問題。 – varocarbas
我試了一個類似的代碼,它對我來說工作正常。你的問題現在有點奇怪。 –
看起來像是'winforms'的限制,事實上,當你將'.Position'賦值給某個值時,**將會有'LVM_SETITEMPOSITION'發送到'ListView' **,但是當你設置'Position 'ListViewItem'沒有任何'ListView'作爲它的容器,所以消息不會被髮送,因此'Positions'不會像你期望的那樣被更新。無論如何,向ListView添加如此大量的項目對於「winforms ListView」來說太「重載」了,您可能想嘗試一些「線程化方法」。 –