Проблема возникает здесь:
В методе SetExportViewAccordingToCheckboxes () я просто передаю
глобальный treeview1 как вызов по значению, манипулировать им внутри и возвращать
манипулируемый вид дерева:
protected static TreeView SetExportViewAccordingToCheckboxes(TreeView tvSource)
{
TreeView tvRet = tvSource;
if (cbName == false)
tvRet.RemoveColumn( ... );
...
return tvRet;
}
Сначала немного предыстории. В терминологии C # типы значений - это те, которые непосредственно содержат значение, в то время как ссылочные типы - это те, которые ссылаются на данные, а не хранят их непосредственно.
Итак, int x = 5
означает, что вы создаете объект значения 5 типа integer и сохраняете его в x
, тогда как TreeView tree = new TreeView()
означает, что вы создаете ссылку tree
типа TreeView , который указывает на объект того же типа.
Все это означает, что вы не можете передать объект по значению, даже если хотите. В лучшем случае вы передаете ссылку по значению, которое не имеет никакого эффекта.
Итак, следующий шаг - скопировать данные и изменить скопированный объект вместо исходного. Это теоретически обоснованно, но строка: TreeView tvRet = tvSource;
, к сожалению, этого не достигает. Да, вы создаете новую ссылку, но эта ссылка указывает на тот же объект, на который указывает исходная ссылка.
Теперь предположим, что мы управляем объектами класса Точка вместо TreeView со свойствами x и y .
class Point {
public int X { get; set; }
public int Y { get; set; }
}
Вы можете легко создать точку:
Point p1 = new Point { X = 5, Y = 7 };
Но это не копирует это:
Point p2 = p1;
Это будет делать:
Point p2 = new Point { X = p1.X, Y = p1.Y };
Теперь исходная проблема заключалась в том, что вы хотели передать несколько столбцов в функцию Export () . В этом случае вам нужно только передать вектор отфильтрованных столбцов в функцию экспорта вместо копии TreeView .
void PrepareExporting()
{
var columns = new List<TreeViewColumn>();
foreach(TreeViewColumn col in this.treeView.Columns) {
if ( this.Filter( col ) ) {
columns.add( col );
}
}
this.Export( columns.ToArray() );
}
void Export(TreeViewColumn[] columns)
{
// ...
}
Я думаю, что это будет проще, поскольку не нужно пытаться выполнить передачу по ссылке (невозможно) или скопировать древовидное представление.
Надеюсь, это поможет.