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

时间:2020-03-05 18:55:31  来源:igfitidea点击:

我知道我们可以在ItemTemplate中放入<%if%>语句以隐藏控件,但该列仍然存在。
我们不能将<%%>语句放入声明列标题的LayoutTemplate中,因此出现了问题。
有人知道更好的方法吗?

解决方案

回答

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

回答

listview实际上并没有"列"的概念,因为它只是作为一个列表而已。

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

可能是我们希望完全通过CSS创建表布局,如果仅出于布局目的,这是一个令人钦佩的决定。但是,我们需要专门隐藏一列,这向我表明,最好放置一张桌子以满足需求。可以将表格用于表格数据...恕我直言...

如果确实需要使用ListView,则可以始终尝试对数据中的某些内容进行绑定,以确定是否应显示元素,例如:

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

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

回答

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

下面的输出将为我们提供一个表格,并且每个项目都是一个新的TR。

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

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

回答

这是我刚刚做的另一种解决方案,因为我了解我们要执行的操作:

这是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")时,我们就在Layout模板中,因此可以像冠军一样工作。

放置我们想要控制TD可见性的任何业务逻辑,我们就可以了。

回答

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

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