日期:2014-05-18  浏览次数:20521 次

TreeView:NavigateUrl和Session["data"]势不两立
下面的代码,如果注释掉红色的行,兰色的行就有效
如果不注释掉红色的行,兰色的就失效(不显示Session["data"])

红色作用,给树的每个结果初始化上NavigateUrl,以便让我一点结果就到对应网页
兰色作用,上面的保存所点结点的Valuepath于Session["data"],下面的显示出Session["data"]值,我的Session["data"]用于在本页和其它页引用,为简化,帖出的代码是在本页引用

红兰的两功能我想同时要,但是他们却不想共存
问:如何让他们共存?改动越少越好。


public partial class a_a : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
  GetAllNodeText(TreeView1.Nodes);  
  }
  protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
  {
  Session["data"] = TreeView1.SelectedNode.ValuePath.ToString();
  }
  void GetAllNodeText(TreeNodeCollection tnc)
  {
  foreach (TreeNode node in tnc)
  {
  if (node.ChildNodes.Count != 0)
  GetAllNodeText(node.ChildNodes);
  Response.Write(node.Text + " ");
  node.NavigateUrl = "TopicList.aspx?Department=" + node.ValuePath;
  }
  }
  protected void Button1_Click1(object sender, EventArgs e)
  {
  String data = Session["data"] as String;
  Response.Write(data);
  }
}


------解决方案--------------------
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
GetAllNodeText(TreeView1.Nodes);
}
}
------解决方案--------------------
仅在用户单击节点时的回发中才激发 SelectedNodeChanged 事件。
你使用NavigateUrl,点击就转到NavigateUrl的地址了,是不会触发 SelectedNodeChanged 事件d 
你传参数,添加到NavigateUrl后面就可以了

参见
http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.treenode.navigateurl.aspx
里面的备注部分
------解决方案--------------------
你可以去掉NavigateUrl

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
Session["data"] = TreeView1.SelectedNode.ValuePath;
Response.Redirect("~/TopicList.aspx?Department=" + Server.UrlEncode( TreeView1.SelectedNode.ValuePath));
}
------解决方案--------------------
那你可以改成
C# code
Page.ClientScript.RegisterStartupScript(Page.GetType(),"js","window.top.frames['Contentframe'].location.href='" + Page.ResolveUrl("~/") + "TopicList.aspx?Department=" + Server.UrlEncode( TreeView1.SelectedNode.ValuePath)+ "'",true);