0

我有一个使用 GridViews 的 C# 创建的 ASP.NET 项目。页脚行包含基于列数据的总数与来自数据的设定值的比率,说明应该有多少。用户需要能够修改第二个值并更新页脚。我无法找出如何做到这一点,或者即使有可能。我考虑在下面使用另一个 GridView,但确保两者之间的列线同步是一场噩梦。有任何想法吗?

此外,当我更改列数据(使用编辑/更新行)时,当我单击更新时总数不会更新,但当我再次单击编辑时会更新。谁能告诉我为什么会这样以及如何在更新时更新页脚中的总数?

4

1 回答 1

0

如果您发现您编辑的字段被“单击后”刷新,通常是因为您认为您已经反弹GridView但实际上没有,或者您在进行更新之前已经反弹。

使用 Gridview,每当您在页脚中放置字段时,一个典型的场景是在页面生命周期的数据绑定操作期间计算它的值

就像这样,您的 .aspx 文件定义了一些页脚字段,通常是一些BoundField已转换为TemplateFields 的字段。这是一个片段:

<asp:GridView ID="GridView1" runat="server" ShowFooter="true" ...>
  <Columns>
    <asp:BoundField DataField="Field1" HeaderText="Title" SortExpression="Field1" />
    <asp:TemplateField>
      <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("Field2") %>' ></asp:Label>
      </ItemTemplate>
      <FooterTemplate>
        <asp:Label ID="FooterLabel1" runat="server" Text="" ></asp:Label>
      </FooterTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>

后面代码中的 GridView 事件:这通常是根据更改的行值填充页脚字段所需执行的操作。这是 VB 但你应该能够很容易地转换它。

// Create a variable at the Page level that will exist for 
// the duration of the Page LifeCycle
Private FooterLabel1SubTotal as Double

// Initialize
Private Sub GridView1_DataBinding(sender As Object, e As EventArgs) Handles GridView1.DataBinding
  FooterLabel1SubTotal = 0.0
End Sub

// Accumulate
Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
  If e.Row.RowType = DataRow Then
    Dim Field2 as Label = e.Row.FindControl("Field2")
    FooterLabel1SubTotal += Convert.ToDouble(Field2.Text)
  End If
End Sub

// Populate Footer with formated value
Private Sub GridView1_DataBound(sender As Object, e As EventArgs) Handles GridView1.DataBound
  FooterLabel1 = GridView1.FooterRow.FindControl("FooterLabel1")
  FooterLabel1.Text = String.Format("{0:F2}", FooterLabel1SubTotal)

End Sub

现在,如果您使用 GridView 的任何内置编辑功能,这将导致回发并导致GridView重新绑定,这将每次重新计算页脚字段。

于 2016-04-14T22:01:12.623 回答