在 menu 和 treeview 中,如果为 NavigateUrl 赋了值,则执行时先执行 NavigateUrl ,而 Menu_MenuItemClick 和 TreeView1_SelectedNodeChanged 不会触发;若要触发 Menu_MenuItemClick 和 TreeView1_SelectedNodeChanged,则必须放弃对 NavigateUrl 属性的使用,注意:将 NavigateUrl 设置为空置也不行,必须设置Node.SelectAction = TreeNodeSelectAction.None.
但是如何同时实现Node的点击和超链接效果呢?仍然设置Node. NavigateUrl = “xxxxx.aspx”实现超链接效果。困难在于寻找SelectedNodeChanged事件失效的替代方案。基本思路:利用JavaScript设置Node的OnClick事件SetNodeClick(),在事件中把需要的参数对隐藏控件进行赋值并激活服务器端Button控件,使服务器相应Button的点击事件并处理。
1.在.aspx页面根据需要添加服务端TextBox控件用于接收需要的参数。添加一个服务器端Button控件并添加Button_OnClick()事件进行处理。
<div style="display: none;">
<asp:ScriptManager runat="server" ID="ScriptManager1">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:TextBox ID="txtProgId" runat="server"></asp:TextBox>
<asp:TextBox ID="txtProgName" runat="server"></asp:TextBox>
<asp:Button ID="btnSetMenuModel" runat="server" Text="设置菜单模组" OnClick="btnSetMenuModel_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</div>
技巧:把Button放在UpdatePanel中实现局部刷新避免了这个树因为回发引起的闪动
2.设置Node属性
node.NavigateUrl = drv["url"].ToString();//指定节点的超链接
node.Target = "MainFrame";//指定链接的显示位置
//设置Node的客户端点击事件
node.Text = "<span οnclick=SetNodeClick ('" + drv["progid"].ToString() + "','" + drv["progname"].ToString() + "')>" + drv["progname"].ToString() + "</span>";
3.对隐藏TextBox控件进行赋值并激发Button的Click事件
<script type="text/javascript" language="javascript">
function SetNodeClick(progid,progname)
{
document.getElementById("txtProgId").value = progid;
document.getElementById("txtProgName").value = progname;
document.getElementById("btnSetMenuModel").click();
return false;
}
</script>