2013-10-13 74 views
0

我有一個充滿LinqDataSource沒有問題的DetailsView控件。如何使用TemplateField時填充DetailsViewUpdateEventArgs.OldValues

用戶在更新信息時需要上傳文件,因此,我在EditItemTemplate(itemTemplate只是一個asp標籤)內部創建了一個帶有asp:FileUpload控件的TemplateField。

的問題是,當我嘗試更新的數據,在DetailsView.OnItemUpdating的DetailsViewUpdateEventArgs.OldValues不包含所有的舊值(也鍵)。其實,它只是ArticleTitleArticleNumber

我吼聲,這是因爲其中的TemplateField,所以我從改變了ArticleDesc綁定列模板列的吡唑類,添加了一個多行文本框的EditItemTemplate裏和ASP標籤到的ItemTemplate,和它的工作罰款(ArticleDesc的原始價值在那裏)。

此問題可以通過其他方式解決,例如再次查詢數據,但我不喜歡該解決方案。另外,我想明白爲什麼會發生。

ASPX頁面

<asp:DetailsView ID="ModArticleDV" runat="server" AllowPaging="True" OnItemUpdated="ModArticleDV_ItemUpdated" OnItemUpdating="ModArticleDV_ItemUpdating" OnModeChanged="ModArticleDV_ModeChanged" OnDataBound="ModArticleDV_DataBound" OnDataBinding="ModArticleDV_DataBinding" AutoGenerateRows="False" DataSourceID="ArticleDS" DataKeyNames="ArticleID"> 
     <Fields> 
      <asp:BoundField DataField="ArticleID" HeaderText="ID" SortExpression="ArticleID" ReadOnly="true" /> 
      <asp:BoundField DataField="ArticleNumber" HeaderText="Número" SortExpression="ArticleNumber" /> 
      <asp:BoundField DataField="ArticleTitle" HeaderText="Título" SortExpression="ArticleTitle" ConvertEmptyStringToNull="false" /> 

      <asp:TemplateField HeaderText="Archivo PDF" SortExpression="ArticleFile"> 
       <EditItemTemplate> 
        Archivo Actual: <asp:Label ID="EditCurrentFileLbl" Text='<%# Eval("ArticleFile") %>' runat="server" /><br /> 
        <label class="upload-file">Nuevo Archivo</label>: <asp:FileUpload ID="NewFileUpload" runat="server" CssClass="file-upload" /> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="CurrentFileLbl" runat="server" Text='<%# Eval("ArticleFile") %>' /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Descripción" ConvertEmptyStringToNull="false"> 
       <EditItemTemplate> 
        <asp:TextBox ID="NewDescription" TextMode="MultiLine" Text='<%# Eval("ArticleDesc") %>' runat="server" /> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="CurrentDescription" Text='<%# Eval("ArticleDesc") %>' runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Cantidad de Páginas" SortExpression="ArticlePageCount" ConvertEmptyStringToNull="false"> 
       <EditItemTemplate> 
        <asp:UpdatePanel ID="CountPagesUP" runat="server" UpdateMode="Conditional"> 
         <Triggers> 
          <asp:AsyncPostBackTrigger ControlID="CountPagesLink" EventName="Click" /> 
         </Triggers> 
         <ContentTemplate> 
          Páginas: <asp:Label runat="server" ID="PageCountLabel" Text='<%# Eval("ArticlePageCount") %>' /> 
         </ContentTemplate> 
        </asp:UpdatePanel> 
        <asp:LinkButton ID="CountPagesLink" runat="server" OnClick="CountPagesLink_Click">Contar Páginas</asp:LinkButton> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="CurrentPageCountLbl" Text='<%# Eval("ArticlePageCount") %>' runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Pertenece al" SortExpression="MagazineID"> 
       <EditItemTemplate> 
        <asp:DropDownList ID="NewMagazine" runat="server" DataSourceID="MagazineDS" DataTextField="MagazineTitle" DataValueField="MagazineID" OnPreRender="NewMagazine_PreRender"></asp:DropDownList> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="CurrentMagazineLbl" runat="server" OnPreRender="CurrentMagazineLbl_PreRender" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Autores" SortExpression="ArticleID"> 
       <EditItemTemplate> 
        <label>Filtrar Autor</label>: <input type="text" class="search-in-list" title="Reduce la lista de autores. Ingrese el appellido paterno, materno y/o nombre. Debe incluir tildes de ser necesario." /><br /> 
        <asp:ListBox ID="NewAuthors" runat="server" CssClass="list-to-search" SelectionMode="Multiple" DataSourceID="AuthorDS" DataTextField="AuthorFullName" DataValueField="AuthorID" Height="206px" Width="292px" OnDataBound="NewAuthors_DataBound"></asp:ListBox> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="CurrentAuthorsLbl" runat="server" OnPreRender="CurrentAuthorsLbl_PreRender" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField Visible="false"> 
       <ItemTemplate> 
        <asp:Label ID="MagazineID" Text='<%# Eval("MagazineID") %>' runat="server" /> 
        <asp:Label ID="CurrentAuthorID" runat="server" OnPreRender="CurrentAuthorID_PreRender" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" UpdateText="Guardar" CancelText="Cancelar" SelectText="Seleccionar" NewText="Nuevo" InsertText="Agregar" EditText="Editar" DeleteText="Borrar" ControlStyle-CssClass="command-field-control" /> 
     </Fields> 
    </asp:DetailsView> 
    <asp:LinqDataSource ID="ArticleDS" runat="server" ContextTypeName="LinqToSql.FinderSchemaDataContext" EnableUpdate="True" OrderBy="ArticleID" TableName="Articles" EnableDelete="True" EntityTypeName=""></asp:LinqDataSource> 
    <asp:LinqDataSource ID="MagazineDS" runat="server" ContextTypeName="LinqToSql.FinderSchemaDataContext" EntityTypeName="" OrderBy="PublishYear, MagazineNumber" TableName="Magazines" Select="new (MagazineID, MagazineNumber, MagazineName, PublishYear, String.Format(&quot;Volumen {0} del año {1}&quot;, MagazineNumber.ToString(), PublishYear.ToString()) AS MagazineTitle)"></asp:LinqDataSource> 
    <asp:LinqDataSource ID="AuthorDS" runat="server" ContextTypeName="LinqToSql.FinderSchemaDataContext" EntityTypeName="" OrderBy="AuthorFName, AuthorMName, AuthorName" TableName="Authors" Select="new (AuthorID, AuthorFName, AuthorMName, AuthorName, String.Format(&quot;{0} {1} {2}&quot;, AuthorFName.ToString(), AuthorMName.ToString(), AuthorName.ToString()) AS AuthorFullName)" /> 

