读书人

Session有关问题又来了点树有时不更

发布时间: 2012-04-16 16:20:04 作者: rapoo

Session问题又来了,点树有时不更新Session["data"]
这个问题只涉及到下面唯一的一个简单的页面,C#代码和aspx代码全给出,为了说明问题,先画出我的树

学校各部门
L__教务处
L__德育处
L__后勤
L__工会
学年
L__高一
L__高二
L__高三

我每次一点树的结点会执行
Session["data"] = TreeView1.SelectedNode.ValuePath.ToString();
这时我再点树下方的一个按钮执行:
String data = Session["data"] as String;
Response.Write(data);
会正常显示出刚刚赋值的Session["data"]

如果我点“高一”后点按钮会显示“学年/高一”,
再点“高二”后点按钮会显示“学年/高二”,
这时再点“高一”后点按钮却不会显示“学年/高一”,而仍然是“学年/高二”
如果这时再点“高三”后点按钮,会显示“学年/高三”
总结一下就是,好像点过的按钮再点的话,不会更新Session["data"],只有点了没点过的,才会改变它

如何改正以上毛病让我能正常点“点过的按钮并赋给Session["data"]”?

C#代码部分:
略去using
public partial class a_a : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
Session["data"] = TreeView1.SelectedNode.ValuePath.ToString();
}
protected void Button2_Click(object sender, EventArgs e)
{
String data = Session["data"] as String;
Response.Write(data);
}
}

网页代码部分:(您可能不需要看,里面就是一个树,我上面画了,和一个按钮)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Tree.aspx.cs" Inherits="a_a" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
<style type="text/css">

.tree td div
{
height: 20px !important;
}
*
{
padding: 0;
margin: 0;
border: 0;
}
</style>
</head>

<body>
<form id="form1" runat="server">
<asp:TreeView ID="TreeView1" runat="server" LineImagesFolder="TreeLineImages"
ShowLines="True" ImageSet="Simple"
onselectednodechanged="TreeView1_SelectedNodeChanged" CssClass="tree"
Target="ContentFrame">
<ParentNodeStyle Font-Bold="False" />
<HoverNodeStyle Font-Underline="True" ForeColor="#5555DD" />
<SelectedNodeStyle Font-Underline="True" ForeColor="#5555DD"
HorizontalPadding="0px" VerticalPadding="0px" />
<Nodes>
<asp:TreeNode Text="学校各部门" Value="学校各部门">
<asp:TreeNode Text="教务处" Value="教务处"></asp:TreeNode>
<asp:TreeNode Text="德育处" Value="德育处"></asp:TreeNode>
<asp:TreeNode Text="后勤" Value="后勤"></asp:TreeNode>
<asp:TreeNode Text="工会" Value="工会"></asp:TreeNode>
</asp:TreeNode>
<asp:TreeNode Text="学年" Value="学年">
<asp:TreeNode Text="高一" Value="高一"></asp:TreeNode>
<asp:TreeNode Text="高二" Value="高二"></asp:TreeNode>
<asp:TreeNode Text="高三" Value="高三"></asp:TreeNode>
</asp:TreeNode>


</Nodes>
<NodeStyle Font-Names="Tahoma" ForeColor="Black"
HorizontalPadding="0px" NodeSpacing="0px" VerticalPadding="0px" />
</asp:TreeView>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<p>
<a href="HTMLPage.htm">HTMLPage.htm</a></p>
<asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button" />
</form>
</body>
</html>

[解决办法]
应该不会出现你的说的现象啊,只要执行力TreeView1_SelectedNodeChanged就应当是改变了值
你的测试是在VS里面还是iis里面?
[解决办法]
你可以
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
Session["data"] = TreeView1.SelectedNode.ValuePath.ToString();
Response.Write("<h1 style='color:red'>执行了:" + Session["data"].ToString() + " ,点击按钮将显示 “" + Session["data"].ToString() + "”</h1>");
}

protected void Button2_Click(object sender, EventArgs e)
{
String data = Session["data"] as String;
Response.Write(data);
}
测试,看看红色的内容和点击的内容是否一致,

[解决办法]
其实,使用Session保存内容不是很好,Session容易丢失数据,你可以改成 HiddenField
Session适合跨页面保存。


<asp:HiddenField ID="HiddenField1" runat="server" />
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="测试" />


protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
HiddenField1.Value = TreeView1.SelectedNode.ValuePath;
}

protected void Button2_Click(object sender, EventArgs e)
{
String data = HiddenField1.Value;
Response.Write(data);
}
[解决办法]
hiddenField可以提交到另外的页面的,但仅限于form提交的方法
[解决办法]
你要是做练习,可以先这样,如果是做项目。做之前一定要选择好传值方法,否则,以后可能会出问题并需要重新改写代码的。
关于状态,你参考 ASP.NET 状态管理概述
http://msdn.microsoft.com/zh-cn/library/75x4ha6s.aspx
系列介绍教程

读书人网 >asp.net

热点推荐