缓存控件集合时,不会触发自定义控件事件
本文关键字:自定义控件 事件 控件 集合 缓存 | 更新日期: 2023-09-27 18:17:49
我有一个自定义控件"BedGrid",它包含一组自定义控件,每个控件都有一个单击处理程序。在Parent页面的Page_Load事件中,我生成了一个bedgrid集合,并将它们连接到一个事件处理程序。这一切都很好,当我在每个Page_Load上生成BedGrids…点击孙子,触发事件到BedGrid,它提醒我的父页面,一切按计划进行。
问题是,它太慢了。在每个Page_Load上生成所有这些自定义控件是没有意义的(特别是要访问后端)。因此,我想缓存BedGrids的集合,如下所示:protected void Page_Load(object sender, EventArgs e)
{
DrawBedGrids();
}
protected void DrawBedGrids()
{
if (CachedBedgrids == null)
{
CachedBedgrids = new List<BedGrid>();
//Hit DB here and generate list of buildings....
foreach (Building b in buildings)
{
BedGrid bg = new BedGrid(b);
bg.RaiseAlertParentPage += new EventHandler(BedGrid_Clicked);
CachedBedgrids.Add(bg);
}
}
else
{
foreach (BedGrid bg in CachedBedgrids)
{
somePanel.Controls.Add(bg);
}
}
}
protected List<BedGrid> CachedBedgrids
{
get
{
try { return (List<BedGrid>)Session["CachedBedgrids"]; }
catch { return null; }
}
set { Session["CachedBedgrids"] = value; }
}
一切都破裂了…事件从未发生……即使我加上
bg.RaiseAlertParentPage += new EventHandler(BedGrid_Clicked);
在我将BedGrid添加到面板之前,将添加到"else" .
我错过了什么?所有这些都发生在Page_Load中,那么为什么事件没有触发呢?其他一切都很好,这意味着控件和它们的子控件可以正确地绘制…
这不起作用的原因是必须在post back上重新创建控件,并将事件连接起来,以便它们启动。
看,由于服务器是无状态的,要在对象上触发事件,需要重新创建该对象并将其读入表单。
如何缓存数据库结果,并继续循环,否则构建新的,添加和连接控件?