所以我试图克隆我的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
的属性,唯一的区别是Created
,Visible
和{{1}}已经从True变为False。
为什么会这样表现?
答案 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因此也存在问题。