JavaScript setInterval 函数不更新 <div> 元素中的 Gridview

Posted

技术标签:

【中文标题】JavaScript setInterval 函数不更新 <div> 元素中的 Gridview【英文标题】:JavaScript setInterval function not updating Gridviews in <div> elements 【发布时间】:2018-09-05 00:41:24 【问题描述】:

我有 2 个项目,我使用的标签(至少用于测试)会随着上次更新时间刷新。但是,元素内的 GridView 只更新一次。数据在控制台应用程序中正常解析并写出,所以我不确定打嗝是什么。奇怪的是,虽然它确实为第一次迭代加载数据,但不会刷新新数据。

是不是 setInterval 函数不起作用?我已经尝试过了,并且我发现了一个递归 setTimeout 函数,但都没有奏效。两者都包含在显示尝试 1 和 2 的 cmets 中。

编辑如果我只是一个 alert(),尝试 2 有效,但调用 C# 方法使其只运行一次。

任何帮助将不胜感激。

这是页面:

    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <link href="CSS/Stylesheet.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
        function ProcessData() //Attempt 1
        
            <%Process_Data();%>
            setTimeout(ProcessData, 3000);
        
        setInterval(function () 
            ProcessData()
        , 3000);

    </script>
      <script type="text/javascript">     // Attempt 2
        function ProcessData()
        
            <%Process_Data();%> 
            setTimeout(ProcessData(), 5000);
        
        ProcessData();
    </script>


    <div class="Images">
        <asp:Label ID="Label1" runat="server" Text="123"></asp:Label><br />
        <asp:Label ID="Label2" runat="server" Text="123"></asp:Label><br />
    </div>
    <div id="dnrLeft" class="DonorsLeft">
        <div class="col-md-4">
            <asp:GridView ID="dnrResultsLeft" runat="server" HorizontalAlign="Left" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundField DataField="DonorName" HeaderText="" />
                    <asp:BoundField DataField="Club" HeaderText="" />
                </Columns>
            </asp:GridView>
        </div>
    </div>
    <div id="dnrRight" class="DonorsRight">
        <div class="col-md-4">
            <asp:GridView ID="dnrResultsRight" runat="server" HorizontalAlign="Right" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundField DataField="DonorName" HeaderText="" />
                    <asp:BoundField DataField="Club" HeaderText="" />
                </Columns>
            </asp:GridView>
        </div>
    </div>
</asp:Content>

这是它背后的代码:

namespace DnrBoards

    public partial class DonorBoardOsh : System.Web.UI.Page
    
        List<Donors> dnrs = new List<Donors>();
        protected void Page_Load(object sender, EventArgs e)
        
            using (DnrBrdDataContext DR = new DnrBrdDataContext())
            
                var dnrList = (from d in DR.DonorBoards
                               where (d.SiteLocation == "OSH") && (d.Club != "0 Donations")
                               orderby d.Donation_Type, d.Donation_Sum, d.Donor ascending
                               select new
                               
                                   _DonorName = d.Donor.ToString(),
                                   _Club = d.Club
                               ).ToList();
                foreach (var item in dnrList)
                
                    dnrs.Add(new Donors(item._DonorName, item._Club));
                
            
            Label2.Text = "Last data pull at: " + DateTime.Now.ToString();
               

        protected void Process_Data()
        
            List<Donors> dlLeft = new List<Donors>();
            List<Donors> dlRight = new List<Donors>();
            for (int i = 0; i < 43; i++)
            
                try
                
                    dlLeft.Add(dnrs[0]);
                    dnrs.RemoveAt(0);
                
                catch  
            
            for (int i = 0; i < 43; i++)
            
                try
                
                    dlRight.Add(dnrs[0]);
                    dnrs.RemoveAt(0);
                
                catch  
            
            dnrResultsLeft.GridLines = GridLines.None;
            dnrResultsLeft.DataSource = dlLeft;
            dnrResultsLeft.DataBind();

            dnrResultsRight.GridLines = GridLines.None;
            dnrResultsRight.DataSource = dlRight;
            dnrResultsRight.DataBind();

            dlLeft.Clear();
            dlRight.Clear();
            Label1.Text = "Last Refresh: " + DateTime.Now.ToString();
        
    

【问题讨论】:

【参考方案1】:

Page_Load 将在每次回调更新时运行,因此 dnrs 将始终在每次更新时使用数据库中的新数据进行更新,即使您在上一次删除它也是如此。

RemoveAt(i) 的逻辑很奇怪。 RemoveAt() 在指定位置从列表中删除一个项目,但每次迭代都会增加位置。同时,每次迭代数组都会变小(因为您要删除一个项目),因此当您完成列表的一半时将开始失败。如果您打算每次都从列表中取出第一项,您应该add( dnrs[0])RemoveAt(0)。这将从列表中添加第一项,然后将其从 dnrs 中删除,这意味着在下一次迭代中,下一项现在将位于索引 0。

【讨论】:

即使在更新面板内部触发或触发了计时器?我已经用相同的结果测试了两者。您能否为如何处理它提供更好的选择? RemoveAt(0) 绝对是一个有用的建议,我错过了那部分。

以上是关于JavaScript setInterval 函数不更新 <div> 元素中的 Gridview的主要内容,如果未能解决你的问题,请参考以下文章

带参数的 Javascript setinterval 函数

请问javascript里var a=setinterval后在函数中清除再设定a返回值不停增加?

javascript 中断函数的使用 setInterval();

JavaScript setInterval - 函数只调用一次

在JavaScript的SetInterval()函数中传递参数

在javascript中 setInterval()clearInterval()clearTimeout()等等常用的函数的含义