从计时器上的面板中删除项目

时间:2016-07-21 15:15:02

标签: c# asp.net timer

背景

我有一个用户可以编辑的项目表。他们可以使用箭头键在字段中导航,并且当他们移动到新行时,将保存当前行中的信息。该项目需要在成功保存行时向用户显示通知,我的老板要求我通过Bootstrap警报执行此操作。

需要为每次成功保存创建一个警报,如果用户在短时间内保存多行,则应该在面板内堆叠。由于警报的数量未知,我正在从代码隐藏中动态地将它们添加到页面中。每个警报都由一个面板和一个标签组成,该标签被添加到一个包含所有警报的更大面板中。这部分我已经弄明白了 - 警报出现时应该是正确的数字。

问题是每个警报只应在屏幕上显示有限的时间。这是两到五秒之间的某个时间,由我的老板决定。我的想法是每次创建警报时启动计时器两秒钟,并在计时器结束时从面板中删除第一个警报。因为在同一时间不会创建两个计时器,理论上应该在它出现两秒后删除每个警报,一旦最后一个警报消失就停止。对我来说不幸的是,这不是它的工作方式。

相反,我得到一个'索引越界'异常,表明我试图删除的警报实际上并不存在。但确实存在 - 我可以在屏幕上看到它。所以我不确定会出现什么问题。

代码

创建警报

此代码位于Page_Load中,因此警报在回发时仍然可见。

if (Session["success"] != null)
{
    int test = Convert.ToInt32(Session["success"]);
    for(int a = 1; a <= test; a++)
    {
        Panel alert = new Panel();
        alert.CssClass = "alert alert-success";
        alert.ID = "dynamicAlert" + a;
        alert.Attributes["role"] = "alert";

        Label innerAlert = new Label();
        innerAlert.ID = "dynamicAlertInner" + a;
        innerAlert.Text = "<strong>Success!</strong> Your row was saved.";
        alert.Controls.Add(innerAlert);
        alertsUpdate.ContentTemplateContainer.FindControl("pnlAlerts").Controls.Add(alert);
        System.Timers.Timer time = new System.Timers.Timer(2000);
        time.Elapsed += removeAlert;
        time.Start();
     }

 }

删除警报

removeAlert方法旨在从更新面板中包含的面板中删除索引0处的警报。

private void removeAlert(Object source, System.Timers.ElapsedEventArgs e)
{
    Panel pnl = (Panel)alertsUpdate.ContentTemplateContainer.FindControl("pnlAlerts");
    if(pnl != null && pnl.Controls.Count > 0)
    {
        pnl.Controls.RemoveAt(0);
    }
}

0 个答案:

没有答案