Asp.net

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

  • April 17, 2013

我有下面的 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 集合。

引用自:https://stackoverflow.com/questions/2429864