有谁知道在asp.net listview中隐藏列的方法?
我知道我们可以在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 ='<%%>'
<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; }