updatePanel에있을 때 ASP : TreeView Selected Node Reset이있는 이유는 무엇입니까?
-
03-07-2019 - |
문제
2가 포함 된 ASP.NET 2.0 페이지가 있습니다 UpdatePanels
.
첫 번째 패널에는 a가 포함되어 있습니다 TreeView
컨트롤, 세 뷰에서 노드를 선택하면 제어 컨트롤이 두 번째 업데이트를 트리거합니다. UpdatePanel
뿐. 이 많은 것이 올바르게 행동하고 있습니다.
업데이트 패널 (이전/Next) 외부 페이지에 두 개의 버튼이 있습니다. 이 버튼은 두 패널의 업데이트를 트리거합니다. 버튼의 동작은 트리의 인접한 노드를 선택하는 것입니다. 이 버튼 중 하나를 처음 클릭하면 예상 동작이 나타나고 인접한 노드가 선택되고 두 패널 이이 변경 사항을 반영하도록 업데이트됩니다.
이 버튼을 다시 클릭하면 문제가 발생합니다. 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;
}
나무의 뷰 스테이트가 저장되지 않은 것 같습니까?
해결책
에서 UpdatePanel Control 개요 [ASP.NET
UpdatePanel 컨트롤과 호환되지 않는 컨트롤
다음 ASP.NET 컨트롤은 부분 페이지 업데이트와 호환되지 않으므로 UpdatePanel 컨트롤 내부에서 지원되지 않습니다.
- TreeView 및 메뉴 컨트롤.
- ...
다른 팁
나는 당신이 숨겨진 입력 __viewstate를 업데이트하지 않는 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 () 내부에로드 할 수 없습니다. 그래서 나는 예압으로한다.
내가 이것을해야한다는 것은 잘못된 느낌입니다. 내가 뭔가를 놓치고 있습니까?
나는 거의 비슷한 문제에 직면하고 있습니다. CheckedNodes 컬렉션을 잃습니다. 나는 같은 기술이 내 문제를 해결할 것이라고 의심합니다. 아이디어가 있습니까?
업데이트 :이 문제를 크게 해결하고 일부 해결 방법을 사용했습니다. 자세한 내용을 참조하십시오. Inside UpdatePanel Issue 내부의 TreeView -Node의 확인란 확인 및 선택 취소중인 Postbacks 그리고 Ajax UpdatePanel 내부에서 TreeView를 사용합니다