2011-03-24 91 views
0

我现在正在为此问题争取几个小时,而且我没有接近解决方案。我的主页上有几个UpdatePanel s。然后,我在页面上有RadTreeView控件,每次点击节点时都会导致部分回发。一切工作正常。UserControl在UpdatePanel中导致完全回发

由于我在其他一些页面上使用了相同的树,我将此功能移至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一起使用?

回答

1

怀疑注册UserControl作为AsyncPostbackTrigger是不会让你很远。统一通信本身不是回传控制,而是包含一个。我会将树控件作为usercontrol的公共属性公开,然后在包含页面的代​​码中将树控件本身注册为触发器,而不是UserControl

检查this有类似的情况...这不是一个很好的Q &一个线程,但它显示了基本的要点。

+0

非常感谢!我知道我错过了一些东西,但是这对我有所帮助,一切都如现在这样运作。 – Pako 2011-03-24 19:46:47

+0

当然......另一个选择是在UserControl中实现'IPostBackEventHandler'接口,然后冒泡事件。如果你想保持清洁,就不能确切地知道我头顶上的细节,但没有理由不能这样做。 – 2011-03-24 19:49:00

1

那么,我有类似的情况,但它有点复杂。

根据请求参数值实际添加引起回发的用户控件。

我很高兴ClietIDMode参数被添加了,我没有想到像tat这样的问题会被微软忽略。

1

我现在正面临同样的问题......我可以通过用iFrame封装UC来解决这个问题。

相关问题