2014-08-31 7 views
1

데이터를 동적으로 채워 테이블을 표시해야하는데 구조와 레이아웃이 약간 복잡하기 때문에 데이터에 사용자 지정 논리로 렌더링되는 리피터를 사용합니다.리피터에 서버 컨트롤을 동적으로 추가하는 방법은 무엇입니까?

일반 사용자는 모든 데이터가 원활하게 표시되지만 웹 사이트 관리자는 일부 작업을 허용해야하지만 ... 쉽고 편리한 방법은 없습니다. 해야한다 (편집 할 MyValue를 표시

  1. 세포 내 마음에 오는 어떤

    는 다음과 같이 작성하는 것입니다 :

    <asp:Repeater ID="TeamsRepeater" runat="server"> 
        <HeaderTemplate> 
         <table class="t_data"><thead> 
          ... some header controls here ... 
         </thead><tbody> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <tr> 
          <td>...</td> 
          <td><%#((MyObject)Container.DataItem).MyValue%></td> 
          <td runat="server"><asp:TextBox Value=<%#((MyObject)Container.DataItem).MyValue%></td> 
          <td runat="server"><asp:button Text="Update"/></td> 
         </tr> 
        </ItemTemplate> 
         </tbody></table> 
    </asp:Repeater> 
    

    을 플러스 나는 3의 가시성을 업데이트합니다 로직을 추가 할 필요가

  2. 편집 가능한 MyValue를 표시하는 셀 (관리자에게 표시되어야 함)
  3. 업데이트 버튼이 포함 된 셀 (반드시 v이어야 함) 관리자가 업데이트 할 수 있도록 관리자에게 공개).

나는 이런 식으로 진행하면 코드가 추한 것, 내가 정말 심지어 내가 그것을 구현할 수있는 방법을 어떤 식 으로든 표시되지 않는 느낌이 ...

질문 :

방법이해야 서버 컨트롤의 가시성을 변경합니까?

어떤 조언도 환영합니다!

감사합니다.

P. 내 웹 사이트는 ASP.NET 4.0을 사용하여 작성되었습니다 (ASP.NET 4.5로 업그레이드 할 수는 있지만).

답변

1

음, 그렇게 간단한 작업은 아닙니다. 귀하의 경우에는 리피터를 완벽하게 사용자 정의해야하고 컨트롤에 액세스하고 속성을 변경해야하며 버튼이 있어야하며 이벤트 처리기를 할당해야합니다.
내 대답은 약간 길 수도 있지만 ASP.NET Repeater을 완전히 사용자 정의해야한다고 생각합니다.

단계별 답변을 따르십시오. 리피터에 바인딩 ID 및 제목 :

가정

우리는 두 개의 열을 가진 테이블을 가지고있다. 우리는 3 개 제어가 중계기 내부

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
<ContentTemplate> 
    <asp:Repeater ID="rptMyRepeater" ClientIDMode="AutoID" runat="server" OnItemDataBound="rptMyRepeater_ItemDataBound" OnItemCommand="rptMyRepeater_ItemCommand" DataSourceID="SqlDataSource1"> 
     <ItemTemplate> 
      <asp:TextBox ID="txtMyTextBox" runat="server"></asp:TextBox> 
      <asp:Button ID="btnSowID" CommandName="ShowID" runat="server" Text="Show ID" /> 
      <asp:Button ID="btnShowTitle" CommandName="ShowTitle" runat="server" Text="Show Title" /> 
      <br /><br /> 
     </ItemTemplate> 
    </asp:Repeater> 
    <asp:Label ID="lblMsg" runat="server" Text=""></asp:Label> 
</ContentTemplate> 
</asp:UpdatePanel> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:postdataConnectionString %>" SelectCommand="SELECT * FROM [Titles]"></asp:SqlDataSource> 

: 두 개의 버튼과 하나의 텍스트 상자 및 리피터 외부 라벨 (lblMsg이)가

