Asp.net
GridView 的 NewValues 和 OldValues 在 OnRowUpdating 事件中為空
我有下面的 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>
關於 GridView 控制項的 RowUpdating 事件問題,這是預期的行為,因為當我們不將 GridView(或其他 ASP.NET 2.0 數據綁定控制項)與 DataSource 控制項關聯時,它不會自動查詢和填充更新的參數集合/刪除/…事件。在這種情況下,我們需要手動從 Template 控制項中提取欄位值。
這是微軟員工在這裡所說的。
在這種情況下,您可以使用ExtractValuesFromCell方法自己創建 NewValues 集合。
編輯:
我在這篇部落格的評論中發現了一段程式碼:
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 }沒有測試過,但似乎解決了問題,如果解決了,請告訴我。
我不確定這是否會有所幫助..但這是我在 msdn網站上找到的
僅當使用 DataSourceID 屬性將 GridView 控制項綁定到數據時,才會自動填充 Keys、OldValues 和 NewValues 集合。