【问题标题】:Does anyone know of a way of hiding a column in an asp.net listview?有谁知道在 asp.net 列表视图中隐藏列的方法?
【发布时间】:2016-12-15 04:51:51
【问题描述】:

我知道您可以在 ItemTemplate 中放置 语句来隐藏控件,但该列仍然存在。 您不能将 语句放入声明列标题的 LayoutTemplate 中,因此会出现问题。 有谁知道更好的方法吗?

【问题讨论】:

    标签: asp.net listview


    【解决方案1】:

    这是我刚刚做的另一个解决方案,看到我明白你想要做什么:

    这是您的 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 可见性的业务逻辑,你就很好了。

    【讨论】:

    • 谢谢,到处找这个。
    • 正是我需要的......谢谢!
    • 要在列表中隐藏 TD,我必须遍历 ListView.Items 然后 HtmlControl tdColumn = listView.Items[i].FindControl("tdColumn") as HtmlControl; --> if(tdColumn != null) { tdColumn.Visible = false; } 这是在项目绑定数据之后完成的。
    • 您从哪里获得这方面的基础知识?我的 Visual Studio 2012 环境不喜欢将 &lt;tr&gt; 标签放在 &lt;table&gt; 元素之外。我想它有效,但我在哪里可以找到这方面的基本信息?
    【解决方案2】:

    尝试使用面板,您可以打开/关闭它

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

    【讨论】:

    • 我发现在表格中放置一个面板来显示和隐藏列会破坏 XHTML,因为它会将 div 放在 tr/td 标签之间。也许对您来说不是问题,但会让我们的 HTML 开发人员抱怨
    • 我对第 th 标题单元格使用了可接受的答案,但是如果我向它们添加 'runat="server"',td 内容单元格会导致页面失败(可怕的空白页面)。我认为那是因为它们包含 DropDownLists 和 Buttons 等 - 普通单元格没问题。我使用 Fred 的面板解决方案来隐藏表格单元格。
    【解决方案3】:

    ListView 让您可以完全控制数据如何呈现给客户端。您指定布局模板,并提供一个占位符,该占位符将是每个项目的注入位置。

    下面的输出会给你一个表格,每个项目都是一个新的TR。

    注意使用 runat='server' 和 visible ='&lt;%# %&gt;'

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

    【讨论】:

    • 我在 LayoutTemplate 中有一个标题行,您无法在 LayoutTemplate 中添加代码块。还有其他指定列标题的方法吗?
    【解决方案4】:

    我知道这是一个非常古老的问题,但我实际上不得不这样做,并且认为我找到了一种通过 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>
    

    【讨论】:

      【解决方案5】:

      如果找不到更好的方法,您始终可以将列宽设置为 0(零)。

      【讨论】:

      • 我无法将 列缩小到标题大小以下。我只是添加 width="0" - 我还需要做些什么吗?此外,这是否可以通过将列中的任何单元格设置为宽度 0 来实现,还是必须全部都是?
      【解决方案6】:

      列表视图实际上并没有“列”的概念,因为它只是一个列表。

      我将假设您正在使用数据绑定将“某物”列表附加到 ListView。如果是这种情况,那么您将只有一个项目列表,而 LayoutTemplate 中的 html 将决定这些项目的显示方式。如果您当时正在谈论创建列和行的表格样式数组,那么 DataGrid 可能是更好的选择,因为它可以对特定列进行更多的编程控制。

      您可能希望完全通过 CSS 创建表格布局,这是一个令人钦佩的决定如果它纯粹是为了布局目的。但是,您专门隐藏一列的要求向我表明,表格更适合您的需要。可以将表格用于表格数据...恕我直言...

      如果您确实需要使用 ListView,那么您可以随时尝试绑定数据中的某些内容,以确定是否应显示元素,例如:

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

      将此代码放置在您要控制的 html 元素中(在 LayoutTemplate 中)。然后在您绑定的对象中,您需要一个属性“DisplayStyle”,该属性设置为“block”或“none”。

      【讨论】:

      • 问题是你不能在LayoutTemplate里面添加代码块,所以我看不到你是怎么去掉标题行的。
      【解决方案7】:

      为了访问布局模板列标题文本,我在模板中为它们制作了标签,并在列表视图的预渲染中做了一个 findcontrol,然后如果列应该“关闭”,则将标签设为空白文本。这可能不符合您的意图,但对我来说,我仍然希望使用列空间,只是显示为空白。

      你越是尝试让列表视图向后弯曲,你就越希望你使用网格来代替。

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 1970-01-01
        • 1970-01-01
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 2013-02-25
        • 1970-01-01
        相关资源
        最近更新 更多