2016-04-15 76 views
0

所以我試圖克隆我的ListView這樣我最終得到一個新的ListView與舊的屬性,但沒有舊的項目(同時避免任何引用回到舊的)。閱讀ListView的屬性後看到的奇怪行爲

private ListView generateEmptyClone(ListView toClone) 
{ 
    ListView newCopy = new ListView(); 

    foreach (var propToClone in toClone.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
    { 
     PropertyInfo propInfo = newCopy.GetType().GetProperty(propToClone.Name); 
     if (propInfo.CanWrite && propInfo.Name != "TopItem") // TopItem causing problems 
      propInfo.SetValue(newCopy, propToClone.GetValue(toClone, null)); 
    } 

    foreach (ColumnHeader head in toClone.Columns) 
    { 
     newCopy.Columns.Add((ColumnHeader)head.Clone()); 
    } 

    return newCopy; 
} 

上面的方法工作完全正常,但是當我回到原來的ListView並執行:

string[] customerToAdd = { "To IBT", customerName, contactNum, date, SKU, itemDescription, 
              emp, emp, emp, emp, emp}; 
var listViewItem = new ListViewItem(customerToAdd); 
listViewItem.Font = new Font(listViewItem.Font, FontStyle.Regular); 
TableDisplay.Items.Insert(0, listViewItem); 

我得到的錯誤:

Exception:Thrown: "InvalidArgument=Value of '-1' is not valid for 'index'." (System.ArgumentOutOfRangeException) A System.ArgumentOutOfRangeException was thrown: "InvalidArgument=Value of '-1' is not valid for 'index'."

所以我創建了一個方法比較原始ListView在複製其屬性前後的屬性,唯一的區別是CanSelect,CreatedVisible已從True更改爲False。

任何想法,爲什麼它這樣表現?

+0

你可以提供用於創建'myListViewItem'的代碼嗎? – jaredbaszler

+0

@jaredbaszler我修改了帖子 – galacticfan

+0

我在這裏沒有看到任何不合適的東西。也許檢查你在克隆後克隆的克隆列表中有多少列。另外,-1通常在找不到任何東西時通過某種查找函數返回。例如,如果您正在爲一個項目搜索一個ListBox或一個數組,並且它沒有找到它。如果您正在查找某個內容,然後嘗試將其插入索引爲-1的索引,則該索引無效。檢查您的索引,並確保它們都是有效的。這相當容易調試。 – jaredbaszler

回答

0

爲了解決這個問題,我最終改變了方法,使每個屬性都是手動設置的。

private ListView generateEmptyClone(ListView toClone) 
{ 
    ListView newCopy = new ListView(); 

    newCopy.Alignment = ListViewAlignment.Top; 
    newCopy.BorderStyle = BorderStyle.Fixed3D; 
    newCopy.BackgroundImageTiled = false; 
    newCopy.Font = new Font("Mircosoft Sans Serif", 9F, FontStyle.Bold, GraphicsUnit.Point, (byte)(0)); 
    newCopy.ForeColor = SystemColors.MenuText; 
    // etc... 


    foreach (ColumnHeader head in toClone.Columns) 
    { 
     newCopy.Columns.Add((ColumnHeader)head.Clone()); 
    } 

    return newCopy; 
} 

原來這個錯誤只在我以後在我的應用程序中處理新副本時纔出現。所以我相信,通過像我在原始問題中一樣遍歷屬性,必須有一個屬性返回到原始的ListView,因此當處置副本時,原始的ListView的一些元素也被處置,因此問題。