缓存控件集合时,不会触发自定义控件事件

本文关键字:自定义控件 事件 控件 集合 缓存 | 更新日期: 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上重新创建控件,并将事件连接起来,以便它们启动。

看,由于服务器是无状态的,要在对象上触发事件,需要重新创建该对象并将其读入表单。

如何缓存数据库结果,并继续循环,否则构建新的,添加和连接控件?