【问题标题】:Custom control events don't fire when control collection is cached?缓存控件集合时不会触发自定义控件事件?
【发布时间】:2013-06-11 13:34:52
【问题描述】:

我有一个自定义控件“BedGrid”,其中包含一组自定义控件,每个控件上都有一个单击处理程序。在父页面的 Page_Load 事件中,我生成 BedGrid 的集合,并将它们连接到事件处理程序。这一切都很好,当我在每个 Page_Load 上生成 BedGrid 时...孙子被点击,将事件触发到 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 中,那么为什么事件没有触发呢?其他一切都很好,这意味着控件及其子项可以正确绘制..

【问题讨论】:

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


    【解决方案1】:

    这不起作用的原因是,必须在回发时重新创建控件,并连接事件,才能触发它们。

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

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

    【讨论】:

    • 谢谢,我会试一试。自从问了这个问题后,一直被其他形式分心..
    • @Glendale,不用担心。总而言之,当涉及到动态创建的控件时,ASP.NET 事件模型充其量是痛苦的。
    • 是的,我确实意识到..我有自定义控件集合嵌套在自定义控件集合中,所有这些都是动态创建的..谈论把我的头发拉出来!我真的希望我可以自己缓存控件,因为它们在会话过程中不会发生太大变化。我想我只能满足于数据了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2010-10-15
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多