enter image description here

  • 우리는이 같은 ASPX 페이지가 있습니다.


  • 시나리오 :

    1. 우리는 텍스트 상자에 제목을 표시합니다.
    2. 홀수 ID 용 단추 표시 및 짝수 ID 용 숨기기 단추.
    3. 각 버튼을 클릭하면 관련 행의 ID 또는 제목을 표시합니다.

      이 시나리오는 다른 모든 시나리오를 다루고 있으며 코드를 수정하여 다른 작업을 수행 할 수 있다고 생각합니다.


    연습 : 첫 번째 목표에 도달하기

    1.In 위해 우리가 ItemDataBound 이벤트 처리기 사용 : 위에서

    protected void rptMyRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) 
    { 
        System.Data.DataRowView dataItem = e.Item.DataItem as System.Data.DataRowView; 
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
        { 
         TextBox txtMyTextBox = e.Item.FindControl("txtMyTextBox") as TextBox; 
         txtMyTextBox.Text = dataItem.Row["Title"].ToString(); 
        } 
    } 
    

    우리는 리피터의 텍스트 상자를 찾을 수 데이터베이스에서 Title Column을 지정하십시오.

    아웃풋 :

    Button btnSowID = e.Item.FindControl("btnSowID") as Button; 
    Button btnShowTitle = e.Item.FindControl("btnShowTitle") as Button; 
    if (Convert.ToInt32(dataItem.Row["ID"]) % 2 == 0) 
    { 
        btnSowID.Visible = false; 
        btnShowTitle.Visible = false; 
    } 
    

    을 상기에서 :
    enter image description here

    2.Now는 우리가 너무이 부분을 추가 홀수 ID에 대한 버튼을 표시 심지어 ID에 대해 그들을 숨기려면 우리는 Repeater에서 btnSowID와 btnShowTitle을 찾고이 행의 ID가 심지어 관련 버튼의 가시성을 false로 설정했는지 확인합니다. 다른 조건을 구현할 수 있다는 것은 명백합니다. 현재 사용자가 관리자 인 경우 버튼을 표시합니다.

    아웃풋 : 우리가 추가 할
    enter image description here

    3.Now가 Repater의 각 버튼에 대한 핸들러를 클릭합니다. 우리가 설정 한 ASPX 코드에서 알 수 있듯이 CommandName 버튼 속성은 앞으로이 속성을 사용합니다.
    최종 목표는 각 버튼을 클릭하는 것입니다. lblMsg은 관련 버튼이 클릭 한 동일한 행의 ID 또는 제목을 표시합니다. 그래서 우리는 클릭 된 버튼의 행을 인식해야합니다.
    관련 ID 또는 제목 값을 CommandArgument에 할당하려면 ItemDataBound 핸들러 아래에있는 각 버튼의 속성을 지정하십시오.
    그래서 최종 ItemDataBound은 다음과 같이해야합니다 : 리피터 내부가 버튼의 클릭 이벤트를 잡기 위해

    protected void rptMyRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) 
        { 
         System.Data.DataRowView dataItem = e.Item.DataItem as System.Data.DataRowView; 
         if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
         { 
          TextBox txtMyTextBox = e.Item.FindControl("txtMyTextBox") as TextBox; 
          txtMyTextBox.Text = dataItem.Row["Title"].ToString(); 
    
          Button btnSowID = e.Item.FindControl("btnSowID") as Button; 
          btnSowID.CommandArgument = dataItem.Row["ID"].ToString(); 
    
          Button btnShowTitle = e.Item.FindControl("btnShowTitle") as Button; 
          btnShowTitle.CommandArgument = dataItem.Row["Title"].ToString(); 
    
          if (Convert.ToInt32(dataItem.Row["ID"]) % 2 == 0) 
          { 
           btnSowID.Visible = false; 
           btnShowTitle.Visible = false; 
          } 
         } 
        } 
    

    우리가 ItemCommand 처리기를 사용합니다. 이 핸들러는 Repeater 내부의 컨트롤 이벤트를 잡아서 처리하는 데 도움이됩니다. 그래서 우리는이 같은 ItemCommand 처리기를 정의

    protected void rptMyRepeater_ItemCommand(object source, RepeaterCommandEventArgs e) 
        { 
         switch (e.CommandName) 
         { 
          case "ShowID": 
           lblMsg.Text = e.CommandArgument.ToString(); 
           break; 
    
          case "ShowTitle": 
           lblMsg.Text = e.CommandArgument.ToString(); 
           break; 
         } 
        } 
    

    위에서 우리는 ASPX 코드에서 수동으로 설정 한 CommandName 속성을 확인하고 클릭 ShowID 버튼 또는 ShowTitle 버튼입니다 결정합니다. 첫 번째 단계에서 Button을 찾을 수 있는지 확인하십시오. 따라서 우리는 ItemDataBound 처리기 아래에서 동적으로 설정된 CommandArgument 속성을 읽습니다.

    은 또한 당신이 btnEdit 및 btnRemove처럼 버튼을 만들려면이 방법을 사용할 수 있습니다, 편집으로 CommandName의 설정 및 제거하고 행 ID로 CommandArgument을 설정하고 업데이트를 수행하거나 ItemCommand 처리기에서 데이터베이스에서 삭제합니다.

    아웃풋 :
    enter image description here

    +0

    자세한 답변을 가져 주셔서 감사합니다. 내가이 접근법을 알고 대체물을 찾고있을 때 내 지식은 실제로 필요하지 않았습니다. 그러나 나는 그것이 다른 사람들에게 도움이 될 것이라고 강력히 믿습니다. – Budda

    +0

    @Budda : 어쩌면 aspx 페이지에서 인라인 코드 솔루션을 찾고 있다고 느꼈을 것입니다. (분명히 언급하지 않았다고 생각합니다.) 미래에는 인라인 솔루션으로 이벤트 처리에 문제가 발생할 것이라고 생각합니다. 아마도 시나리오의 변경에서도 코드보기가 더러 우며 두 경우에는'ItemCommand' 핸들러를 사용해야한다고 생각합니다. 그래서 나는 CodeBehind 솔루션이 더 깔끔하고 유연하다고 생각한다. 죄송합니다.이 답변이 정확히 원하는 것이 아니 었으면. – Moshtaf

    +0

    그래, 몇 가지 유형의 인라인 솔루션을 찾고있었습니다. 그러나 가능한 경우라도 그것은 읽을 수없고 유지할 수없는 것처럼 보입니다. 그러니 아이디어를 가져 주셔서 감사합니다. 이미 구현 된 :) – Budda

    1

    올바른 방법입니다. 그러나, 나는 당신의 객체에 모든 가시성 로직을 캡슐화하고 바인딩 표현식에 else 논리가 있으면 피할 것이다.

    관련 문제