asp.net 목록 보기에서 열을 숨기는 방법을 아는 사람이 있습니까?

StackOverflow https://stackoverflow.com/questions/70758

  •  09-06-2019
  •  | 
  •  

문제

컨트롤을 숨기기 위해 ItemTemplate에 <% ​​if %> 문을 넣을 수 있지만 열은 여전히 ​​거기에 있다는 것을 알고 있습니다.열 머리글이 선언되는 LayoutTemplate에 <% ​​%> 문을 넣을 수 없으므로 문제가 발생합니다.더 좋은 방법을 아는 사람이 있나요?

도움이 되었습니까?

해결책

방금 수행한 또 다른 솔루션은 다음과 같습니다. 귀하가 원하는 작업이 무엇인지 이해하고 있습니다.

ASCX / ASPX는 다음과 같습니다.

    <asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder" OnDataBound="ListView1_DataBound">
        <LayoutTemplate>
            <table border="1">
                <tr>
                    <td>Name</td>
                    <td>Age</td>
                    <td runat="server" id="tdIsSuperCool">IsSuperCool</td>
                </tr>
                <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
            </table>
        </LayoutTemplate>
        <ItemTemplate>
            <tr>
                <td><%# Eval("Name") %></td>
                <td><%# Eval("Age") %></td>
                <td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>true</td>
            </tr>
        </ItemTemplate>
    </asp:ListView>
    <asp:ObjectDataSource 
        ID="MyDataSource" 
        runat="server" 
        DataObjectTypeName="BusinessLogicLayer.Thing" 
        SelectMethod="SelectThings"
        TypeName="BusinessLogicLayer.MyObjectDataSource" />

뒤에 있는 코드는 다음과 같습니다.

/// <summary>
/// Handles the DataBound event of the ListView1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void ListView1_DataBound(object sender, EventArgs e)
{
    ListView1.FindControl("tdIsSuperCool").Visible = false;
}

데이터바운드에서 원하는 대로 수행하세요.이제 열이 서버에서 실행되고 컨트롤의 DataBound를 처리하고 있기 때문에 ListView1.FindControl("tdIsSuperCool")을 수행하면 레이아웃 템플릿에 있게 되어 챔피언처럼 작동합니다.

TD의 가시성을 제어하려는 비즈니스 로직을 넣으면 좋습니다.

다른 팁

패널을 사용해 보시고 켜거나 끌 수 있습니다

 foreach (ListViewItem item in ListView1.Items)
 {
     ((Panel)item.FindControl("myPanel")).Visible= False;
 }

ListView를 사용하면 데이터가 클라이언트에 렌더링되는 방식을 완전히 제어할 수 있습니다.레이아웃 템플릿을 지정하고 각 항목이 삽입될 자리 표시자를 제공합니다.

아래 출력은 테이블을 제공하며 각 항목은 새로운 TR이 됩니다.

runat='server' 사용에 주목하세요. visible ='<%# %>'

<asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder">
    <LayoutTemplate>
        <table>
            <asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>
                <%# Eval("SuperCoolIcon") %>
            </td>
            <td>
                <%# Eval("Name") %>
            </td>
            <td>
                <%# Eval("Age") %>
            </td>
        </tr>
    </ItemTemplate>
</asp:ListView>

아주 오래된 질문이라는 건 알지만 실제로는 이 작업을 해야 하고 jquery와 CSS를 통해 꽤 좋은 방법을 찾았다고 생각합니다.

헤더에 다음을 추가합니다.

<script type="text/javascript" src="Scripts/jquery-1.7.1.min.js" ></script>
  <style>
    .hide {
      display:none;
    }
    .show {
      display:block;
    }
  </style>

숨기려는 모든 열에 대해 td/th에 사용자 정의 속성을 추가합니다.

<th runat="server" data-prop='authcheck'  id="tdcommentsHeader"  >Comments</th>

간단히 말해서, 일석이조의 새 떼를 죽일 수 있기 때문에 나는 사용자 정의 속성을 사용하도록 조언하고 있습니다.id 속성을 기반으로 하는 것처럼 각 열의 값을 변경할 필요도 없습니다.

다음으로, 열을 숨길지 여부를 알려주는 숨겨진 필드가 있는지 확인하세요.이는 asp:HiddenField 또는 양식에 있는 한 다른 것일 수 있습니다.

<asp:HiddenField runat="server" ID="IsAuthorized" Value="false" />

마지막으로 페이지 하단에서 다음을 수행합니다.

        <script type="text/javascript">
          $(document).ready(function () {
            var isauth = $("[id='IsAuthorized']").val();
              if (isauth==="false") {
              $("[data-prop='authcheck']").addClass('hide');
              //$("[id*='tdcomments']").addClass('hide'); 
            }
          });
      </script>

더 나은 방법을 찾지 못하면 언제든지 열 너비를 0(영)으로 설정할 수 있습니다.

리스트뷰는 단지 리스트로 의도되었기 때문에 '열'이라는 개념이 실제로 없습니다.

ListView에 '무언가' 목록을 첨부하기 위해 데이터 바인딩을 사용하고 있다고 가정하겠습니다.그렇다면 항목 목록만 갖게 되며 LayoutTemplate의 html은 해당 항목이 표시되는 방법을 결정합니다.그런 다음 테이블 스타일의 열과 행 배열을 만드는 것에 대해 이야기하고 있다면 DataGrid가 특정 열을 훨씬 더 프로그래밍 방식으로 제어할 수 있으므로 더 나은 선택이 될 것입니다.

CSS를 통해 테이블 ​​레이아웃을 완전히 생성하기를 원할 수도 있습니다. 이는 훌륭한 결정입니다. 만약에 순전히 레이아웃 목적입니다.그러나 하나의 열을 구체적으로 숨기라는 귀하의 요구 사항은 귀하의 요구에 맞게 테이블을 배치하는 것이 더 낫다는 것을 나타냅니다.표 형식의 데이터에 테이블을 사용하는 것은 괜찮습니다...IMHO...

정말로 ListView를 사용해야 하는 경우 요소를 표시할지 여부를 결정하는 데이터의 항목에 대해 바인딩을 시도할 수 있습니다. 예:

style='display: <%#Eval("DisplayStyle") %>;'

제어하려는 html 요소(LayoutTemplate) 내에 이 코드를 배치하세요.그런 다음 바인딩하려는 개체에는 'block' 또는 'none'으로 설정된 'DisplayStyle' 속성이 필요합니다.

레이아웃 템플릿 열 헤더 텍스트에 액세스하기 위해 템플릿에 레이블을 만들고 목록 보기의 사전 렌더링에서 findcontrol을 수행한 다음 열이 "꺼짐"이어야 하는 경우 레이블을 빈 텍스트로 만들었습니다.이것은 여러분의 의도에 맞지 않을 수도 있지만 저는 여전히 열 공간을 사용하고 싶었고 공백으로 표시되었습니다.

목록 보기를 뒤로 구부리려고 하면 할수록 그리드를 대신 사용하고 싶은 마음이 더 커질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top