Создание данных нижнего колонтитула GridView, связанных как данные строки

У меня есть проект ASP.NET, созданный с помощью C#, который использует GridViews. Строка нижнего колонтитула содержит отношение суммы, основанной на данных столбца, к заданному значению из данных, указывающих, сколько их должно быть. Пользователь должен иметь возможность изменять второе значение и обновлять нижний колонтитул. Я не могу узнать, как это сделать или даже если это возможно. Я думал об использовании еще одного GridView внизу, но обеспечить синхронизацию строк столбцов между ними — кошмар. Есть идеи?

Кроме того, когда я изменяю данные столбца (используя строки «Редактировать/Обновить»), общая сумма не обновляется, когда я нажимаю «Обновить», но обновляется, когда я снова нажимаю «Изменить». Может ли кто-нибудь сказать мне, почему это так и как обновить общее количество в нижнем колонтитуле при обновлении?


person jhasell    schedule 27.02.2013    source источник
comment
Вы должны показать нам код!   -  person Magnus    schedule 28.02.2013
comment
Не могли бы вы опубликовать свой код на стороне клиента для GridView и код на стороне сервера для событий OnEdit и OnUpdate?   -  person Melanie    schedule 28.02.2013


Ответы (1)


Если вы обнаружите, что ваши отредактированные поля обновляются «на один клик позже», обычно это происходит из-за того, что вы думаете, что восстановили свой 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, что должно каждый раз пересчитывать поля нижнего колонтитула.

person fnostro    schedule 14.04.2016