Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 准备好数据后逐个绑定GridView行_Asp.net_Gridview_Webforms - Fatal编程技术网

Asp.net 准备好数据后逐个绑定GridView行

Asp.net 准备好数据后逐个绑定GridView行,asp.net,gridview,webforms,Asp.net,Gridview,Webforms,我有大量的学生考试数据,我处理这些数据来显示学生的成绩。虽然它似乎可以工作,但显示结果所需的时间要长得多。时间一天比一天多 我有一个问题表(tblQuestions)来存储问题和正确答案 我有一个测试实例表(tblTestInstance),它存储学生给出的每个测试的测试实例 我拥有的最大的表是tblTestDetails,它存储学生选择的问题ID和选项 我将GridView与学生表绑定,并在GridView的数据绑定事件上,为每个学生计算学生尝试的每个问题的正确答案。我计算数据表中的数据 问题

我有大量的学生考试数据,我处理这些数据来显示学生的成绩。虽然它似乎可以工作,但显示结果所需的时间要长得多。时间一天比一天多

  • 我有一个问题表(tblQuestions)来存储问题和正确答案
  • 我有一个测试实例表(tblTestInstance),它存储学生给出的每个测试的测试实例
  • 我拥有的最大的表是tblTestDetails,它存储学生选择的问题ID和选项
  • 我将GridView与学生表绑定,并在GridView的数据绑定事件上,为每个学生计算学生尝试的每个问题的正确答案。我计算数据表中的数据

    问题是:处理结果需要几分钟

    所需建议:我希望一行一行地绑定gridview(在单个结果就绪后,每行绑定一次),而不是一次加载所有计算结果

    我尝试过的:我使用了带有定时器控制的更新面板。每隔几秒钟,我就尝试重新加载我的数据表,但它仍然同时显示结果

    有什么建议吗。我正在使用ASP.NET Web表单

    编辑: 我想逐行显示结果。我的意思是当第一行准备就绪时,它应该显示在用户的屏幕上。我知道这不会提高性能,但我希望用户在屏幕上看到一些东西,而不是等待所有行准备就绪

    例如,如果一个班级有1000名学生,他们进行了一项测试,每个测试有150个或更多的问题,那么评估答案需要更长的时间

    我目前使用的方法 我从数据库中提取学生,并绑定网格视图 对于每个学生,我提取测试实例,然后提取问题集 对于每个问题,我使用问题表评估答案
    计算标记后,我会显示它们。

    一个技巧是使用
    Response.flush()刷新数据

    这里有一个例子

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField HeaderText="Item" >
                <ItemTemplate>
                    <%#cRenderLine(Container.DataItem)%>
                    <% 
                        // show every 10 lines what I have
                        if (++cLine % 10 == 0)
                        {
                            Response.Flush(); 
                            // simulate the delay here
                            // System.Threading.Thread.Sleep(1000);
                        }
                    %>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    我看不出逐行处理在这里是如何提高速度的——几乎在所有情况下,逐行处理都比使用数据引擎和sql查询提取数据慢得多。我的意思是,用户不能查看或看到超过1页的数据-您在这里拉了多少行?一页数据应该几乎是即时的——即使对于毛茸茸的超级丑陋的sql来说也是如此——这样的页面看起来是即时的。这里的一些细节没有意义。我的意思是这里有多少行数据?我的意思是,100行世界上最差的sql仍然会在1秒之内出现。数据项绑定实际上是逐行处理。缺少一些重要的细节。逐行处理或使用项目数据绑定相当于一件事。这里的数据量应该不重要,但重要的是您执行的单独sql请求的数量,这具有很高的成本,通常在大多数情况下,大量单独的sql查询比提取的数据量要昂贵得多。这表明在on数据绑定事件中执行了太多从头开始的“新”sql查询。将数据一次性拉入datatable并将其持久化为数据绑定事件。执行的SQL查询不多。概括地说,我使用SELECT来吸引学生。我为每个学生收集问题集。然后使用db表根据正确答案对每个问题进行评估。如果一个班级有1000名学生,他们进行了测试,每个测试有150个问题,那么数据绑定事件将产生较慢的结果。我希望,一个接一个的方法会更有帮助,而不是一起等待结果。用户至少会在10分钟内看到一些东西,而不是空白页面。也许更好地匹配sql例程和答案会有所帮助?可能是视图中的一组子需求进行了匹配?我想你可以显示学生,然后选择一行向下钻取。我仍然不认为每个学生150个匹配是一个问题,除非sql查询不能匹配Q和A,并且这里正在进行逐行处理。如果这些问题+答案匹配不能用sql完成,那么这将很慢。总结一下@AlbertD.Kallal,如果可能,您应该使用存储过程或类似方法进行一次,也只能进行一次数据库调用。如果您正在为每个返回的初始行对db进行后续调用,难怪这需要几分钟的时间。
    public int cLine = 0;
    
    List<int> oMainIds = new List<int>();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 10000; i++)
        {
            oMainIds.Add(i);
        }
    
        GridView1.DataSource = oMainIds;
        GridView1.DataBind();
    
    }
    
    protected string cRenderLine(object oItem)
    {
        return oItem.ToString();
    }