2011-05-30 56 views
2

我正在使用DetailsView,但在更新時無法獲取OldValues,因爲ItemUpdating事件的DetailsViewUpdateEventArgs.OldValues始終爲空。 NewValues的值已確定。DetailsView的事件「ItemUpdating」中的OldValues集合始終爲空

注意:我沒有在我的應用程序中使用數據源組件(SqlDataSource,ObjectDataSource,EntityDataSource等)。在這種情況下,我應該手動做些什麼?

任何想法都會受到歡迎!

謝謝!

補充信息:

使用ASP.NET 4.0 I'm(Web窗體)

的代碼片段,我認爲相關如下:

<asp:DetailsView ID="customerDetails" runat="server" AutoGenerateRows="False" EmptyDataText="No data..." 
    meta:resourcekey="customerDetails" 
    onitemdeleting="customerDetails_ItemDeleting" 
    oniteminserting="customerDetails_ItemInserting" 
    onitemupdating="customerDetails_ItemUpdating" 
    onmodechanging="customerDetails_ModeChanging" 
    CssClass="customerDetails" DataKeyNames="CustomerID"> 
    <FooterTemplate> 
     <asp:LinkButton ID="lnkNew" Text="New" ToolTip="New Customer" CommandName="New" meta:resourcekey="lnkNew" runat="server" /> 
    </FooterTemplate> 
    <EmptyDataTemplate> 
     <p><asp:Label ID="lblNoDataHasBeenFound" Text="No data has been found." meta:resourcekey="lblNoDataHasBeenFound" runat="server" /></p> 
     <asp:LinkButton ID="lnkNew" Text="New" ToolTip="New Customer" CommandName="New" meta:resourcekey="lnkNew" runat="server" /> 
    </EmptyDataTemplate> 
    <Fields> 
     <%--CustomerID--%> 
     <asp:TemplateField HeaderStyle-CssClass="detailsHeader" ItemStyle-CssClass="detailsField"> 
      <HeaderTemplate> 
       <asp:Label ID="ltrCustomerIdLabel" meta:resourcekey="ltrCustomerId" Text="CustomerID:" runat="server" /> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <asp:Label ID="lblCustomerId" Text='<%# Eval("CustomerID") %>' runat="server" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:Label ID="lblCustomerId" Text='<%# Eval("CustomerID") %>' runat="server" /> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:TextBox ID="txtCustomerId" Text='<%# Bind("CustomerID") %>' MaxLength="5" width="50px" runat="server" /> 
       <cc1:DataAnnotationsValidator ID="CustomerIdValidator" Type="String" runat="server" ControlToValidate="txtCustomerId" PropertyName="CustomerID" Text="*" SourceType="DataLayerPOCO.Customer, DataLayerPOCO" CssError="validationError" Display="None"/> 
      </InsertItemTemplate> 
      <HeaderStyle HorizontalAlign="Right" /> 
      <ItemStyle HorizontalAlign="Left" /> 
     </asp:TemplateField> 

     <%--CompanyName--%> 
     <asp:TemplateField HeaderStyle-CssClass="detailsHeader" ItemStyle-CssClass="detailsField"> 
      <HeaderTemplate> 
       <asp:Literal ID="ltrCompanyNameLabel" meta:resourcekey="ltrCompanyName" Text="Company Name:" runat="server" /> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <asp:Literal ID="ltrCompanyName" Text='<%# Eval("CompanyName") %>' runat="server"/> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="txtCompanyName" Text='<%# Bind("CompanyName") %>' MaxLength="40" Width="310px" 
        runat="server" /> 
       <cc1:DataAnnotationsValidator ID="CompanyNameValidator" Type="String" runat="server" ControlToValidate="txtCompanyName" PropertyName="CompanyName" Text="*" SourceType="DataLayerPOCO.Customer, DataLayerPOCO" CssError="validationError" Display="None"/> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:TextBox ID="txtCompanyName" Text='<%# Bind("CompanyName") %>' MaxLength="40" Width="310px" 
        runat="server" /> 
       <cc1:DataAnnotationsValidator ID="CompanyNameValidator" Type="String" runat="server" ControlToValidate="txtCompanyName" PropertyName="CompanyName" Text="*" SourceType="DataLayerPOCO.Customer, DataLayerPOCO" CssError="validationError" Display="None"/> 
      </InsertItemTemplate> 
      <HeaderStyle HorizontalAlign="Right" /> 

     </asp:TemplateField> 
     ... 
     ... 
     other fields goes here 
     ... 
     ... 
     <%--Edit/Insert--%> 
     <asp:TemplateField HeaderStyle-CssClass="detailsHeader" ItemStyle-CssClass="detailsField"> 
      <ItemTemplate> 
       <asp:ImageButton ID="imgEdit" ImageUrl="~/img/pencil.png" meta:resourcekey="imgEdit" AlternateText="Edit" ToolTip="Edit Customer" CommandName="Edit" runat="server" CausesValidation="false"/> 
       <asp:ImageButton ID="imgDelete" ImageUrl="~/img/delete.png" meta:resourcekey="imgDelete" AlternateText="Delete" ToolTip="Delete Customer" CommandName="Delete" OnClientClick="return confirmDelete();" runat="server" CausesValidation="false"/> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:ImageButton ID="imgUpdate" ImageUrl="~/img/accept.png" meta:resourcekey="imgUpdate" AlternateText="Update" ToolTip="Update Customer" CommandName="Update" runat="server" /> 
       <asp:ImageButton ID="imgCancel" ImageUrl="~/img/cancel.png" meta:resourcekey="imgCancel" AlternateText="Cancel" ToolTip="Cancel Edit" CommandName="Cancel" runat="server" CausesValidation="false"/> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:ImageButton ID="imgSave" ImageUrl="~/img/disk.png" meta:resourcekey="imgSave" AlternateText="Save" ToolTip="Save Customer Data" CommandName="Insert" runat="server" CausesValidation="true"/> 
       <asp:ImageButton ID="imgCancelInsert" ImageUrl="~/img/cancel.png" meta:resourcekey="imgCancelInsert" AlternateText="Cancel" ToolTip="Cancel Insert" CommandName="Cancel" runat="server" CausesValidation="false"/> 
      </InsertItemTemplate> 
     </asp:TemplateField> 
    <Fields> 
