2014-12-07 3 views
0

Я унаследовал обслуживание приложения ASP.NET и теперь должен разработать функцию, которая немного сгибает мой разум, хотя я знаю, что ответ должен быть простым, на данный момент этот ответ ускользает от меня.Скрыть Div в зависимости от значения привязки данных в UserControl

Итак, у меня есть элементы управления ретрансляторами внутри UserControl. Для этого ретранслятора данные привязаны по коду, а затем отображаются соответственно в Детском элементе ретранслятора. Каждый раз, когда элемент привязан к коду, выполняется выполнение функции, и я не понимаю, что она делает.

Это код 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, чтобы показать дату изменения и пользователя для этой части страницы (это связано с «прилагаемыми» документами). Теперь, если у меня нет измененной даты, этот 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, и я подозреваю, что это может быть причиной того, что я не могу скрыть последний элемент в «списке» элементов, которые нужно скрыть.

Как последнее замечание, я как бы проиграл, если и как могу это сделать в событии ItemDataBound, так как я не вижу способ доступа к значению свойств.

Любые мысли об этом, пожалуйста?

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Ну, это актуально не тегом, а скорее тем, как я пытаюсь это сделать, но, учитывая сходство, я предполагаю, что это приемлемо. –

+0

Оно больше походило на метаданные, чем на данные, если вы знаете, что я имею в виду. –

ответ

0

Ну, в конце концов я нашел путь вокруг этих проблем с очень простым решением (что, честно говоря, я не знаю, почему я об этом не думал раньше).

Ответ здесь заключается в том, чтобы зафиксировать событие OnDataBinding для 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, определенного для истинно по умолчанию.

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; 
    } 
} 

Простой как это!

Смежные вопросы