代碼

protected void ModArticleDV_ItemUpdating(object sender, DetailsViewUpdateEventArgs e) 
{ 

    Messages.InnerHtml = ""; 

    try 
    { 
     Messages.InnerHtml += "<h3>Old Values</h3><br />"; 
     foreach (DictionaryEntry de in e.OldValues) 
     { 
      Messages.InnerHtml += String.Format("Key: {1} - Value: {0}<br />", de.Value, de.Key); 
     } 

     Messages.InnerHtml += "<h3>New Values</h3><br />"; 
     foreach (DictionaryEntry de in e.NewValues) 
     { 
      Messages.InnerHtml += String.Format("Key: {1} - Value: {0}<br />", de.Value, de.Key); 
     } 

     e.Cancel = false; 
    } 
    catch (Exception ex) 
    { 
     Messages.InnerHtml += ex.Message; 
    } 
} 

背後,這說明我只有ArticleNumber和ArticleTitle

我有什麼企圖?

  • 使用綁定的,而不是評估和演示
  • 使用默認的DetailsView和填充的LinqDataSource與原始值e.OldValues,但我並沒有注意到其中的差別:(。
  • 我已經看了很多遍關於DetailsView,DetailsViewUpdateEventArgs和許多其他資源的MSDN文檔,但都沒有給出提示(我在某處讀到它可能是因爲TemplateField,但在我運行的測試中,它們工作正常)。
  • This question是相關的,但這是我一直向TemplateField添加數據的方式。

如果有人可以給我一些東西來理解它爲什麼會發生,或者如果有人能告訴我在哪裏填寫OldValues(ItemUpdating事件除外),那就太棒了:)。

在此先感謝。

回答

0

我確認詞典e。(新|舊)值未填滿TemplateField(s)中的數據。

我的解決方案(我不知道更好)是使用隱藏的TemplateField(Visible =「false」),並在ItemTemplate中添加帶有標籤(asp:Label)的原始值,然後使用DetailsView.FindControl( 「CONTROL_ID」):

<TemplateField Visible="false"> 
    <ItemTemplate> 
    <asp:Label ID="OriginalValue1" runat="server" Text='<%# Eval("Column1") %>' /> 
    <asp:Label ID="OriginalValueN" runat="server" Text='<%# Eval("ColumnN") %>' /> 
    </ItemTemplate> 
</TemplateField> 

而在代碼背後:一些測試,我已經與模板列運行工作

// DetailsView.ID = "MyDetailsView"; 
Label original1 = (Label)MyDetailsView.FindControl("OriginalValue1"); 
Label originalN = (Label)MyDetailsView.FindControl("OriginalValueN"); 

出於某種原因,我無法解釋(數據被添加到字典沒有我的干預),這就是爲什麼我感到困惑,並認爲這是一個錯誤。

無論如何,現在問題已經解決,我希望這可以幫助別人:)。

相關問題