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

StackOverflow https://stackoverflow.com/questions/205114

Вопрос

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

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

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

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

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

Разметка

 <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;
   }

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

Это было полезно?

Решение

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

Элементы управления, несовместимые с элементами управления UpdatePanel

Следующие элементы управления ASP.NET несовместимы с частичными обновлениями страниц и, следовательно, не поддерживаются внутри элемента управления UpdatePanel:

  • Элементы управления в виде дерева и меню.
  • ...

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

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

У меня происходит то же самое с моими панелями обновления, когда пользователь переходит обратно на страницы формы заявки на моем веб-сайте.Обычные входные данные обновили 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(), потому что в дереве нет никаких узлов в этой точке.Поэтому я делаю это с предварительной загрузкой.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top