ASP.NET GridView定时事件触发后如何更新指定列并解决图标重复问题
解决方案
核心问题
你在更新图标可见状态时,没有重置其余两个图标的可见属性。ASP.NET Web Forms的视图状态会持久化控件的历史属性值,所以上一次回发中被设为可见的图标会一直保留可见状态,最终出现多个图标叠加的效果。同时你当前在循环中重复调用TimedPanel.Update()是多余操作,无需在每一行处理时都触发面板更新。
修改后的后台代码
直接修改Servers方法,每次处理行时先将三个图标统一设为隐藏,再根据Ping结果仅展示对应图标即可:
private void Servers() { foreach (GridViewRow row in GridView1.Rows) { if (row.RowType == DataControlRowType.DataRow) { Image Image3 = (Image)row.FindControl("Image3"); Image Image4 = (Image)row.FindControl("Image4"); Image Image5 = (Image)row.FindControl("Image5"); // 先把所有图标重置为隐藏 Image3.Visible = false; Image4.Visible = false; Image5.Visible = false; string destIP = GridView1.DataKeys[row.RowIndex].Value.ToString(); try { Ping p = new Ping(); // 可选:给Ping设置超时时间,避免单个IP超时阻塞整个定时任务 PingReply reply = p.Send(destIP, 1000); if (reply.Status == IPStatus.Success) { if (reply.RoundtripTime > 15) { Image5.Visible = true; Image5.ToolTip = $"RoundTripTime: {reply.RoundtripTime}ms"; } else { Image3.Visible = true; Image3.ToolTip = $"RoundTripTime: {reply.RoundtripTime}ms"; } } else { Image4.Visible = true; Image4.ToolTip = reply.Status.ToString(); } } catch (PingException err) { Image4.ToolTip = err.Message; Image4.Visible = true; } } } // 所有行处理完成后可以统一调用更新,也可以删掉这行,因为Timer已经配置了触发器会自动刷新面板 // TimedPanel.Update(); }
可选优化
如果你的服务器列表数量较多,同步Ping会导致整体更新延迟变高,可以考虑改用异步Ping的方式批量执行,进一步提升更新效率。
内容的提问来源于stack exchange,提问作者Allrounder
相关产品推荐
相关产品推荐

