Почему новые значения не отображаются при обновлении GridViewRow?

#asp.net #vb.net #webforms

#asp.net #vb.net #веб-формы

Вопрос:

Итак, что происходит, я нажимаю кнопку редактирования, ввожу обновленные значения и нажимаю Обновить. Но код за получает исходные значения, а не обновленные значения. Я не могу понять, почему. Раньше это всегда работало.

Разметка

 <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
     CellPadding="7" ForeColor="#333333" GridLines="None" Font-Size="Small"
     ShowFooter="True" DataKeyNames="CapID">
  <AlternatingRowStyle BackColor="White" />
  <Columns>
    <asp:TemplateField HeaderText="AllocationId">
      <ItemTemplate>
        <asp:Label ID="show" runat="server" Text='<%# Eval("CapID") %>' />
      </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Reference Number">
      <ItemTemplate>
        <asp:Label ID="showRefNo" runat="server" Text='<%# Eval("RefNo") %>'/>
      </ItemTemplate>
      <EditItemTemplate>
        <asp:TextBox runat="server" ID="EditRefNo" 
                     Text='<%# Bind("RefNo") %>'/>
      </EditItemTemplate>
      <FooterTemplate>
        <asp:TextBox runat="server" ID="InsertRefNo" 
                     Text='<%# Bind("RefNo") %>'/>
      </FooterTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Resource">
      <ItemTemplate>
        <asp:Label ID="showResource" runat="server" 
                   Text='<%# Eval("Resource") %>'/>
      </ItemTemplate>
      <EditItemTemplate>
        <asp:TextBox runat="server" ID="EditResource" 
                     Text='<%# Bind("Resource") %>'/>
      </EditItemTemplate>
      <FooterTemplate>
        <asp:TextBox runat="server" ID="InsertResource" 
                     Text='<%# Bind("Resource") %>'/>
      </FooterTemplate>
    </asp:TemplateField>
    <!-- and so on... -->
  </Columns>
  <!-- styles etc -->         
  <EmptyDataTemplate>
    Ref Num:amp;nbsp;<asp:TextBox ID="newRefNo" runat="server"/>
    Resource:amp;nbsp;<asp:TextBox ID="newResource" runat="server"/>
    Hours Allocated:amp;nbsp;<asp:TextBox ID="newHours" runat="server"/>
    Week Offset:amp;nbsp;<asp:TextBox ID="newOffset" runat="server"/>
    <asp:Button runat="server" ID="NewDataInsert" 
                CommandName="NewDataInsert" Text="Insert"/>
  </EmptyDataTemplate>  
</asp:GridView>
  

Код позади

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Handles Me.Load
        If Not IsPostBack Then   
            GridView1_DataBind()
            GridView2_DataBind()
        End If
End Sub


Protected Sub GridView2_RowUpdating(ByVal sender As Object, ByVal e As
    GridViewUpdateEventArgs) Handles GridView2.RowUpdating

    Dim capID As Label = GridView2.Rows(e.RowIndex).Cells(0)
        .FindControl("show")
    Dim refNo As TextBox = GridView2.Rows(e.RowIndex).Cells(1)
        .FindControl("EditRefNo")
    Dim resource As TextBox = 
        GridView2.Rows(e.RowIndex).Cells(2).FindControl("EditResource")
    Dim hours As TextBox = 
        GridView2.Rows(e.RowIndex).Cells(3).FindControl("EditHours")
    Dim offSet As TextBox =
        GridView2.Rows(e.RowIndex).Cells(4).FindControl("EditOffset")

    Dim newResAlloc As DataTable = resourceInfo.loadResAllocations
    Dim updateRows As DataRow() = 
        newResAlloc.Select("CapID = " amp; "'" amp; capID.Text amp; "'")

    If (Not updateRows Is Nothing) And updateRows.Length > 0 Then
        For Each updRow As DataRow In updateRows
            updRow.BeginEdit()

            updRow.Item("Refno") = refNo.Text
            updRow.Item("Resource") = resource.Text
            updRow.Item("Hours") = hours.Text
            updRow.Item("Offset") = offSet.Text

            updRow.EndEdit()
        Next
    End If

    resourceInfo.updateResAllocations(newResAlloc)

    GridView2.EditIndex = -1
    GridView2_DataBind()
