#c# #asp.net
Вопрос:
В моем веб-приложении у меня есть GridView
приложение, которое получает информацию из базы данных SQL, а затем у меня есть приуроченное событие, которое отправляет IP-адреса каждые 5 секунд. Если ответ составляет менее 15 мс, значок отображается в виде зеленой галочки. Если прошло более 15 мс, значок меняется на желтый восклицательный знак, а при истечении времени ожидания появляется красный значок ошибки.
Код работает так, как должен(в отношении события по времени), однако значок не заменяется в соответствии с ответом по времени, вместо этого он каждый раз добавляет новый значок
например:
если время меньше, чем 15 мс на первом запланированном событии:
Y
если время составляет более 15 мс во время второго события по времени:
Y !
Как вы можете видеть Y
, остатки, тогда как затем он должен просто отображать !
Это мой код (aspx)
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:constr %>"
SelectCommand="SELECT ip, host, device FROM [servers]"></asp:SqlDataSource>
<asp:Timer runat="server" ID="UpdateTimer" Interval="5000" OnTick="UpdateTimer_Tick" />
<asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
<triggers>
<asp:AsyncPostBackTrigger controlid="UpdateTimer" eventname="Tick" />
</triggers>
<ContentTemplate>
<asp:GridView ID="GridView1" CssClass="gridview" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="SqlDataSource1" DataKeyNames="ip" Width="100%">
<AlternatingRowStyle CssClass="AltRow"></AlternatingRowStyle>
<Columns>
<asp:TemplateField HeaderText="Status">
<ItemTemplate>
<asp:Image ID="Image3" runat="server" Visible="False" ImageUrl="~/Images/green.png" />
<asp:Image ID="Image4" runat="server" Visible="False" ImageUrl="~/Images/red.png" />
<asp:Image ID="Image5" runat="server" Visible="False" ImageUrl="~/Images/yellow.png" />
</ItemTemplate>
<HeaderStyle HorizontalAlign="Center" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:BoundField DataField="ip" HeaderText="IP Address" />
<asp:BoundField DataField="host" HeaderText="Host Name" />
<asp:BoundField DataField="device" HeaderText="Description" />
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
Для кода, стоящего за:
protected void UpdateTimer_Tick(object sender, EventArgs e)
{
Servers();
}
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");
TimedPanel.Update();
string destIP = GridView1.DataKeys[row.RowIndex].Value.ToString();
{
try
{
Ping p = new Ping();
PingReply reply;
reply = p.Send(destIP);
if (reply.Status == IPStatus.Success)
{
if (reply.RoundtripTime > 15)
{
Image5.Visible = true;
Image5.ToolTip = Convert.ToString("RoundTripTime: " reply.RoundtripTime "ms");
}
else
Image3.Visible = true;
Image3.ToolTip = Convert.ToString("RoundTripTime: " reply.RoundtripTime "ms");
}
else
{
Image4.Visible = true;
Image4.ToolTip = reply.Status.ToString();
}
}
catch (PingException err)
{
Image4.ToolTip = err.Message.ToString();
Image4.Visible = true;
}
}
}
}
}
Я попытался обновить панель с помощью:
TimedPanel.Update();
Однако это не сработало. Очевидно, что когда я обновляю всю страницу, это работает, но я не хочу этого делать. Я также не уверен, можно ли обновлять только столбец, в котором отображаются значки после каждого события по времени.
Есть ли какие-либо предложения о том, как я могу заставить значки отображаться по одному за раз после запланированного события?
Спасибо
Ответ №1:
Хорошо, я решил эту проблему.
- Удалите изображения из панели
ItemTemplate
и добавьте панель<ItemTemplate> <asp:Panel runat="server" ID="Panel4"></asp:Panel> </ItemTemplate>
- Измените код, стоящий за этим, на
Image Image2 = new Image(); Image Image3 = new Image(); Image Image4 = new Image(); Panel serverPanel = (Panel)row.FindControl("Panel4");
- Добавьте изображения, подобные этому:
if (reply.Status == IPStatus.Success) { if (reply.RoundtripTime > 50) { Image2.ImageUrl = "../Images/yellow.png"; serverPanel.Controls.Add(Image2); Image2.ToolTip = Convert.ToString("RoundTripTime: " reply.RoundtripTime "ms"); } else { Image3.ImageUrl = "../Images/green.png"; serverPanel.Controls.Add(Image3); Image3.ToolTip = Convert.ToString("RoundTripTime: " reply.RoundtripTime "ms"); } } else { Image4.ImageUrl = "../Images/red.png"; serverPanel.Controls.Add(Image4); Image4.ToolTip = reply.Status.ToString(); } } catch (PingException err) { Image4.ImageUrl = "../Images/red.png"; serverPanel.Controls.Add(Image4); Image4.ToolTip = err.Message.ToString(); }
так что тогда это будет:
<asp:SqlDataSource ID="SqlDataSource4" runat="server"
ConnectionString="<%$ ConnectionStrings:constr %>"
SelectCommand="SELECT ip, host, device FROM [addfirewall]"></asp:SqlDataSource>
<asp:Timer runat="server" ID="UpdateTimer3" Interval="5000" OnTick="UpdateTimer3_Tick" />
<asp:UpdatePanel runat="server" ID="UpdatePanel3" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="GridView4" CssClass="gridview" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="SqlDataSource4" DataKeyNames="ip" Width="100%">
<AlternatingRowStyle CssClass="AltRow"></AlternatingRowStyle>
<Columns>
<asp:TemplateField HeaderText="Status">
<ItemTemplate>
<asp:Panel runat="server" ID="Panel4"></asp:Panel>
</ItemTemplate>
<HeaderStyle HorizontalAlign="Center" />
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:BoundField DataField="ip" HeaderText="IP Address" />
<asp:BoundField DataField="host" HeaderText="Host Name" />
<asp:BoundField DataField="device" HeaderText="Description" />
</Columns>
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="UpdateTimer3" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
Код За:
private void Servers()
{
foreach (GridViewRow row in GridView4.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
Image Image2 = new Image();
Image Image3 = new Image();
Image Image4 = new Image();
Panel serverPanel = (Panel)row.FindControl("Panel4");
string destIP = GridView4.DataKeys[row.RowIndex].Value.ToString();
{
try
{
Ping p = new Ping();
PingReply reply;
reply = p.Send(destIP);
if (reply.Status == IPStatus.Success)
{
if (reply.RoundtripTime > 50)
{
Image2.ImageUrl = "../Images/yellow.png";
serverPanel.Controls.Add(Image2);
Image2.ToolTip = Convert.ToString("RoundTripTime: " reply.RoundtripTime "ms");
}
else
{
Image3.ImageUrl = "../Images/green.png";
serverPanel.Controls.Add(Image3);
Image3.ToolTip = Convert.ToString("RoundTripTime: " reply.RoundtripTime "ms");
}
}
else
{
Image4.ImageUrl = "../Images/red.png";
serverPanel.Controls.Add(Image4);
Image4.ToolTip = reply.Status.ToString();
}
}
catch (PingException err)
{
Image4.ImageUrl = "../Images/red.png";
serverPanel.Controls.Add(Image4);
Image4.ToolTip = err.Message.ToString();
}
}
}
}
}