【问题标题】:Bind GridView Row One By One After Data is Prepared数据准备好后逐一绑定GridView行
【发布时间】:2021-07-25 22:57:51
【问题描述】:

我有大量学生的考试数据,我对其进行处理以显示学生成绩。虽然它似乎有效,但显示结果需要更长的时间。时间每天都在增加。

  1. 我有一个问题表 (tblQuestions) 来存储问题和正确答案。
  2. 我有一个测试实例表 (tblTestInstance),它存储学生给出的每个测试的测试实例。
  3. 我拥有的最大表是 tblTestDetails,它存储问题 ID 和学生选择的选项。

我将 GridView 与学生表绑定,并在 GridView 的 Databound 事件中,为每个学生计算学生尝试的每个问题的正确答案。我在数据表中计算数据。

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

需要的建议:我想逐行绑定gridview(每行都准备好单个结果),而不是一次加载所有计算结果。

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

请有任何建议。我正在使用 ASP.NET Web 窗体。

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

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

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

【问题讨论】:

  • 我看不到在这里逐行处理将如何提高速度 - 在几乎所有情况下,逐行处理比使用数据引擎和使用 sql 查询提取数据要慢得多。我的意思是,用户无法查看或查看超过 1 页的数据 - 你在这里拉了多少行?一页数据应该立即出现-即使对于毛球超级丑陋的sql-这样的页面也会立即出现。这里的一些细节没有意义。我的意思是这里提取了多少行数据?我的意思是世界上最糟糕的 sql 的 100 行仍然会在一秒钟内发生。
  • 关于数据项绑定实际上是逐行处理。缺少一些重要的细节。逐行处理或使用数据绑定的项目相当于同一件事。这里的数据量应该无关紧要 - 但重要的是您执行的单独 sql 查询的数量 - 成本很高 - 通常在大多数情况下,大量单独的 sql 查询比被提取的数据量要昂贵得多.这表明在数据绑定事件中执行了太多“新”的从头开始的 sql 查询。一次将数据拉入数据表并将其持久化以用于数据绑定事件。
  • 正在执行的 SQL 查询不多。概括地说,我正在使用 SELECT 拉学生。对于每个学生,我都在获取问题集。然后使用 db 表针对正确答案评估每个问题。如果一个班级有 1000 名学生,他们每个人都进行了 150 个问题的测试,那么数据绑定事件将产生较慢的结果。我想要的不是一起等待结果,而是一个一个的方法会更有帮助。用户至少会在 10 分钟内看到一些东西而不是空白页。
  • 也许更好地将 sql 例程与答案进行匹配会有所帮助?也许视图中的一组子查询可以进行这种匹配?我想您可以显示学生,然后选择一行进行深入研究。我仍然认为每个学生 150 次匹配不会成为问题,除非 sql 查询无法匹配 Q 和 A,并且此处正在逐行处理。如果这些问题+答案匹配不能用sql完成,那么这将很慢。
  • 总结@AlbertD.Kallal,如果可能的话,您应该使用存储过程或类似方法进行一次,并且只进行一次数据库调用。如果您正在为返回的每个初始行执行后续调用数据库,难怪这需要几分钟。

标签: asp.net gridview webforms


【解决方案1】:

使用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>

以及后面的代码。

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();
}

其他方法是使用虚拟 ListView,意味着在页面上滚动时显示数据 - 我已经给出了这个答案的示例 -> Virtual Listview for ASP.net?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多