</asp:DetailsView> 

事件ItemUpdating是像如下:

protected void customerDetails_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) 
    { 
     repository = repository ?? new NorthwindRepositoryEF(); 

     string id = e.Keys["CustomerID"] as string; 

     DataLayerPOCO.Customer customer = repository.GetCustomer(id); 

     string companyName = (string)e.NewValues["CompanyName"]; 
     string contactName = (string)e.NewValues["ContactName"]; 
     string contactTitle = (string)e.NewValues["ContactTitle"]; 
     string address = (string)e.NewValues["Address"]; 
     string city = (string)e.NewValues["City"]; 
     string region = (string)e.NewValues["Region"]; 
     string postalCode = (string)e.NewValues["PostalCode"]; 
     string country = (string)e.NewValues["Country"]; 
     string phone = (string)e.NewValues["Phone"]; 
     string fax = (string)e.NewValues["Fax"]; 

     // Update Customer with the new data 
     customer.CompanyName = companyName; 
     customer.ContactName = contactName; 
     customer.ContactTitle = contactTitle; 
     customer.Address = address; 
     customer.City = city; 
     customer.Region = region; 
     customer.PostalCode = postalCode; 
     customer.Country = country; 
     customer.Phone = phone; 
     customer.Fax = fax; 

     repository.UpdateCustomer(customer); 
     repository.Save(); 
     //--- 
     customerDetails.ChangeMode(DetailsViewMode.ReadOnly); 
     BindCustomerDetails(); 
     BindCustomersList(); 

    } 

問題是,如果我想處理舊值,我不能:

this,評估爲0: int oldValuesCount = e.OldValues.Count;

並且即使將值更改爲新值,計算結果爲null: string companyNameOld = e.OldValues [「CompanyName」] as string;

+1

你可以發佈你的代碼,你是怎麼做的? – 2011-05-30 15:14:21

+0

@MuhammadAkhtar,感謝您的關注。您已經提出了新的補充信息。 – outlookrperson 2011-05-30 18:08:05

回答

1

看起來舊數值只有在聲明性地限定數據源時纔會填充。

你必須在這種情況下兩種解決方法:

  1. 保存任何舊的價值觀,你可能需要在ViewState中和程式設計,當你想要它恢復。這節省了對數據庫的訪問。

  2. 更好的選擇是使用您在OnItemUpdating中定義的客戶變量,因爲它從數據庫查詢信息幷包含所有舊值。

希望它有幫助。