2016-06-24 64 views
0

如果列表視圖(在詳細模式下)向下滾動,然後重新調整列表視圖的大小,並且如果在Resize事件或甚至Layout事件中調整列大小,則內容會嚴重損壞。如何解決Windows ListView問題?

要重現,使一個新的C#項目,並把這個代碼在那裏:

private void Form1_Load(object sender, EventArgs e) 
    { 
     ListView lv = new ListView(); 
     lv.Size = ClientSize; 
     lv.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top; 
     lv.Columns.Add(new ColumnHeader()); 
     lv.Columns.Add(new ColumnHeader()); 
     lv.View = View.Details; 
     lv.FullRowSelect = true; 
     lv.Resize += lv_Resize; 
     Controls.Add(lv); 

     string[] s = new string[2]; 
     s[0] = "hrd"; 
     s[1] = "igwegmg";   
     for (int i = 0; i < 20; i++) 
     { 
      lv.Items.Add(new ListViewItem(s)); 
     } 

     lv_Resize(lv, null); 
    } 

    private void lv_Resize(object sender, EventArgs e) 
    { 
     ListView lv = (ListView)sender; 
     lv.Columns[1].Width = lv.ClientSize.Width - lv.Columns[0].Width; 
    } 

運行它,滾動列表下來了一點,調整窗體通過拖動窗體底部顯示所有項目向下。

將其縮小爲滾動條出現的位置,然後會變得更糟。或者而不是調整大小,只是最大化和恢復表單。

請注意,還有一堆(取決於你滾動多少)在列表視圖頂部的空項目,你不能點擊它們。要恢復正常,你必須做兩件事之一。

  1. 重新填充項目(不好 - 我有太多的項目,我失去了我的滾動位置)。

  2. 如果將窗體大小調整爲滾動條彈出的位置,然後將滾動條滾動到底部,然後將鼠標移出滾動條,然後返回滾動條頂部,您將看到滾動條調整自己的大小,此時您可以將滾動條拖動到頂部,然後將其調回正常。

如果RedrawItems,那麼至少你可以再次看到所有項目,但你仍然可以在頂部的空白項目。在調整大小/佈局事件後調用RedrawItems的函數並不總是有效。

關於這個bug的任何想法?我真的不想使用任何其他控件或第三方軟件。

+0

你說「內容遭到損壞嚴重」。定義。壞數據,視覺僞像? – DonBoitnott

+0

視覺文物。文字消失,中途重新出現,真空行上方出現空行。 – Dorf

+0

你自己在畫這些物品嗎?這聽起來像是一個簡單的刷新問題。 – DonBoitnott

回答

0

注意到其他ListView在我的應用程序中沒有顯示錯誤。找到它的原因是他們調整了Form的Resize事件中的列的大小。

解決方法:不要調整ListView.Resize()中的列的大小,而是在Form.Resize()事件中執行該操作。

我會離開這個開放littelwhile櫃面你們中的一些已經被研究的解決方法,使用ListView.Resize()