无法触发 RADorgChart 中项目模板内按钮的点击事件
Not able to fire the click event for a button inside the Item template in RADorgChart
我在项目模板中有一个按钮,它在 RadOrgChart(telerik Control) 中可用。
<asp:UpdatePanel ID="uplDataHierarchy" runat="server" UpdateMode="Always">
<ContentTemplate>
<div id="divOrgChart" runat="server" style="width: 100%; height: 480px; overflow-y: auto">
<rad:RadOrgChart ID="radOrgChartHierarchy" runat="server" RenderMode="Lightweight" DisableDefaultImage="true" DataFieldID="ID" DataFieldParentID="PARENT_ID">
<ItemTemplate>
<rad:RadLabel runat="server" ID="RadLblName" Text='<%# Eval("NAME")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblPinCode" Text='<%# Eval("PINCODE")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblAdd" Text='<%# Eval("Address")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<asp:LinkButton ID="btnDetail" runat="server" CommandArgument='<%# Eval("ID") %>' Text="Get Detail" OnClick="btnDetail_Click" Font-Underline="false"></asp:LinkButton>
</ItemTemplate>
</rad:RadOrgChart>
<br></br>
</div>
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
当我在没有更新面板的情况下使用此 senerio 时,BtnDetail 的单击事件完美触发。
但是因为我在更新面板中有它,所以我无法触发按钮的点击事件。
我试过
- Link 按钮
- 按钮
- telerik 按钮
尝试在 aspx 中添加触发器,例如:
<asp:AsyncPostBackTrigger ControlID="btnDetail" EventName="btnDetail_Click" />
但这里抛出错误:找不到控件然后我从代码后面用 NodeBound 事件尝试了它:
Protected Sub radOrgChartDealHierarchy_NodeDataBound(sender As Object, e As Telerik.Web.UI.OrgChartNodeDataBoundEventArguments) Handles radOrgChartDealHierarchy.NodeDataBound
Dim lnkBtnDetail As LinkButton = e.Node.GroupItems(0).FindControl("btnDetail")
正在向面板注册事件
Dim aspT = New AsyncPostBackTrigger()
aspT.ControlID = lnkBtnDetail.ToString()
aspT.EventName = "Click"
uplDataHierarchy.Triggers.Add(aspT)
正在通过脚本管理器注册事件
Dim scrPtMgr As ScriptManager = ScriptManager.GetCurrent(Me.Page)
scrPtMgr.RegisterAsyncPostBackControl(lnkBtnDetail)
End Sub
我也尝试做一个 js 回发,即使在那里我也无法点击服务器端的点击事件。
等待响应。
试了4天终于找到解决方法了
由于 LinkButton 位于 ItemTemplate 内部,因此不会触发服务器端事件。
那么我们在这里可以做的事情如下:
首先,在 NodeDataBound 的点击事件上,我们需要将客户端事件添加到控件中:
Protected Sub radOrgChartDealHierarchy_NodeDataBound(sender As Object, e As Telerik.Web.UI.OrgChartNodeDataBoundEventArguments) Handles radOrgChartDealHierarchy.NodeDataBound
Dim lnkBtnDetail As LinkButton = e.Node.GroupItems(0).FindControl("btnDetail")
lnkBtnDetail.OnClientClick = "bindDetails(" & e.Node.ID.ToString() & ");"
End Sub
你还需要添加一个HiddenField来保持节点的ID
<asp:UpdatePanel ID="uplDataHierarchy" runat="server" UpdateMode="Always">
<ContentTemplate>
<div id="divOrgChart" runat="server" style="width: 100%; height: 480px; overflow-y: auto">
<asp:HiddenField ID="HdnFldSelectedILD_ID" runat="server" Value="0" />
<rad:RadOrgChart ID="radOrgChartHierarchy" runat="server" RenderMode="Lightweight" DisableDefaultImage="true" DataFieldID="ID" DataFieldParentID="PARENT_ID">
<ItemTemplate>
<rad:RadLabel runat="server" ID="RadLblName" Text='<%# Eval("NAME")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblPinCode" Text='<%# Eval("PINCODE")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblAdd" Text='<%# Eval("Address")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<asp:LinkButton ID="btnDetail" runat="server" CommandArgument='<%# Eval("ID") %>' Text="Get Detail" OnClick="btnDetail_Click" Font-Underline="false"></asp:LinkButton>
</ItemTemplate>
</rad:RadOrgChart>
<br></br>
</div>
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
然后你必须添加以下JS函数:
在这里您将获得您将设置为隐藏字段的节点的 ID,并将使用 theForm.submit();
返回 Post
function bindDetails(id) {
document.getElementById("<%=HdnFldSelectedILD_ID.ClientID%>").value = id;
theForm.submit();
}
现在在页面加载中检查隐藏字段的值,如果它不为 0,则按如下方式进行处理:
If HdnFldSelectedILD_ID.Value = 0 Then
Else
//Your custom logic where you can access server side Controls as well
LoadCustom(HdnFldSelectedILD_ID.Value)
End If
然后在 LoadCustom 中,您可以使用服务器端控件进行操作,例如:
Private Sub LoadFields(nID As Decimal)
RadLblName.Text="Test"
End Sub
我在项目模板中有一个按钮,它在 RadOrgChart(telerik Control) 中可用。
<asp:UpdatePanel ID="uplDataHierarchy" runat="server" UpdateMode="Always">
<ContentTemplate>
<div id="divOrgChart" runat="server" style="width: 100%; height: 480px; overflow-y: auto">
<rad:RadOrgChart ID="radOrgChartHierarchy" runat="server" RenderMode="Lightweight" DisableDefaultImage="true" DataFieldID="ID" DataFieldParentID="PARENT_ID">
<ItemTemplate>
<rad:RadLabel runat="server" ID="RadLblName" Text='<%# Eval("NAME")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblPinCode" Text='<%# Eval("PINCODE")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblAdd" Text='<%# Eval("Address")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<asp:LinkButton ID="btnDetail" runat="server" CommandArgument='<%# Eval("ID") %>' Text="Get Detail" OnClick="btnDetail_Click" Font-Underline="false"></asp:LinkButton>
</ItemTemplate>
</rad:RadOrgChart>
<br></br>
</div>
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
当我在没有更新面板的情况下使用此 senerio 时,BtnDetail 的单击事件完美触发。
但是因为我在更新面板中有它,所以我无法触发按钮的点击事件。
我试过
- Link 按钮
- 按钮
- telerik 按钮
尝试在 aspx 中添加触发器,例如:
<asp:AsyncPostBackTrigger ControlID="btnDetail" EventName="btnDetail_Click" />
但这里抛出错误:找不到控件然后我从代码后面用 NodeBound 事件尝试了它:
Protected Sub radOrgChartDealHierarchy_NodeDataBound(sender As Object, e As Telerik.Web.UI.OrgChartNodeDataBoundEventArguments) Handles radOrgChartDealHierarchy.NodeDataBound
Dim lnkBtnDetail As LinkButton = e.Node.GroupItems(0).FindControl("btnDetail")
正在向面板注册事件
Dim aspT = New AsyncPostBackTrigger()
aspT.ControlID = lnkBtnDetail.ToString()
aspT.EventName = "Click"
uplDataHierarchy.Triggers.Add(aspT)
正在通过脚本管理器注册事件
Dim scrPtMgr As ScriptManager = ScriptManager.GetCurrent(Me.Page)
scrPtMgr.RegisterAsyncPostBackControl(lnkBtnDetail)
End Sub
我也尝试做一个 js 回发,即使在那里我也无法点击服务器端的点击事件。
等待响应。
试了4天终于找到解决方法了
由于 LinkButton 位于 ItemTemplate 内部,因此不会触发服务器端事件。
那么我们在这里可以做的事情如下: 首先,在 NodeDataBound 的点击事件上,我们需要将客户端事件添加到控件中:
Protected Sub radOrgChartDealHierarchy_NodeDataBound(sender As Object, e As Telerik.Web.UI.OrgChartNodeDataBoundEventArguments) Handles radOrgChartDealHierarchy.NodeDataBound
Dim lnkBtnDetail As LinkButton = e.Node.GroupItems(0).FindControl("btnDetail")
lnkBtnDetail.OnClientClick = "bindDetails(" & e.Node.ID.ToString() & ");"
End Sub
你还需要添加一个HiddenField来保持节点的ID
<asp:UpdatePanel ID="uplDataHierarchy" runat="server" UpdateMode="Always">
<ContentTemplate>
<div id="divOrgChart" runat="server" style="width: 100%; height: 480px; overflow-y: auto">
<asp:HiddenField ID="HdnFldSelectedILD_ID" runat="server" Value="0" />
<rad:RadOrgChart ID="radOrgChartHierarchy" runat="server" RenderMode="Lightweight" DisableDefaultImage="true" DataFieldID="ID" DataFieldParentID="PARENT_ID">
<ItemTemplate>
<rad:RadLabel runat="server" ID="RadLblName" Text='<%# Eval("NAME")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblPinCode" Text='<%# Eval("PINCODE")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<rad:RadLabel runat="server" ID="RadLblAdd" Text='<%# Eval("Address")%>' CssClass="fa-align-center" Font-Size="X-Small"></rad:RadLabel>
<br />
<asp:LinkButton ID="btnDetail" runat="server" CommandArgument='<%# Eval("ID") %>' Text="Get Detail" OnClick="btnDetail_Click" Font-Underline="false"></asp:LinkButton>
</ItemTemplate>
</rad:RadOrgChart>
<br></br>
</div>
</ContentTemplate>
<Triggers>
</Triggers>
</asp:UpdatePanel>
然后你必须添加以下JS函数: 在这里您将获得您将设置为隐藏字段的节点的 ID,并将使用 theForm.submit();
返回 Post function bindDetails(id) {
document.getElementById("<%=HdnFldSelectedILD_ID.ClientID%>").value = id;
theForm.submit();
}
现在在页面加载中检查隐藏字段的值,如果它不为 0,则按如下方式进行处理:
If HdnFldSelectedILD_ID.Value = 0 Then
Else
//Your custom logic where you can access server side Controls as well
LoadCustom(HdnFldSelectedILD_ID.Value)
End If
然后在 LoadCustom 中,您可以使用服务器端控件进行操作,例如:
Private Sub LoadFields(nID As Decimal)
RadLblName.Text="Test"
End Sub