我现在正在解决这个问题几个小时,而且我没有接近解决方案。
问题是:我的母版页上的UpdatePanel
很少。然后,我在页面上有RadTreeView
控件,每次点击节点时都会导致部分回发。那里的一切都很好。
由于我在其他一些页面上使用相同的树,因此我将此功能移至UserControl
。我以前做过的东西,所以没问题。将一些代码移到ascx
,创建了一些事件。一切都很适合我。但不是现在。
RadTreeView
嵌套在UserControl
内,此控件在主页面上有更新面板,见下文:
<asp:Panel ID="pnlContentWrapper" runat="server" CssClass="ContentWrapper">
<div id="HeaderBreadCrumb">
<asp:ContentPlaceHolder ID="HeaderBreadCrumbContent" runat="server" />
</div>
<div id="HeaderMenu">
<asp:UpdatePanel ID="upnlTreeMenu" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="HeaderMenuContent" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="treeProductTree" />
</Triggers>
</asp:UpdatePanel>
</div>
<div id="TreeDiv">
<fp:ProductTree ID="treeProductTree" runat="server" />
</div>
<asp:Panel ID="ContentDiv" ClientIDMode="Static" runat="server">
<asp:UpdatePanel ID="upnlTreeContent" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="TreePageContent" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="treeProductTree" />
</Triggers>
</asp:UpdatePanel>
</asp:Panel>
</asp:Panel>
用户控件非常简单:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="ProductTree.ascx.vb"
Inherits="ProductTree" %>
<div>
<telerik:RadTreeView ID="treeProductTree" ClientIDMode="Static" runat="server" EnableDragAndDrop="false"
SkinID="CustomSkin" CssClass="MasterProductTree" DataFieldID="NodeId" DataFieldParentID="NodeParentId"
DataTextField="NodeName" DataValueField="NodeId" />
</div>
还有一些代码:
导入Telerik.Web.UI
Public Class ProductTree
Inherits System.Web.UI.UserControl
Public Event NodeExpand As EventHandler(Of ProductTreeNodeExpandEventArgs)
Public Event SelectedNodeChange As EventHandler
Protected Sub ProductTree_NodeExpand(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs) _
Handles treeProductTree.NodeExpand
Dim nodeId As Integer = CInt(e.Node.Value)
Dim evetArgs = New ProductTreeNodeExpandEventArgs(nodeId)
RaiseEvent NodeExpand(Me, evetArgs)
//'some logic
End Sub
Protected Sub ProductTree_OnNodeClick(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs) _
Handles treeProductTree.NodeClick
RaiseEvent SelectedNodeChange(Me, New System.EventArgs())
End Sub
End Class
我不知道的是:为什么这会导致完全回发而不是部分?我怀疑这可能与提升我的SelectedNodeChange
有关,但我不知道如何以其他方式处理它。我需要让其他组件知道,节点选择已更改。如何改进它以使其与UpdatePanel
s一起使用?
答案 0 :(得分:1)
怀疑将UserControl
注册为AsyncPostbackTrigger
并不会让你走得太远。 UC本身不是一个回发控件,而是包含一个。我将树控件公开为usercontrol的公共属性,然后在包含页面的代码后面,将树控件本身注册为触发器,而不是UserControl
。
检查this是否有类似情况......这不是一个很好的Q&amp; A线程,但它显示了基本要点。
答案 1 :(得分:1)
嗯,我有类似的情况,但它有点复杂。
实际上会根据请求参数值动态添加导致回发的用户控件。
我很高兴添加了ClietIDMode参数,我不认为微软会忽视像tat这样的问题。
答案 2 :(得分:1)
我现在面临的同样问题......我可以通过使用iFrame包装UC来解决这个问题。