Създаване на данни в долния колонтитул на 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, това ще доведе до Postback и ще накара GridView да се обвърже отново, което трябва да преизчислява полетата в долния колонтитул всеки път.

person fnostro    schedule 14.04.2016