回发时TableRows究竟会发生什么?

时间:2014-05-28 17:18:54

标签: c# html asp.net

我在更新面板中有一个表,应该每5秒刷新一次。 UpdatePanel刷新时设置lblDate。页面加载上设置了lblAddress。两者似乎都运转正常。

<asp:UpdatePanel ID="pnlreport" runat="server">
    <ContentTemplate> 
        <asp:Table ID="tblReport" runat="server">
            <asp:TableRow>
                <asp:TableCell ColumnSpan="2">
                    <asp:Label runat="server" ID="lblDate" />
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow>
                <asp:TableCell ColumnSpan="2">
                    <asp:Label runat="server" ID="lblAddress" />
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Timer runat="server" ID="tmrUpdate" Interval="5000" OnTick="tmrUpdate_Tick" />
    </ContentTemplate>
</asp:UpdatePanel>

每次表格刷新时,我都会在表格中添加行。

    protected void tmrUpdate_Tick(object sender, EventArgs e)
    {
        // Update the timestamp on the report
        lblDate = DateTime.Now.toString();
        setupTables();
        tmrUpdate.Interval = 5000; // Reset the timer
    }

函数setupTables()用于清除表中的任何数据,然后将最新数据添加回表中。但是我希望保留两个硬编码的行,因为它们可以作为一种&#34;标题&#34;。这是我遇到问题的地方。

protected void setupTables(ServiceStatus data)
{
    // Clear all but the header rows
    for (int i = 2; i < tblReport.Rows.Count; i++) 
        tblReport.Rows.RemoveAt(i); // A breakpoint here never gets hit.

    // Populate the table with new rows
    TableRow fakeDataRow = new TableRow();

    TableCell tc = new TableCell();
    tc.Text = "Fake text for Cell 1";
    fakeDataRow.Cells.Add(tc)

    tc = new TableCell();
    tc.Text = "Fake text for Cell 2";
    fakeDataRow.Cells.Add(tc)

    tblReport.Rows.Add(fakeDataRow);
}

在回发时,我注意到清除旧行的for循环从未被击中。添加我的假表后,我的表显然有三行,但它在回发时就消失了。所以我添加了这一行来看看发生了什么。

fakeDataRow.ID = "trFakeData";

但是,页面会抛出类似&#34的错误;已经添加了具有相同键的项目&#34;第二次刷新后。如果已经有一行带有该键,它在哪里,以及如何正确删除它?

1 个答案:

答案 0 :(得分:1)

试试这个。如果循环遍历元素并按原样删除索引,那么你的循环和索引会变得混乱(你必须反过来为了不搞乱它,例如,从count-1开始,然后我 - 。)

protected void setupTables(ServiceStatus data)
{
    // Clear all but the header rows
    TableRow header1 = tblReport.Rows[0];
    TableRow header2 = tblReport.Rows[1];

    tblReport.Rows.Clear();

    tblReport.Rows.Add(header1);
    tblReport.Rows.Add(header2);

    //... the rest of your logic to add fake data...
}