Обновление Gridview с помощью таймера

#asp.net #gridview #timer

#asp.net #gridview #таймер

Вопрос:

Я пытаюсь обновить gridview с помощью таймера, чтобы не возникло тайм-аута для самой страницы.Что я пытался в этом случае, так это выполнить ping и делать это каждые несколько секунд и добавить результат в gridview.

То, чем я управляю, — это всего лишь 2-строчный gridview (таким образом, максимум 2 записи). все остальное содержимое ….. «обновлено». То, что я попробовал, это следующее ниже (текущая версия). Я даже попробовал поместить таймер в панель обновления в дополнение к gridview …. или оставить gridview вне панели, пока включен таймер (в последней версии таймер работал, но gridview вообще не изменился).

Код, лежащий в основе:

 public partial class Ping : System.Web.UI.Page
{
    private int _MaxPings = 100;
    private DataTable _PingResults = new DataTable();
    private string _Url = "127.0.0.1";

    protected void Page_Load(object sender, EventArgs e)
    {
        _PingResults.Columns.Add("Time");
        _PingResults.Columns.Add("Result");
        UI_PingResult.DataSource = _PingResults;
        UI_PingResult.DataBind();

        AddToPingResult(_Url);

    }

    public void AddToPingResult(string IP)
    {
        Process pingProcess = new Process();
        int secondsWaited = 0;
        ProcessStartInfo pingProcessStartInfo = new ProcessStartInfo("ping ");


        if (_PingResults.Rows.Count >= _MaxPings)
        {
            _PingResults.Rows.RemoveAt(0);
        }

        pingProcessStartInfo.Arguments = "-n 1 "   IP;
        pingProcessStartInfo.CreateNoWindow = true;
        pingProcessStartInfo.ErrorDialog = false;
        pingProcessStartInfo.RedirectStandardOutput = true;
        pingProcessStartInfo.UseShellExecute = false;

        pingProcess.StartInfo = pingProcessStartInfo;
        pingProcess.Start();

        while (!pingProcess.HasExited amp;amp; secondsWaited <= 10) // 10 Seconds
        {
            Thread.Sleep(1000);
            secondsWaited  ;
        }

        if (pingProcess.HasExited)
        {
            string resultText = String.Empty;
            int linesRead = 0;

            while (!pingProcess.StandardOutput.EndOfStream amp;amp; linesRead < 3)
            {
                string outputLine = pingProcess.StandardOutput.ReadLine().Trim();

                if (linesRead == 2)
                {
                    resultText  = outputLine   "<br />";
                }

                linesRead  ;
            }

            _PingResults.Rows.Add(DateTime.Now, resultText);

        }

        UI_PingResult.DataBind();
    }

    protected void UI_Timer_Tick(object sender, EventArgs e)
    {
        AddToPingResult(_Url);
    }
}
  

HTML:

 <asp:Timer runat="server" ID="UI_Timer" Interval="6000" OnTick="UI_Timer_Tick"></asp:Timer>
<asp:UpdatePanel runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="UI_Timer" EventName="Tick" />
    </Triggers>
    <ContentTemplate>
        <asp:GridView ID="UI_PingResult" runat="server" Width="100%" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="Time" HeaderText="Zeitpunkt" />
                <asp:BoundField DataField="Result" HtmlEncode="false" HeaderText="Resultat" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>
  

Теперь мой вопрос: что я здесь делаю не так? Итак, что мне нужно сделать, чтобы иметь возможность добавлять в gridview через таймер?

Ответ №1:

Если вы используете таймер для «добавления» чего-либо к элементу управления, такому как GridView, вам нужно где-то сохранить предыдущие значения, иначе они будут потеряны при добавлении данных в следующем тике таймера. Если вы хотите сохранить данные на страницах или обновить страницу, используйте Session вместо ViewState . Смотрите пример ниже.

 protected void Timer1_Tick(object sender, EventArgs e)
{
    //create a new table to hold the data
    DataTable table;

    //check if the viewstate item exists and if not create a new table
    if (ViewState["TimerTable"] == null)
    {
        table = new DataTable();
        table.Columns.Add("TimeStamp", typeof(DateTime));

        //create the viewstate object
        ViewState["TimerTable"] = table;
    }
    else
    {
        //the viewstate exists so you can cast it back to a datatable
        table = ViewState["TimerTable"] as DataTable;
    }

    //add the next tick data to the table
    table.Rows.Add(DateTime.Now);

    //rebind all the datat to the gridview
    GridView1.DataSource = table;
    GridView1.DataBind();
}
  

ASPX

 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>

        <asp:GridView ID="GridView1" runat="server"></asp:GridView>

        <asp:Timer ID="Timer1" runat="server" OnTick="Timer1_Tick" Interval="2500"></asp:Timer>

    </ContentTemplate>
</asp:UpdatePanel>