开发者

Why isn't the new values pulling up when I update the GridViewRow?

So what's happening is that I click the Edit button, type the updated values and hit Update. But the code-behind gets the original values not the updated values. I can't figure out why. It's always worked before.

Markup

<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:&nbsp;<asp:TextBox ID="newRefNo" runat="server"/>
    Resource:&nbsp;<asp:TextBox ID="newResource" runat="server"/>
    Hours Allocated:&nbsp;<asp:TextBox ID="newHours" runat="server"/>
    Week Offset:&nbsp;<asp:TextBox ID="newOffset" runat="server"/>
    <asp:Button runat="server" ID="NewDataInsert" 
                CommandName="NewDataInsert" Text="Insert"/>
  </EmptyDataTemplate>  
</asp:GridView>

Code Behind

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 = " & "'" & capID.Text & "'")

    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开发者_C百科.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


This could be a million and one things. What have you checked? Have you narrowed it down?

Here's some starting points for you:

  • Put a breakpoint inside GridView2_RowUpdating to make sure it's being called.
  • Check the value of capID, or capID.Text - it shouldn't be 0.
  • Check that your database table contains a row where CapID equals the value of capID.Text
  • Put a breakpoint on updateRows to ensure that the database row is being loaded into your code.
  • Make sure that the updRow.EndEdit() is being hit, and that the values are populated into the row correctly.
  • Finally, check that the updateResAllocations is working properly. It's impossible to see from here how it works, so I can't give any advice on that.

The easiest way to fix this might be to ask whoever wrote it for some assistance.


The problem was that my RowCommand method was calling the DataBind

Wrong way:

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

Right way:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