У меня есть страница 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;
}
Это похоже на то, что состояние просмотра дерева не сохраняется?





Я думаю, вы правы насчет частичной обратной передачи страницы 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.
- ...
Я столкнулся с почти аналогичной проблемой. Я теряю коллекцию CheckedNodes. Я сомневаюсь, что тот же метод решит мои проблемы. Любая идея?
Обновление: я решил проблему в значительной степени и использовал некоторые обходные пути. Подробности здесь: TreeView внутри UpdatePanel проблема - обратная передача при проверке и снятии флажка узла и Использование TreeView внутри AJAX UpdatePanel.
Обновление: я решил проблему в значительной степени и использовал некоторые обходные пути. Подробности смотрите в моем сообщении.