数据准备好后一行一行绑定GridView

Bind GridView Row One By One After Data is Prepared

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

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

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

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

必需建议:我想逐行绑定 gridview(每行一旦单个结果准备就绪)而不是一次加载所有计算结果。

我试过的方法:我使用了带有定时器控制的更新面板。在几秒钟的间隔内,我尝试重新加载我的数据table,但它仍然一起显示结果。

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

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

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

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

一个技巧是使用 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?