我有一個充滿LinqDataSource沒有問題的DetailsView控件。如何使用TemplateField時填充DetailsViewUpdateEventArgs.OldValues
用戶在更新信息時需要上傳文件,因此,我在EditItemTemplate(itemTemplate只是一個asp標籤)內部創建了一個帶有asp:FileUpload控件的TemplateField。
的問題是,當我嘗試更新的數據,在DetailsView.OnItemUpdating的DetailsViewUpdateEventArgs.OldValues不包含所有的舊值(也鍵)。其實,它只是ArticleTitle和ArticleNumber。
我吼聲,這是因爲其中的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("Volumen {0} del año {1}", 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("{0} {1} {2}", 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事件除外),那就太棒了:)。
在此先感謝。