我创建了带有下拉列表和两个gridview的网页,并且在selectedindex已更改的事件中我填充了这两个gridview,但在运行时,两个gridview需要很长时间才能填充。
注意:这个gridview之一我通过代码创建了它的数据源。 这是我的代码片段:
protected void _ddlPLCs_SelectedIndexChanged(object sender, EventArgs e)
{
DataTable dtStatus = new DataTable();
dtStatus = DBLayer.getMachineNameIPStatusPlCByName(_ddlPLCs.SelectedValue);
dtStatus.Columns.Add("Status", typeof(String));
foreach (DataRow row in dtStatus.Rows)
{
if (LogicLayer.checkmachineStatus(row["machineIP"].ToString()))
row["Status"] = "Online";
else
row["Status"] = "offline";
}
GVStatus.DataSource = dtStatus;
GVStatus.DataBind();
if (_ddlPLCs.SelectedValue.Contains('-'))
{
_dsPLCs.SelectParameters.Clear();
_dsPLCs.SelectParameters.Add("PLCID","0");
_dsPLCs.DataBind();
}
else
{
_dsPLCs.SelectParameters.Clear();
_dsPLCs.SelectParameters.Add("PLCID", DBLayer.getPlCIDByName(_ddlPLCs.SelectedValue).ToString());
_dsPLCs.DataBind();
}
}
请求帮助我
答案 0 :(得分:4)
查看代码,我认为问题出在这个方法中:
LogicLayer.checkmachineStatus()
我有一种预感,这实际上是向远程机器/设备发出网络请求以确定其状态。这将会很慢,特别是如果您的计算机可能不在线并且您必须等待它们超时。
如果这是罪魁祸首,那么您要做的就是构建一个在您的服务器上运行的服务。该服务应该在后台持续进行这些检查,并使用结果更新数据库表。您可能希望在表中包含最后一次检查的时间戳。它甚至可能值得插入而不是更新,因此您可以获得状态何时处于不同值的历史记录。然后,您的ASP.Net代码应该只显示数据库表。
答案 1 :(得分:1)
资料!获取RedGate ANTS的试用版并根据您的代码运行它。
如果您选择行level timings
,它会在代码中的每一行旁边放一个数字,它会准确地告诉您每行所用的时间长度为%或毫秒。确保使用挂钟时间而不是cpu时间或数据源的等待时间将无法正常计算。
我敢打赌你的数据源很慢。
答案 2 :(得分:0)
你在这里做了很多工作......
一些随意的想法
网络可能很慢 - @Joel在那个网站上有一个很好的观点。
要检查的一件事就是回发 - 确保您只对所选索引的数据绑定进行了更改。
为什么不在函数中使用'handle'caluse?可能不是问题,只是好奇。
如果您将“状态”列标题更改为“在线”,然后使用复选框(checked = online,unchecked = off-line或类似内容,您只需更新每行的bool值,而不是字符串值。
关于如何重新绑定下拉列表,看起来很奇怪。因为......您正在使用所选值作为gridview中的参数。然后,您随后重新绑定下拉列表,这可能会导致不同的选定值。哪个可能导致您的gridview再次在电路中进行数据绑定。不确定,因为我看不到你的所有代码。
无论如何,FWIW。祝你好运。