【发布时间】:2016-12-15 04:51:51
【问题描述】:
我知道您可以在 ItemTemplate 中放置 语句来隐藏控件,但该列仍然存在。 您不能将 语句放入声明列标题的 LayoutTemplate 中,因此会出现问题。 有谁知道更好的方法吗?
【问题讨论】:
我知道您可以在 ItemTemplate 中放置 语句来隐藏控件,但该列仍然存在。 您不能将 语句放入声明列标题的 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 可见性的业务逻辑,你就很好了。
【讨论】:
HtmlControl tdColumn = listView.Items[i].FindControl("tdColumn") as HtmlControl; --> if(tdColumn != null) { tdColumn.Visible = false; } 这是在项目绑定数据之后完成的。
<tr> 标签放在 <table> 元素之外。我想它有效,但我在哪里可以找到这方面的基本信息?
尝试使用面板,您可以打开/关闭它
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 创建表格布局,这是一个令人钦佩的决定如果它纯粹是为了布局目的。但是,您专门隐藏一列的要求向我表明,表格更适合您的需要。可以将表格用于表格数据...恕我直言...
如果您确实需要使用 ListView,那么您可以随时尝试绑定数据中的某些内容,以确定是否应显示元素,例如:
style='display: <%#Eval("DisplayStyle") %>;'
将此代码放置在您要控制的 html 元素中(在 LayoutTemplate 中)。然后在您绑定的对象中,您需要一个属性“DisplayStyle”,该属性设置为“block”或“none”。
【讨论】:
为了访问布局模板列标题文本,我在模板中为它们制作了标签,并在列表视图的预渲染中做了一个 findcontrol,然后如果列应该“关闭”,则将标签设为空白文本。这可能不符合您的意图,但对我来说,我仍然希望使用列空间,只是显示为空白。
你越是尝试让列表视图向后弯曲,你就越希望你使用网格来代替。
【讨论】: