Почему мой выбранный узел asp: TreeView сбрасывается в UpdatePanel?

У меня есть страница asp.net 2.0, содержащая 2 UpdatePanels.

Первая панель содержит элемент управления TreeView, когда я выбираю узел в элементе управления тремя представлениями, он запускает обновление только второго UpdatePanel. Это все ведет себя правильно.

На странице за пределами панели обновлений есть две кнопки (предыдущая / следующая). Эти кнопки вызывают обновление обеих панелей. Поведение кнопок заключается в выборе соседнего узла в дереве. В первый раз, когда я нажимаю одну из этих кнопок, я получаю ожидаемое поведение, при этом выбирается соседний узел, и обе панели обновляются, чтобы отразить это изменение.

Проблема возникает, когда я снова нажимаю любую из этих кнопок. Выбранный узел древовидной структуры, кажется, запоминает ранее выбранный узел, и кнопки действуют на этот узел. Таким образом, поведение кнопок «предыдущий / следующий» состоит в том, чтобы ничего не делать или переходить на два назад.

Редактировать - Пример кода, демонстрирующий мою проблему

Разметка

 <asp:UpdatePanel ID = "myTreeViewPanel" runat = "server">
    <ContentTemplate>
       <asp:TreeView runat = "server" ID = "myTreeView" OnSelectedNodeChanged = "myTreeView_SelectedNodeChanged">
          <SelectedNodeStyle BackColor = "#FF8000" />
       </asp:TreeView>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID = "myButton" EventName = "Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:UpdatePanel ID = "myLabelPanel" runat = "server">
    <ContentTemplate>
       <asp:Label runat = "server" ID = "myLabel" Text = "myLabel"></asp:Label>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID = "myTreeView" EventName = "SelectedNodeChanged" />
       <asp:AsyncPostBackTrigger ControlID = "myButton" EventName = "Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:Button runat = "server" ID = "myButton" Text = "myButton" OnClick = "myButton_Click" />

Код позади

   protected void Page_Load ( object sender, EventArgs e )
   {
      if ( !IsPostBack )
      {
         myTreeView.Nodes.Add( new TreeNode( "Test 1", "Test One" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 2", "Test two" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 3", "Test three" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 4", "Test four" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 5", "Test five" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 6", "Test size" ) );
      }
   }
   protected void myTreeView_SelectedNodeChanged ( object sender, EventArgs e )
   {
      UpdateLabel( );
   }
   protected void myButton_Click ( object sender, EventArgs e )
   {
      // here we just select the next node in the three
      int index = myTreeView.Nodes.IndexOf( myTreeView.SelectedNode );
      myTreeView.Nodes[ index + 1 ].Select( );
      UpdateLabel( );
   }
   private void UpdateLabel ( )
   {
      myLabel.Text = myTreeView.SelectedNode.Value;
   }

Это похоже на то, что состояние просмотра дерева не сохраняется?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
10 130
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я думаю, вы правы насчет частичной обратной передачи страницы AJAX, что он не обновляет скрытый ввод __ViewState.

У меня то же самое с панелями обновлений, когда пользователь возвращается на страницы в форме приложения на моем веб-сайте. Обычные входные данные обновили состояние просмотра, поэтому их значения повторно заполняются, но состояние элементов управления, которые были обновлены с помощью AJAX, не записывается, и поэтому они возвращаются к состоянию по умолчанию.

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

protected override object SaveViewState()
{
   ViewState["SelectedNodePath"] = myTreeView.SelectedNode.ValuePath;
   return base.SaveViewState();
}

protected void Page_PreLoad(object sender, EventArgs e)
{
   if (ViewState["SelectedNodePath"] != null)
   {
      TreeNode node = myTreeView.FindNode(ViewState["SelectedNodePath"].ToString());
      if (node != null)
         node.Select();
   }
}

Я не могу загрузить выбранный узел внутри LoadViewState (), потому что в этой точке у дерева нет узлов. Так что я делаю это в PreLoad.

Мне просто кажется неправильным, что я должен это делать. Я что-то упускаю?

Ответ принят как подходящий

От Обзор элемента управления UpdatePanel [asp.net]

Controls that Are Not Compatible with UpdatePanel Controls

The following ASP.NET controls are not compatible with partial-page updates, and are therefore not supported inside an UpdatePanel control:

  • TreeView and Menu controls.
  • ...

Обновление: я решил проблему в значительной степени и использовал некоторые обходные пути. Подробности смотрите в моем сообщении.

Kangkan 31.12.2010 16:00

Я столкнулся с почти аналогичной проблемой. Я теряю коллекцию CheckedNodes. Я сомневаюсь, что тот же метод решит мои проблемы. Любая идея?

Обновление: я решил проблему в значительной степени и использовал некоторые обходные пути. Подробности здесь: TreeView внутри UpdatePanel проблема - обратная передача при проверке и снятии флажка узла и Использование TreeView внутри AJAX UpdatePanel.

Другие вопросы по теме