End Sub
  

Ответ №1:

Это может быть миллион и одна вещь. Что вы проверили? Вы сузили круг поиска?

Вот несколько отправных точек для вас:

  • Поместите точку останова внутрь GridView2_RowUpdating , чтобы убедиться, что она вызывается.
  • Проверьте значение capID , или capID.Text — оно не должно быть 0.
  • Убедитесь, что ваша таблица базы данных содержит строку, где CapID равно значению capID.Text
  • Установите точку останова updateRows , чтобы убедиться, что строка базы данных загружается в ваш код.
  • Убедитесь, что updRow.EndEdit() выполняется нажатие, и что значения правильно заполнены в строке.
  • Наконец, убедитесь, что updateResAllocations он работает правильно. Отсюда невозможно увидеть, как это работает, поэтому я не могу дать никаких советов по этому поводу.

Самый простой способ исправить это — попросить помощи у того, кто ее написал.

Ответ №2:

Проблема заключалась в том, что мой метод RowCommand вызывал привязку данных

Неправильный путь:

 Protected Sub GridView2_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles GridView2.RowCommand

    If e.CommandName = "NewDataInsert" Then

        Dim refNo As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewRefNo")
        Dim resource As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewResource")
        Dim hours As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewHours")
        Dim offset As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewOffset")

        Dim newResAlloc As DataTable = resourceInfo.loadResAllocations
        Dim newAllocRow As DataRow = newResAlloc.NewRow
        newAllocRow.ItemArray = New Object() {Nothing, refNo.Text, resource.Text, hours.Text, offset.Text}
        newResAlloc.Rows.Add(newAllocRow)

        resourceInfo.updateResAllocations(newResAlloc)

    ElseIf e.CommandName = "InsertNew" Then

        Dim refNo As TextBox = GridView2.FooterRow.FindControl("InsertRefNo")
        Dim resource As TextBox = GridView2.FooterRow.FindControl("InsertResource")
        Dim hours As TextBox = GridView2.FooterRow.FindControl("InsertHours")
        Dim offset As TextBox = GridView2.FooterRow.FindControl("InsertOffset")

        Dim newResAlloc As DataTable = resourceInfo.loadResAllocations
        Dim newAllocRow As DataRow = newResAlloc.NewRow
        newAllocRow.ItemArray = New Object() {Nothing, refNo.Text, resource.Text, hours.Text, offset.Text}
        newResAlloc.Rows.Add(newAllocRow)

        resourceInfo.updateResAllocations(newResAlloc)


    End If

    GridView2_DataBind() 'Culprit
End Sub
  

Правильный путь:

 Protected Sub GridView2_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Handles GridView2.RowCommand

    If e.CommandName = "NewDataInsert" Then

        Dim refNo As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewRefNo")
        Dim resource As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewResource")
        Dim hours As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewHours")
        Dim offset As TextBox = GridView2.Controls(0).Controls(0).FindControl("NewOffset")

        Dim newResAlloc As DataTable = resourceInfo.loadResAllocations
        Dim newAllocRow As DataRow = newResAlloc.NewRow
        newAllocRow.ItemArray = New Object() {Nothing, refNo.Text, resource.Text, hours.Text, offset.Text}
        newResAlloc.Rows.Add(newAllocRow)

        resourceInfo.updateResAllocations(newResAlloc)

        GridView2_DataBind()  'Only called if IF is true

    ElseIf e.CommandName = "InsertNew" Then

        Dim refNo As TextBox = GridView2.FooterRow.FindControl("InsertRefNo")
        Dim resource As TextBox = GridView2.FooterRow.FindControl("InsertResource")
        Dim hours As TextBox = GridView2.FooterRow.FindControl("InsertHours")
        Dim offset As TextBox = GridView2.FooterRow.FindControl("InsertOffset")

        Dim newResAlloc As DataTable = resourceInfo.loadResAllocations
        Dim newAllocRow As DataRow = newResAlloc.NewRow
        newAllocRow.ItemArray = New Object() {Nothing, refNo.Text, resource.Text, hours.Text, offset.Text}
        newResAlloc.Rows.Add(newAllocRow)

        resourceInfo.updateResAllocations(newResAlloc)

        GridView2_DataBind()  'Only called if IF is true
    End If


End Sub