我有一个用户可以编辑的项目表。他们可以使用箭头键在字段中导航,并且当他们移动到新行时,将保存当前行中的信息。该项目需要在成功保存行时向用户显示通知,我的老板要求我通过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);
}
}