Почему мой узел asp: TreeView сбрасывается, когда он находится в панели обновления? - PullRequest
3 голосов
/ 15 октября 2008

У меня есть страница 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;
   }

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

Ответы [ 4 ]

4 голосов
/ 20 октября 2008

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

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

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

  • Элементы управления TreeView и Menu.
  • ...
0 голосов
/ 07 июля 2009

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

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

0 голосов
/ 15 октября 2008

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

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.

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

0 голосов
/ 15 октября 2008

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

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

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