2016-04-15 3 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, Created и Visible изменились с 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, следовательно, проблемы.

Смежные вопросы