<asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="itemHolder"
OnItemCommand="listViewCmd" OnItemDeleting="OnItemDeleting"
OnItemEditing="OnItemEditing">
<LayoutTemplate>
<table class = "tblItemDetail" style = "color:Black;" width="100%" border="0" cellpadding="5">
<tr>
<asp:Panel ID="pnlNameHead" runat="server">
<th id="thName" runat="server">Name
</th>
</asp:Panel>
<th>Address
</th>
<th>Contact No.
</th>
<th>E-mail Address
</th>
<th>Edit
</th>
<th>Delete
</th>
</tr>
<asp:PlaceHolder ID="itemHolder" runat="server"></asp:PlaceHolder>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<asp:Panel ID="pnlName" runat="server">
<td align="center" id="tdName" runat="server">
<asp:Literal ID="lit1" runat="server" Text='<%# Eval("SupplierName") %>'></asp:Literal>
</td>
</asp:Panel>
<td align="center">
<asp:Literal ID="Literal1" runat="server" Text='<%# Eval("SupplierAdd") %>'></asp:Literal>
</td>
<td align="center">
<asp:Literal ID="Literal2" runat="server" Text='<%# Eval("SupplierContact") %>'></asp:Literal>
</td>
<td align="center">
<asp:Literal ID="Literal3" runat="server" Text='<%# Eval("SupplierEmail") %>'></asp:Literal>
</td>
<td align="center">
<asp:Button ID="Button3" runat="server" Text="Edit" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "SupplierID") %>' CommandName="edit" />
</td>
<td align="center">
<asp:Button ID="Button2" runat="server" Text="Delete" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "SupplierID") %>' CommandName="delete" />
</td>
</tr>
</ItemTemplate>
</asp:ListView>
我的aspx Web Form获得了这个源代码。我正在尝试隐藏供应商名称的列。我已经尝试了很多方法:
但我总是得到“对象引用没有设置为对象的实例”。有人可以帮我吗?我一直试图解决这个问题几天。
答案 0 :(得分:4)
不要将Control的Visible
属性设置为false,并使其隐藏。 (是的,我知道这听起来如何,但请耐心等待)。
如果将控件的Visible属性设置为false,则表示当在服务器上呈现页面的html时,控件不会生成任何要包含的标记。请参阅MSDN上的Control.Visible。这可能就是你想要的,在这种情况下,Andrew Charlton的答案就是你所需要的。
但是,如果您希望<th>
和关联的<td>
元素出现在浏览器中的页面标记中,但不可见,即隐藏,那么您需要使用CSS来设置样式他们display:none
例如
<LayoutTemplate>
<table class = "tblItemDetail" style = "color:Black;" width="100%" border="0" cellpadding="5">
<tr>
<asp:Panel ID="pnlNameHead" runat="server">
<th id="thName" runat="server" style="display:none;">Name</th>
</asp:Panel>
...
</tr>
</LayoutTemplate>
<ItemTemplate>
<tr>
<asp:Panel ID="pnlName" runat="server">
<td align="center" id="tdName" runat="server" style="display:none;">
<asp:Literal ID="lit1" runat="server" Text='<%# Eval("SupplierName") %>'></asp:Literal>
</td>
</asp:Panel>
答案 1 :(得分:1)
您无法访问和修改ItemTemplate中的内容(AFAIK),因为它们还不是实际控件;模板只是描述每个项目将包含的内容。您可以使用ItemDataBound事件在创建后通过并隐藏每个Item中的面板。像这样:
protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if(e.Item.ItemType == ListViewItemType.DataItem)
{
Panel pnl = (Panel)e.Item.FindControl("pnlName");
pnl.Visible = false;
}
}
唯一的另一个选择是动态构建所有模板或使用UserControls:
Dynamically change GridView item template
编辑:刚刚看到你将Panel放在一个表格单元格周围。您可以删除面板并直接在ItemDataBound中访问单元格:
HtmlControl td = (HtmlControl)e.Item.FindControl("tdName");
td.Visible = false;
答案 2 :(得分:1)
以下是导致此问题的一些可能原因。
1)您只能在创建控件后进行更改,通常是在ItemDataBound
和LayoutCreated
事件中。也许你想要做得太早?
2)在另一个控件中包装表格单元没有有效的概念。我有点惊讶这不会扼杀解析器,但也许它有效,因为它只是HTML。如果您尝试使用<asp:Table>
执行此操作,则无效。无论如何,它不会呈现有效的HTML - Panel
创建一个div
所以表元素将被包装在div中。无论如何,没有理由这样做;相反,只需寻找元素本身。在您的示例中,th
和td
元素已设置为runat="server"
,因此请直接搜索它们。
3)FindControl
不是递归的。尝试使用递归实现。这是我使用的扩展方法(最后一个参数就是这样,我可以与FindControl共享一个名称,你可以将名称更改为其他名称,如果你愿意,可以删除它)。这可能是FindControl没有返回任何内容的原因,因为您正在寻找的控件将位于另一个控件(tr
)的Controls集合中。
public static Control FindControl(this Control baseControl, string id, bool recurse)
{
foreach (Control ctl in baseControl.Controls)
{
if (ctl.ID==id)
{
return (ctl);
}
if (recurse && ctl.Controls.Count > 0)
{
Control subCtl = ctl.FindControl(id,recurse);
if (subCtl != null)
{
return (subCtl);
}
}
}
return (null);
}
一般来说,虽然这是可行的,并且我之前尝试过,但以编程方式更改布局模板是一件麻烦事,并且可能导致代码中的大量条件处理。如果您因某些原因无法使用CSS,我会制作另一个模板。