我已经继承了一个 ASP.NET 应用程序的维护,现在必须开发一个功能,尽管我知道答案一定很简单,但现在这个答案让我有点弯曲。
所以我在用户控件中有一个中继器控件。对于此转发器,数据绑定在代码隐藏上,然后相应地显示在转发器的子项上。每次在代码隐藏上绑定项目时,都会执行一个函数,我并不真正了解它在做什么。
这是 asp.net 代码:
<asp:Repeater ID="rptDocumentsForCategory" runat="server">
<ItemTemplate>
<div style="padding: 0px 10px;">
<a target="_blank" href='<%#EncoderService.HtmlAttributeEncode(DataBinder.Eval(Container.DataItem, "DocumentUrl") as string)%>'><asp:Literal ID="Literal1" runat="server" Text='<%#EncoderService.HtmlEncode(DataBinder.Eval(Container.DataItem, "DocumentName") as string)%>'></asp:Literal></a>
<%if (Mode == Curriculum.BLL.ControlMode.Edit)
{ %>
<asp:ImageButton ID="btnEdit" Height="10px" ImageUrl="~/Styles/Images/edit.png" ToolTip='<%$Resources:Main,Dialog_Title_UpdateWorkDocument%>' CommandName="EditItem" CommandArgument='<%#Eval("DocumentId")%>' runat="server" />
<asp:ImageButton ID="btnDelete" Height="10px" OnClientClick="javascript:return ShowConfirmationPopup();" ImageUrl="~/Styles/Images/delete.png" ToolTip='<%$Resources:Main,DeleteDocument%>' CommandName="DeleteItem" CommandArgument='<%#Eval("DocumentId")%>' runat="server" />
<%} %>
<div class="ViewWorkDocumentsFileData">
<%--<asp:Literal ID="LtDocDate" runat="server" Text='<%#Utilities.FormatDateTimeToDisplay(DataBinder.Eval(Container.DataItem, "DocumentDate"))%>'></asp:Literal>--%>
<asp:Literal ID="LtDocSize" runat="server" Text='<%#Utilities.ConvertBytesToKilobytes((int)DataBinder.Eval(Container.DataItem, "DocumentSize"))%>'></asp:Literal> Kb  | 
<asp:Literal ID="LtDocExt" runat="server" Text='<%#EncoderService.HtmlEncode(DataBinder.Eval(Container.DataItem, "DocumentExtension") as string)%>'></asp:Literal>
<div ID="DocumentCreationInfoPanel" runat="server" >
<asp:Literal ID="LtCreatedByLabel" runat="server" Text='<%$Resources:Main,CreatedBy_Label%>'></asp:Literal>
<asp:Literal ID="LtDocModification" runat="server" Text='<%#EncoderService.HtmlEncode(Curriculum.DataAccess.Membership.Users.GetUserDiplayNameForUsername(DataBinder.Eval(Container.DataItem, "DocumentCreatedBy") as string))%>'></asp:Literal> | 
<asp:Literal ID="LtDocDate" runat="server" Text='<%#Utilities.FormatDateTimeToDisplay(DataBinder.Eval(Container.DataItem, "DocumentDate"))%>'></asp:Literal>
</div>
<div ID="DocumentModifiedInfoPanel" runat="server" >
<asp:Literal ID="LtModifiedByLabel" runat="server" Text='<%$Resources:Main,ModifiedBy_Label%>'></asp:Literal>
<%--<asp:Literal ID="LtModifiedBy" runat="server" Text='<%#EncoderService.HtmlEncode((DataBinder.Eval(Container.DataItem, "DocumentModifiedBy") != DBNull.Value) ? Curriculum.DataAccess.Membership.Users.GetUserDiplayNameForUsername(DataBinder.Eval(Container.DataItem, "DocumentModifiedBy") as string) : HideDocumentsDetailInfo(DataBinder.Eval(Container.DataItem, "DocumentModifiedBy")))%>'></asp:Literal>--%><%-- | --%>
<asp:Literal ID="LtModifiedBy" runat="server" Text='<%#EncoderService.HtmlEncode(Curriculum.DataAccess.Membership.Users.GetUserDiplayNameForUsername(DataBinder.Eval(Container.DataItem, "DocumentModifiedBy") as string))%>'></asp:Literal> | 
<%--<asp:Literal ID="LtModifiedDateLabel" runat="server" Text='<%$Resources:Main,ModifiedDate_Label%>'></asp:Literal>--%>
<%--<asp:Literal ID="LtModifiedDate" runat="server" Text='<%#Utilities.FormatDateTimeToDisplay(DataBinder.Eval(Container.DataItem, "DocumentModifiedDate") as string) %>'></asp:Literal>--%>
<asp:Literal ID="LtModifiedDate" runat="server" Text='<%#Utilities.FormatDateTimeToDisplay(DataBinder.Eval(Container.DataItem, "DocumentModifiedDate")) %>'></asp:Literal>
</div>
</div>
</div>
</ItemTemplate>
<SeparatorTemplate>
<div></div>
</SeparatorTemplate>
</asp:Repeater>
现在,大部分代码已经存在。我在这里添加的是DocumentModifiedInfoPanel中的代码,以显示页面该部分的修改日期和用户(它与"附件"文档有关(。现在,如果我没有修改日期,该div 应该被隐藏(它仍然可以渲染,但仍然不可见(,我无法完成。
这是我的(相关(代码隐藏:
protected void rptDocCategories_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem ||
e.Item.ItemType == ListItemType.EditItem ||
e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.SelectedItem)
{
Repeater rptDocumentsForCategory = (Repeater)e.Item.FindControl("rptDocumentsForCategory");
rptDocumentsForCategory.ItemCommand += new RepeaterCommandEventHandler(rptDocumentsForCategory_ItemCommand);
}
}
protected void rptDocCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem ||
e.Item.ItemType == ListItemType.EditItem ||
e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.SelectedItem)
{
Literal LtDocCategoryId = (Literal)e.Item.FindControl("LtDocCategoryId");
Repeater rptDocumentsForCategory = (Repeater)e.Item.FindControl("rptDocumentsForCategory");
var ds = WorksDocumentCategories.GetDocumentsForCategoryAndWork(WorkId, int.Parse(LtDocCategoryId.Text));
rptDocumentsForCategory.DataSource = ds;
rptDocumentsForCategory.DataBind();
}
}
public string HideDocumentsDetailInfo(object DBValue)
{
foreach (RepeaterItem item in rptDocCategories.Items)
{
HtmlGenericControl div = (HtmlGenericControl)Utilities.Utilities.FindControlRecursive(item, "DocumentModifiedInfoPanel");
if (div.ID == "DocumentModifiedInfoPanel" && DBValue == DBNull.Value)
{
div.Attributes.Add("style", "display: none");
}
}
return "";
}
现在,HideDocumentsDetailInfo
方法由我编写。您可以尝试看到我在DocumentModifiedInfoPanel
内的第一个注释行中使用它。这种方法几乎有效,但附件文档列表中的最后一项将始终显示带有"空"修改日期的div,而不是 hdding 它。
我还注意到 rptDocCategories_ItemDataBound
方法在我自己的HideDocumentsDetailInfo
之后执行,我怀疑这可能是我无法隐藏要隐藏的项目"列表"上的最后一项的原因。
最后一点,我有点迷茫,因为我没有看到访问属性值的方法,所以我没有看到访问属性值的方法。
请问对此有什么想法吗?
好吧,我最终找到了一个非常简单的解决方案来解决这些问题的方法(老实说,我不知道为什么我没有早点想到它(。
此处的答案是捕获 LtModifiedDate
Literal 控件的 OnDataBinding
事件。
<asp:Literal ID="LtModifiedDate" runat="server" OnDataBinding="LtModifiedDate_DataBinding" Text='<%# Utilities.FormatDateTimeToDisplay(DataBinder.Eval(Container.DataItem, "DocumentModifiedDate")) %>'></asp:Literal>
有了这个,我所要做的就是评估日期,如果是DateTime.MinValue
我就继续在 DocumentModifiedInfoPanel
div 上设置 Visible
属性(我添加的(,默认情况下定义为 true。
protected void LtModifiedDate_DataBinding(object sender, EventArgs e)
{
//Cast the sender to it's type
Literal lit = (Literal)sender;
//Convert the DateTime Text value to a DateTime
DateTime dt = Convert.ToDateTime(lit.Text);
if (dt == DateTime.MinValue)
{
//Cast the parent control (the div) to a HtmlGenericControl
HtmlGenericControl div = (HtmlGenericControl)lit.Parent;
//Set the visible property to false
div.Visible = false;
}
}
就这么简单!