Как я могу предотвратить разрушение моего дерева? - PullRequest
3 голосов
/ 16 марта 2009

Я использую ASP.NET с C # 2.0 и Visual Studio 2005. Я использую главную страницу и страницы с контентом. У меня есть древовидное меню на главной странице, и когда пользователь выбирает любой элемент меню, я перенаправляю на эту страницу содержимого.

Моя проблема в том, что после перехода пользователя на страницу контента все триоды обновляются и структура сворачивается. Я хочу, чтобы выбранный триод оставался расширенным.

Кто-нибудь может мне помочь?

Ответы [ 4 ]

17 голосов
/ 16 марта 2009

Когда вы обновляете древовидную структуру, вы хотите вызвать treeView1.ExpandAll ();

Также добавьте событие для BeforeCollapse и установите для свойства Cancel события значение true, чтобы пользователь не мог свернуть ваши триоды.

private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e)
{
    e.Cancel = true;
}

Надеюсь, это поможет.

-jeremy

2 голосов
/ 16 марта 2009

Это достаточно распространенная проблема, которая автоматически обрабатывается ASP.NET, если вы используете элемент управления SiteMapDataSource в качестве источника данных для TreeView. В этом случае вы не упомянули источник данных вашего TreeView.

Вы также не упомянули, содержит ли TreeView ссылки (установлено свойство NavigateUrl) или элементы Text, которые отправляются после каждого клика. Если это первое, то, насколько я знаю, вам не повезло! Это связано с тем, что ни одно из событий Selection не вызывается для TreeNodes, для которых установлен NavigateUrl. Они просто функционируют как обычные гиперссылки.

Если, однако, это последний, то вы можете попробовать следующие шаги:

a. Обработка события SelectedNodeChanged TreeView. В этом обработчике событий получите текущее значение свойства SelectedNode.ValuePath и сохраните его в ViewState / Session. Используйте Value из SelectedNode для условного перенаправления страницы на URL-адрес, связанный с ней.

Что-то вроде следующего:

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
  TreeNode selNode = TreeView1.SelectedNode; 
  string pathToNode = selNode.ValuePath; 
  Session.Add("SelPath", pathToNode); 

  switch (selNode.Value) 
  { 
  //Redirect to URL accordingly. 
  } 
} 

b. При последующей загрузке главной страницы (страницы, на которую вы перенаправлены) получите значение ValuePath, установленное ранее, найдите ранее выбранный узел и Expand it.

Примерно так:

protected void Page_Load(object sender, EventArgs e) 
{ 
  if (Page.IsPostBack)
  { 
    string pathToNode = (string)Session("SelPath"); 
    Session.Remove("SelPath"); 
    TreeNode selNode = TreeView1.FindNode(pathToNode); 
    if (selNode != null) 
    { 
      selNode.Expand(); 
    } 
  } 
} 

Обратите внимание, что у меня не было возможности протестировать код, так что это в основном гипотетически.

0 голосов
/ 16 марта 2009

Даже если вы используете главную страницу, когда пользователь переходит на страницу содержимого, он отображается как новая / другая страница. Из-за главной страницы загружается одно и то же дерево, но не один и тот же экземпляр. Вам нужно будет хранить и загружать, какие узлы были расширены.

0 голосов
/ 16 марта 2009

Попробуйте использовать событие OnTreeNodeDataBound и свойство treeView.SelectedNode

Также, возможно, вы захотите проверить, как / когда вы привязываете TreeView к его DataSource. Возможно, вы привязываете его на IsPostBack, который будет перерисовывать дерево.

TreeView должен поддерживать свои узлы на PostBack.

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