2010-03-12 20 views
8

Tôi có GridView dưới đây. Tôi đang ràng buộc với một nguồn dữ liệu tùy chỉnh trong mã phía sau. Nó được đưa vào sự kiện "OnRowUpdating", nhưng không có NewValues ​​hoặc OldValues. Bất kỳ đề xuất nào về cách tôi có thể nhận được các giá trị này?NewValues ​​và OldValues ​​GridView của trống trong trường hợp OnRowUpdating

<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> 

Trả lời

4

Về vấn đề trên sự kiện RowUpdating điều khiển GridView, nó là hành vi dự kiến ​​ bởi vì khi chúng ta làm không liên kết GridView (hoặc ASP.NET kiểm soát 2.0 databound khác) với kiểm soát DataSource, nó đã giành 't tự động truy vấn và điền vào bộ sưu tập thông số của sự kiện cập nhật/xóa/.... Trong các trường hợp như vậy, chúng ta cần phải giải nén giá trị trường trường từ điều khiển mẫu .

Đây là điều mà nhân viên của Microsoft nói ở here.

Trong trường hợp đó, bạn có thể làm điều đó bằng cách sử dụng phương pháp ExtractValuesFromCell để làm cho bộ sưu tập NewValues ​​mình.

EDIT:

Tôi tìm thấy một đoạn mã trong các ý kiến ​​của this blog:

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 
} 

havent thử nghiệm nó, nhưng dường như để giải quyết vấn đề này, cho tôi biết nếu nó đã làm.

+0

thử e.Keys thay vì gv.Columns [i] .ExtractValuesFromCell (e.NewValues, cell, – ONYX

5

Im không chắc chắn nếu điều này sẽ help..but đây là những gì tôi tìm thấy trong MSDN site

Các Keys, OldValues ​​và NewValues ​​bộ sưu tập sẽ được tự động dân cư chỉ khi điều khiển GridView là ràng buộc để dữ liệu bằng cách sử dụng thuộc tính DataSourceID.

+0

Vậy bạn nói rằng những giá trị chỉ có thể được sử dụng nếu bạn đang xác định và sử dụng một nguồn dữ liệu trên trang aspx? –

+0

Tôi không chắc chắn cho tôi đã không cố gắng nhưng tuyên bố nói rằng bạn cần phải sử dụng tài sản DataSourceID trong ràng buộc với GridView. Tôi có thể thử điều đó và xem bạn có thể gán một ID cho một nguồn dữ liệu và ràng buộc nó trong mã phía sau.Nếu không, tôi sẽ thử đề xuất bên dưới =) – hallie

1

tôi đang làm databinding trong sự kiện Page_Load của tôi và khi tôi nhấp vào "Cập nhật" những PostBack đã được thực hiện, vì vậy là sự kiện Page_Load bị sa thải. GridView đã được lấp đầy với các giá trị cũ một lần nữa, vì vậy trong myGrid.RowUpdating sự kiện tôi không thể lấy giá trị mới. Nếu đây giúp

0

Bạn cần phải kiểm tra các IsPostBack trong load form. Khi Cập nhật của GridView thực hiện postback, lần đầu tiên nó được làm mới với các giá trị cũ. Sử dụng IsPostBack để ngăn chặn điều này:

If Not IsPostback Then 

    ' Data bind here 

End If 

Bằng cách này, nó sẽ không ghi đè lên "mới" giá trị GridView

+1

Điều này không giải thích tại sao * giá trị cũ * là rỗng và do đó không phải là giải pháp Đó là một sai lầm phổ biến, tuy nhiên, để rebind lưới willy nilly. – MetalPhoenix

1

Bind trong xử lý sự kiện Trang PreRender như thế này:

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

NB: PreRender diễn ra sau sự kiện RowUpdating.

Các vấn đề liên quan