C # Treeview состояние расширено - PullRequest
0 голосов
/ 05 февраля 2009

У меня есть вид дерева на моей главной странице. Когда страница контента загружена, я хочу сохранить состояние древовидной структуры (какие узлы свернуты / развернуты). Я храню узлы в ArrayList. Код:

private void SaveTreeviewState(TreeNodeCollection nodes)
{
    foreach (TreeNode t in nodes)
    {
        // Store expandable state in ArrayList (true or false)
        //NodePaths.Add(t.Expanded);
        NodePaths.Add(t);

        // Check for childnods
        if (t.ChildNodes.Count > 0)
            // recall this method
            SaveTreeviewState(t.ChildNodes);

    }
}

Этот метод вызывается событием unload объекта treeview:

protected void tvManual_Unload(object sender, EventArgs e)
{
    SaveTreeviewState(tvManual.Nodes);

    // Clear session
    Session["Treeview"] = null;

    // Add arraylistm to session
    Session["Treeview"] = NodePaths;

}

В событии загрузки главной страницы я проверяю, установлен ли мой сеанс. Когда сессия установлена, я вызываю метод, который читает сессию.

Массив в сеансе содержит все мои узлы, так что это правильно. Тем не менее, все узлы имеют израсходованное свойство равным false. Это не правильно, потому что я расширил узлы mupliple.

Надеюсь, вы, ребята, понимаете мою проблему и можете мне помочь.

Спасибо за продвинутый

1 Ответ

1 голос
/ 05 февраля 2009

Поскольку сохраненный список на самом деле является списком объектов (объектов TreeNode), вы фактически храните ссылки на объекты. Я предполагаю, что в tvManual_Unload расширенное состояние меняется или что-то подобное. Возможно, вы используете сеанс inprocess, который похож на ссылку на объекты (нет сериализации), поэтому любые изменения свойств объекта также видны для объектов, хранящихся в сессии.

Вы можете избежать такого побочного эффекта, сохраняя значения в сеансе. Например, сохраните Dictionary , где ключ будет содержать путь к узлу, а значение будет содержать расширенное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...