在您的 Page_Init 中添加控件,而不是在您的 Page_Load 中。 [1]
此外,您没有按照应有的方式执行此操作。考虑这段代码
//your collection of objects goes here. It might be something different than
//this, but basically a Dictionary<int, YourType> goes fine
public Dictionary<Int32, string> Ids
{
get { return (ViewState["ids"] ?? new Dictionary<Int32, string>()) as Dictionary<Int32, string>; }
set { ViewState["ids"] = new Dictionary<Int32, string>(); }
}
protected void Page_Init(object sender, EventArgs e)
{
//load the data using your DAO
Ids = new Dictionary<int, string>();
Ids.Add(1, "http://www.huddletogether.com/projects/lightbox2/images/image-2.jpg");
Ids.Add(2, "http://helios.gsfc.nasa.gov/image_euv_press.jpg");
foreach (var item in Ids)
{
ImageButton imb = new ImageButton()
{
ImageUrl = item.Value,
CommandArgument = item.Key.ToString(),
CommandName = "open"
};
imb.Click += new ImageClickEventHandler(imb_Click);
PH1.Controls.Add(imb);
}
}
void imb_Click(object sender, ImageClickEventArgs e)
{
Response.Write("You purchased " + Ids[int.Parse(((ImageButton)sender).CommandArgument)]);
}
[1](上周我回答的其他问题中的 CTRL+C/CTRL+V):
在页面周期之间必须维护的所有内容都应在 Page_Init 中声明,而不是在 Page_Load 中声明。
所有初始化,如添加事件处理程序和添加控件都应该在初始化期间添加,因为状态会在页面周期之间保存。控件内容和视图状态的处理,应在Load 中完成。
还要检查http://msdn.microsoft.com/en-us/library/ms178472.aspx。
初始化
在所有控件已初始化且任何皮肤后引发
已应用设置。用这个
读取或初始化控件的事件
属性。
.
加载
Page 调用 OnLoad 事件方法
在页面上,然后递归地执行
每个子控件都相同,其中
对每个孩子做同样的事情
控制直到页面和所有
控件已加载。
使用 OnLoad 事件方法设置
控件中的属性并建立
数据库连接。