我有一个类似下面的代码片段,我想在页面加载期间将图像按钮添加到我的asp:Panel中。但是当我运行页面时,事件已经发生了。我希望它在被点击时被触发。
提前感谢所有帮助
protected void Page_Load(object sender, EventArgs e)
{...
foreach (Gift g in bonusGifts)
{
ImageButton ib = new ImageButton();
ib.ImageUrl = g.GiftBanner;
ib.ID = g.GiftID.ToString();
ib.Click += Purchase(g);
BonusGiftPanel.Controls.Add(ib);
}
}
private ImageClickEventHandler Purchase(Gift g)
{
_giftRep.Purchase(g, _userSession.CurrentUser);
lblGifts.Text = "You have purcased " + g.GiftName + " for " + g.BonusPoints;
return null;
}
答案 0 :(得分:1)
在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事件方法进行设置 控制和建立的属性 数据库连接。
答案 1 :(得分:0)
您需要查看页面生命周期 - http://msdn.microsoft.com/en-us/library/ms178472.aspx
答案 2 :(得分:0)
您应该在Page Init事件中添加控件,正如其他人所说的那样。
您的图片点击事件处理程序不符合ImageButton Click事件处理程序签名。这应该是这样的:
private void ImageButton_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs)
{
}
请注意,您无法将“Gift”对象直接传递给ImageButton_Click。你必须找到另一种方法。