有谁知道在asp.net listview中隐藏列的方法?

时间:2008-09-16 09:37:28

标签: asp.net listview

我知道你可以把<%if%> ItemTemplate中的语句隐藏控件但列仍然存在。 你不能把< %%>在LayoutTemplate中的语句,这是声明列标题的地方,因此问题。 有谁知道更好的方法?

7 个答案:

答案 0 :(得分:19)

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

这是你的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;
}

在数据绑定中做任何你想做的事。因为该列现在是runat服务器,并且您正在处理控件的DataBound,所以当您执行ListView1.FindControl(“tdIsSuperCool”)时,您将进入布局模板,以便像冠军一样工作。

将您想要的任何业务逻辑控制为td的可见性,并且您很好。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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>

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

listview实际上没有'column'的概念,因为它只是一个列表。

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

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

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

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

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

答案 6 :(得分:0)

要访问布局模板列标题文本,我在模板中创建了标签,并在listview的预渲染中执行了findcontrol,如果列应该“关闭”,则将标签设置为空白文本。这可能不适合您的意图,但对我来说,我仍然希望使用列空间,只是显示为空白。

你进一步尝试使列表视图向后弯曲,你希望你使用网格越多。