Как я могу обновить определенный столбец в моем представлении сетки после определенного события?

#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:

Хорошо, я решил эту проблему.

  1. Удалите изображения из панели ItemTemplate и добавьте панель
     <ItemTemplate>
        <asp:Panel runat="server" ID="Panel4"></asp:Panel>
    </ItemTemplate>
     
  2. Измените код, стоящий за этим, на
     Image Image2 = new Image();
    Image Image3 = new Image();
    Image Image4 = new Image();
    Panel serverPanel = (Panel)row.FindControl("Panel4");
     
  3. Добавьте изображения, подобные этому:
      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();
                    }
                }
            }
        }
    }