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

时间:2013-06-11 13:34:53

标签: c# asp.net events caching custom-controls

我有一个自定义控件“BedGrid”,其中包含一组自定义控件,每个控件都有一个单击处理程序。在我的父页面的Page_Load事件中,我生成了一个BedGrids集合,并将它们连接到事件处理程序。这一切都运行正常,当我在每个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中,为什么事件没有解雇?其他一切都很好,这意味着控件和他们的孩子画得恰到好处。

1 个答案:

答案 0 :(得分:0)

这不起作用的原因是因为必须在帖子后面重新创建控件,并且连接事件,以便触发它们。

请参阅,因为服务器是无状态的,要在对象上触发事件,该对象需要重新创建并重新读取到表单。

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