请问如何在ASP。NET中定义一个全局变量?

crackzzy 2003-05-23 09:05:06
我在一个DataGrid里需要重复用到一组数据。所以我想在Page_Load里写一个函数,把从数据库取来的数据先写到一个public的Hashtable里。但是我写进去的东西只有在Page_Load里能读。到了别的函数里就读不出来了。 不知道是什么原因。我以前也做过一个类似的东西。但是当时是好读的,这次却不行。怪哉~~
<script language="c#" runat="server">
public Hashtable htUser;
void Page_Load()
{
if(!IsPostBack)
{

htUser=GetUserName();
}
}

Hashtable GetUserName()
{
SqlConnection conn=new SqlConnection(ConfigurationSettings.AppSettings["strConn"]);
SqlCommand sc=new SqlCommand("SELECT id,truename FROM users WHERE id IN(SELECT id FROM permit WHERE xzxxhf=1)",conn);
SqlDataReader sdr;
Hashtable htUser=new Hashtable();
conn.Open();
sdr=sc.ExecuteReader();
while(sdr.Read())
{
htUser.Add(sdr["id"].ToString(),sdr["truename"].ToString());
}
sdr.Close();
conn.Close();
return(htUser);
}

string GetUser(string id)
{
return(Convert.ToString(htUser[id]));
}

我在DataGrid里最后一列绑定数据的时候要用到
<asp:TemplateColumn
HeaderText="已经转给"
HeaderStyle-Width="50"
ItemStyle-Width="50">
<ItemTemplate>
<%#GetUser(Convert.ToString(DataBinder.Eval(Container.DataItem,"towho")))%>
</ItemTemplate>
</asp:TemplateColumn>
可是总是出现这样的错误提示:
System.NullReferenceException: 未将对象引用设置到对象的实例。
也就是说我的htUser在GetUser函数里没有被保存状态
但是我在Page_Load里的(!IsPostBack)里的确已经给htUser赋值了。
怪事,请知道原因的高手一定要帮忙~~
...全文
161 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
crackzzy 2003-05-23
  • 打赏
  • 举报
回复
同志们啊~~~~~谁帮我去买块豆腐,我要自杀~~~~~~~~
dgList.DataSource=CreateView(BuildSql());
dgList.DataBind();
htUser=GetUserName();
我居然把绑定的代码写到了DataGrid绑定代码的后面,DataGrid先绑定要用到GetUserName,但是这个时候htUser还没被初始化呢,当然会引起这个错误了。
我真狂晕~~~~~
crackzzy 2003-05-23
  • 打赏
  • 举报
回复
这里我可能要更正一个错误:
我刚刚测试过了,就算是只定义成public而没有加上static的话,就算引起了回传,状态还是保存的。我在原来可以实现的文件的Page_Load的!IsPostBack里也定义了一个Hashtable,而且我做了个按纽引起回传后,Hashtable的状态仍然保留。
cmsoft 2003-05-23
  • 打赏
  • 举报
回复
把 htUser=GetUserName();
放到if(!IsPostBack)外
crackzzy 2003-05-23
  • 打赏
  • 举报
回复
to xnice(小土豆)
呵呵~你的方法对付简单的文本还可以。
不过我这里要用到Hashtable。如果也保存在隐藏标签里的话就有点不合适了。~~~
crackzzy 2003-05-23
  • 打赏
  • 举报
回复
还有就是就算定义成了public static Hashtable htUser;
还是没用。还是提示错误。真晕~~~~~
xnice 2003-05-23
  • 打赏
  • 举报
回复
我以前也遇到过这个问题,想不出来,就弄了个隐藏的Label,给它赋值,然后每次提交都会给保留下来。你要是变量不多的话也可以试试
crackzzy 2003-05-23
  • 打赏
  • 举报
回复
可是现在问题是我第一次访问的时候也提示没有把引用设置到对象的事例啊,也就是说就算我第一次访问页面执行了,!IsPostBack里面的东西。在DataGrid绑定事件中调用到htUser也会出错。
dongchuanlu 2003-05-23
  • 打赏
  • 举报
回复
public static Hashtable htUser;
就是所有的用户访问都是这个查询结果了!
timmy3310 2003-05-23
  • 打赏
  • 举报
回复
if(!IsPostBack)
{

htUser=GetUserName();
}

你只在第一次近来的时候初始化了,第二次提交的时候没有初始化,所以出错

Web页面每次刷新都是重新构造的,所有的成员都需要重写构造,你的控件是由ASP.Net页面框架从ViewState中获取上次的状态之后重新创建的,所以可以保持状态,但是你自己的这个Hashtable只在第一次初始化,所以第二次进来就是空的,改成:

void Page_Load()
{
htUser=GetUserName();
}
dongchuanlu 2003-05-23
  • 打赏
  • 举报
回复
htUser=GetUserName();
放到if(!IsPostBack)外面呢?
freeboy0002 2003-05-23
  • 打赏
  • 举报
回复
声明成静态的即可

public static Hashtable htUser;

yohomonkey 2003-05-23
  • 打赏
  • 举报
回复
public
定义的变量在postback后会从新置空。你是否触发了事件。
孟子E章 2003-05-23
  • 打赏
  • 举报
回复
可以放到web.config里或者application里
暗石绿 2003-05-23
  • 打赏
  • 举报
回复
public static Hashtable htUser;
zjjszw 2003-05-23
  • 打赏
  • 举报
回复
期待....

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