隐藏Div取决于UserControl上的数据绑定值

时间:2014-12-07 18:44:44

标签: c# asp.net data-binding event-handling

我继承了ASP.NET应用程序的维护,现在必须开发一个功能,虽然我知道答案必须简单,但是现在这个答案很难解决。

所以我在UserControl中有一个Repeater控件。对于此转发器,数据绑定在代码隐藏后,然后相应地显示在Repeater的子项上。 每当一个项目绑定在代码后面时,就会执行一个函数,我并不真正理解它在做什么。

这是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 &nbsp|&nbsp                                    
                <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>&nbsp|&nbsp
                    <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>--%><%--&nbsp|&nbsp--%>
                     <asp:Literal ID="LtModifiedBy" runat="server" Text='<%#EncoderService.HtmlEncode(Curriculum.DataAccess.Membership.Users.GetUserDiplayNameForUsername(DataBinder.Eval(Container.DataItem, "DocumentModifiedBy") as string))%>'></asp:Literal>&nbsp|&nbsp
                    <%--<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中的代码,用于向页面的该部分显示修改日期和用户(它与&#34;附件&#34;文档相关)。 现在,如果我没有修改日期,那么该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为&#34;空&#34;修改日期而不是修改它。

我还注意到rptDocCategories_ItemDataBound方法在我自己HideDocumentsDetailInfo之后执行,我怀疑这可能是我无法隐藏最后一项的原因在&#34;列表&#34;要隐藏的物品。

作为最后一点,如果我在ItemDataBound事件中能够做到这一点,我有点失落,因为我没有看到访问属性值的方法。

对此有何想法?

1 个答案:

答案 0 :(得分:0)

好吧,我最终通过一个非常简单的解决方案找到了解决这些问题的方法(老实说,我不知道为什么我之前没想到它。)

这里的答案是捕获OnDataBinding Literal控件的LtModifiedDate事件。

<asp:Literal ID="LtModifiedDate" runat="server" OnDataBinding="LtModifiedDate_DataBinding" Text='<%# Utilities.FormatDateTimeToDisplay(DataBinder.Eval(Container.DataItem, "DocumentModifiedDate")) %>'></asp:Literal>

有了这个,我所要做的就是评估日期,如果是DateTime.MinValue,我就继续在Visible上设置DocumentModifiedInfoPanel属性(我添加了) div,默认定义为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;
    }
}

这很简单!