Почему мой выбранный узел asp: TreeView сбрасывается при нахождении в UpdatePanel?
-
03-07-2019 - |
Вопрос
У меня есть страница 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