2017-04-06 4 views
0

이런 느낌은 쉬워야합니다.하지만 하루 종일 돌아 다니다 보니 도움이 필요합니다. Web Forms 앱이 있고 AJAX Control Toolkit (v16.1)에서 아코디언을 만들었습니다. 내 코드 숨김은 입력 폴더에서 파일 목록을 가져온 다음 반복합니다. 거기에 논리를 정렬하지만 요점은 이러한 각 파일은 6 미리 정의 된 아코디언 창 헤더 사이에 적절한 장소가 있다는 것입니다. 콘텐츠는 내 정렬 논리를 충족시키는 데 필요한만큼 많은 클릭 가능한 버튼을 포함합니다. 버튼을 클릭하면 내 DB 컨텍스트의 get() 메서드가 호출되어 근처 패널에 GridView를 채 웁니다. 예를 들어 Microsoft Outlook을 생각해 볼 수 있습니다. 이메일은 날짜순으로 정렬되고 개별적으로 클릭 할 수 있으며 인근 뷰에서 렌더링됩니다.AJAX Toolkit 아코디언 안에 버튼을 어떻게 동적으로 추가 할 수 있습니까?

내 문제는 파일이 현재 아코디언 창의 콘텐츠 영역에 LiteralControl로 입력되어 있다는 것입니다. 대신 단추를 추가하려고하지만 다른 제안이 가능합니다. 클릭만으로 GridView를 적절하게 채울 수 있습니다. 여기에 귀하의 도움에 미리, 그리고 감사드립니다 ... 내 코드의 일부는 숙고 할 Default.aspx를

... 

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <asp:GridView ID="TransactionGridView" runat="server" DataSourceID="TransactionODS" CellPadding="4" ForeColor="#333333" GridLines="None" > 
     <AlternatingRowStyle BackColor="White" /> 
     <EditRowStyle BackColor="#2461BF" /> 
     <FooterStyle BackColor="#5078B3" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="#5078B3" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> 
     <RowStyle BackColor="#D3DEEF" /> 
     <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
     <SortedAscendingCellStyle BackColor="#F5F7FB" /> 
     <SortedAscendingHeaderStyle BackColor="#6D95E1" /> 
     <SortedDescendingCellStyle BackColor="#E9EBEF" /> 
     <SortedDescendingHeaderStyle BackColor="#4870BE" /> 
    </asp:GridView> 
    <asp:ObjectDataSource ID="TransactionODS" runat="server" SelectMethod="GetTransactionSet" TypeName="ZipApprove.Models.TransactionRepository"></asp:ObjectDataSource> 
</asp:Content> 

<asp:Content ID="HistoryNavigationContent" ContentPlaceHolderID="NavigationPanel" runat="server"> 
    <ajaxToolkit:Accordion 
     ID="HistoryAccordion" 
     runat="server" 
     SelectedIndex="0" 
     HeaderCssClass="accordionHeader" 
     HeaderSelectedCssClass="accordionHeaderSelected" 
     ContentCssClass="accordionContent" 
     AutoSize="None" 
     Height="450" 
     FadeTransitions="true" 
     TransitionDuration="250" 
     FramesPerSecond="40" 
     RequireOpenedPane="false" 
     SuppressHeaderPostbacks="true"> 
     <Panes></Panes> 
     <HeaderTemplate></HeaderTemplate> 
     <ContentTemplate></ContentTemplate> 
    </ajaxToolkit:Accordion> 
</asp:Content> 

하여 default.aspx.cs

public partial class _Default : Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      var files = 
       Directory.GetFiles(
        Server.MapPath("Output_Files"), 
        "*.*", 
        SearchOption.AllDirectories 
       ); 

      // Create the date panes and give them a header 

... 
      AccordionPane lastWeek = new AccordionPane(); 
       lastWeek.HeaderContainer.Controls 
        .Add(new LiteralControl("A Week Ago")); 

... 

      foreach (var file in files) 
      { 
       var fileInfo = new FileInfo(file);     

       if (fileInfo.Extension == ".csv") 
       { 
        string fileDTString = 
         fileInfo.Name.Substring(
          fileInfo.Name.Length - 16, 
          12 
         ); 
        DateTime dateTime = 
         DateTime.ParseExact(
          fileDTString, 
          "MMddyyyyHHmm", 
          CultureInfo.InvariantCulture 
         ); 

... 

        else if (
         dateTime >= 
          DateTime.Now 
          .AddDays(-7) 
          .AddHours(-DateTime.Now.Hour) 
          .AddMinutes(-DateTime.Now.Minute) && 
         dateTime < 
          DateTime.Now 
           .AddDays(-1) 
           .AddHours(-DateTime.Now.Hour) 
           .AddMinutes(-DateTime.Now.Minute) 
        ) 
        { 
         // Parsed between 1 week ago at midnight and up to, not 
         // including, midnight of the case above       
         lastWeek.ContentContainer.Controls.Add(
          new LiteralControl(
           fileInfo.Name.Substring(
            0, fileInfo.Name.Length - 4 
           ) 
          ) 
         ); 
         lastWeek.ContentContainer.Controls.Add(
          new Literal() 
          { 
           Mode = LiteralMode.PassThrough, 
           Text = "<br/><br/>" 
          } 
         ); 
        } 
        else if (

... 

       } // End of CSV "If" 
      } // End of looping through files 

... 

      HistoryAccordion.Panes.Add(lastWeek); 

... 

     } // End of Page Load method 
    } // End of class 
} // End of namespace 

입니다 사이트. 마스터 *

... 

<div id="panelsDiv" style="display:flex"> 
    <div 
     ID="NavigationPanelContainer" 
     style=" 
      margin: 5px 5px 5px 5px; 
      width: 250px; 
      overflow-y: auto; 
      color: black; 
      height: 500px"> 
     <asp:ContentPlaceHolder ID="NavigationPanel" runat="server"></asp:ContentPlaceHolder> 
    </div> 
    <div class="container body-content" 
     ID="ContentPanelContainer" 
     style=" 
      flex: 1; 
      height: 500px; 
      margin: 5px 5px 5px 5px; 
      overflow-y: auto;"> 
     <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
    </div> 
</div> 

... 
패널 enter image description here

이 두 파일 이름

의 1을 보여주는

예 실행을 클릭해야합니다. 어떤 아이디어?

+1

리터럴 대신 패널을 사용하고 버튼이나 링크를 추가하지 않는 이유는 무엇입니까? 또한 여기에 하이퍼 링크 또는 단추가 아닌 리터럴 파일 이름을 추가하는 것이 보입니까? 새로운 LiteralControl (fileInfo.Name.Substring (0, fileInfo.Name.Length - 4) – Krishna

+0

@Krishna, 고맙습니다. 내가 제안한대로 패널을 사용 했으므로 그 트릭을 수행했습니다. 답변을 공식적으로 추가하여 내가 표시 할 수 있도록 할 것입니다. 맞아? 다시 한번 감사드립니다! –

답변

1

Literals 대신 패널을 추가하여 버튼을 추가 할 수 있습니다.

Panel pnl = new Panel(); 
LinkButton lnkbtnFile = new LinkButton(); 
lnkbtnFile.Text = "A Week Ago"; 
pnl.Controls.Add(lnkbtnFile); 
AccordionPane lastWeek = new AccordionPane(); 
       lastWeek.HeaderContainer.Controls 
        .Add(pnl);