Dictionary<string, string> propertyCompany = new Dictionary<string, string>();//gloabal variable
protected void Page_Load(object sender, EventArgs e)
{
if(!isPostBack){
propertyCompany .add("a","1");
propertyCompany .add("b","2");
propertyCompany .add("c","3");
}
}
protected void btnGetProperty_Click(object sender, EventArgs e)
{
string a=propertyCompany["a"];//error this key is not exist
//propertyCompany is null
}
定义propertyCompany
并填写form_load
时。在单击按钮propertyCompany
上为空!?
我使用static
但我不明白有时候说错误是空的。
答案 0 :(得分:4)
每个请求都会创建新的页面对象,因此您无法在第一个请求中创建的第二个请求(bnt click)字典中使用(加载而不回发)
删除回发测试以便快速修复。
其他修复可能性: *在viewstate中存储字典。
答案 1 :(得分:1)
继承Web.UI.Page
的类中定义的每个变量都将在Page-Lifecycle结束时销毁,因此如果不重新初始化,它将在Postback中null
。
将其保留在回发中的一种方法是将其存储在Session-variable。
中您可以在此处找到有关如何在回发中保留变量的所有选项的完整列表:http://msdn.microsoft.com/en-us/magazine/cc300437.aspx
HTTP-protocol的性质是无国籍。
答案 2 :(得分:1)
我很确定你的标题应该是“全局变量没有我想要的数据”。每次加载页面时都会构造 (回发或其他方式),但由于这一行:
if(!isPostBack) {
}
按钮点击时不会有你想要的数据。
为了通知点击页面,回复是,所以说!isPostBack
(我假设是通过Page.IsPostBack
在某处设置的)是还说“如果我没有点击按钮”,这当然不是你想要的。
为了获得你想要的功能,你应该将字典的数量移出if if块,否则就有了一个else条件,它也用你想要的数据填充它。
使用类变量的另一种方法是将数据存储在另一个位置。选项包括ViewState
,Session
,Application
(如果它确实是应用程序范围的数据),Cache
以及其他一些选项。目前还不清楚字典究竟在做什么,因此很难说哪个位置最合适。
答案 3 :(得分:0)
让字典在请求之间生效的一种方法是将其声明为静态,或者在前面建议的视图状态中声明。
答案 4 :(得分:0)
如何在按钮点击事件中访问propertyCompany中的项目?如果你这样做不正确,那更可能是问题。
答案 5 :(得分:-1)
试试这个
Dictionary<string, string> propertyCompany;//gloabal variable
protected void Page_Load(object sender, EventArgs e)
{
propertyCompany = new Dictionary<string, string>();
if(!isPostBack){
propertyCompany .add("a","1");
propertyCompany .add("b","2");
propertyCompany .add("c","3");
}
}
protected void btnGetProperty_Click(object sender,EventArgs e) { // propertyCompany为null }