读取ListView属性后看到的奇怪行为

时间:2016-04-15 16:39:53

标签: c# winforms listview properties

所以我试图克隆我的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); 并执行:

ListView

我收到错误:

  

异常:抛出:“InvalidArgument ='-1'的值对'index'无效。” (System.ArgumentOutOfRangeException)   抛出了System.ArgumentOutOfRangeException:“InvalidArgument ='-1'的值对'index'无效。”

因此,我在复制其属性之前和之后创建了一个方法来比较原始CanSelect的属性,唯一的区别是CreatedVisible和{{1}}已经从True变为False。

为什么会这样表现?

1 个答案:

答案 0 :(得分: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,因此当复制被处理时,原始{{1因此也存在问题。