GridView的NewValues和OldValues在OnRowUpdating事件中为空

时间:2010-03-12 01:12:44

标签: asp.net gridview asp.net-3.5

我有下面的GridView。我绑定到后面的代码中的自定义数据源。它进入“OnRowUpdating”事件就好了,但没有NewValues或OldValues。关于如何获得这些价值的任何建议?

<asp:GridView   ID="gv_Personnel" 
                        runat="server" 
                        OnRowDataBound="gv_Personnel_DataBind" 
                        OnRowCancelingEdit="gv_Personnel_CancelEdit" 
                        OnRowEditing="gv_Personnel_EditRow" 
                        OnRowUpdating="gv_Personnel_UpdateRow"
                        AutoGenerateColumns="false" 
                        ShowFooter="true" 
                        DataKeyNames="BudgetLineID"
                        AutoGenerateEditButton="true" 
                        AutoGenerateDeleteButton="true"
                        >
            <Columns>                 
                <asp:BoundField HeaderText="Level of Staff" DataField="LineDescription" />
                <%--<asp:BoundField HeaderText="Hrs/Units requested" DataField="NumberOfUnits" />--%>
                <asp:TemplateField HeaderText="Hrs/Units requested">
                    <ItemTemplate>
                        <%# Eval("NumberOfUnits")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:TextBox ID="tb_NumUnits" runat="server" Text='<%# Bind("NumberOfUnits")%>' />
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:BoundField HeaderText="Hrs/Units of Applicant Cost Share" DataField="" NullDisplayText="0" />
                <asp:BoundField HeaderText="Hrs/Units of Partner Cost Share" DataField="" NullDisplayText="0" />
                <asp:BoundField FooterStyle-Font-Bold="true" FooterText="TOTAL PERSONNEL SERVICES:" HeaderText="Rate" DataFormatString="{0:C}" DataField="UnitPrice" />
                <asp:TemplateField HeaderText="Amount Requested" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right"  FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
                <asp:TemplateField HeaderText="Applicant Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
                <asp:TemplateField HeaderText="Partner Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
                <asp:TemplateField HeaderText="Total Projet Cost" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/>
            </Columns>
        </asp:GridView>

5 个答案:

答案 0 :(得分:5)

我不确定这是否会有所帮助..但这是我在msdn site

中找到的
  

只有在使用DataSourceID属性将GridView控件绑定到数据时,才会自动填充Keys,OldValues和NewValues集合。

答案 1 :(得分:4)

  

关于GridView控件   RowUpdating事件问题,它是   预期的行为,因为我们这样做   不关联GridView(或其他   用ASP.NET 2.0数据绑定控件)   DataSource控件,它不会   自动查询并填写   参数集合   更新/删除/ ...事件。在这样的   例如,我们需要手动提取   模板中的字段值   控制。

这就是here中的Microsoft员工所说的。

在这种情况下,您可以使用ExtractValuesFromCell方法自行创建NewValues集合。

编辑:

我在this博客的评论中找到了一段代码:

protected void OnRowEditing(object sender, GridViewEditEventArgs e)
{     
       GridView gv = (GridView)sender;
       gv.EditIndex = e.NewEditIndex;
       gv.DataBind();
       ...
}

protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e)
{
   GridView gv = (GridView)sender;
   for (int i = 0; i < gv.Columns.Count; i++)
   {
      DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell;
      gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true);
   }
   // now you can use NewValues collection normally
}

没有对它进行过测试,但似乎解决了这个问题,如果有的话请告诉我。

答案 2 :(得分:2)

我在我的Page_Load事件中进行数据绑定,当我点击“更新”时,PostBack已经完成,因此触发了Page_Load事件。 GridView再次填充旧值,因此在myGrid.RowUpdating事件中,我无法检索新值。如果这有帮助

答案 3 :(得分:1)

在Page PreRender事件处理程序中绑定如下:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    GridBinder()
End Sub

注意:PreRender发生在RowUpdating事件之后。

答案 4 :(得分:0)

您需要在表单加载中检查IsPostback。当gridview的Update执行回发时,它首先使用旧值刷新。使用IsPostback来防止这种情况:

If Not IsPostback Then 

   ' Data bind here

End If

这样,它不会覆盖“新”gridview值