I know you can put <% if %> statements in the ItemTemplate to hide controls but the column is still there. You cannot put <% %> statements into the LayoutTemplate which is where the column headings are declared, hence the problem. Does anyone know of a better way?
There is no builtin Hide/Show column way in ListView , as much as I'm aware of, so one of solutions can be just remove that column form UI. The data which is visible on ListView always remains "in your hands", so at the moment you will decide to show the column again, just show the column and fill ListView again.
The ListView control displays columns and rows of data and allows sorting and paging. It is by far the most popular data display control, and is ideal for understanding how data display controls interact with data retrieval controls and code.
Here's another solution that I just did, seeing that I understand what you want to do:
Here's your 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" />
Here's the code behind
/// <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;
}
Do whatever you want in the databound. Because the column is now runat server, and you're handling the DataBound of the control, when you do ListView1.FindControl("tdIsSuperCool") you're in the Layout template so that works like a champ.
Put whatever business logic that you want to control the visibility of the td and you're good.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With