ASP.NET在ListView </asp:panel>中隐藏<asp:panel> ///

时间:2011-03-02 18:34:01

标签: c# javascript .net asp.net html

<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获得了这个源代码。我正在尝试隐藏供应商名称的列。我已经尝试了很多方法:

  • ListView1.FindControl(“pnlNameHead”)。Visible = false
  • Panel pnlName =(Panel)ListView.FindControl(“pnlName”);
    • pnlName.Visible = false;

但我总是得到“对象引用没有设置为对象的实例”。有人可以帮我吗?我一直试图解决这个问题几天。

3 个答案:

答案 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)您只能在创建控件后进行更改,通常是在ItemDataBoundLayoutCreated事件中。也许你想要做得太早?

2)在另一个控件中包装表格单元没有有效的概念。我有点惊讶这不会扼杀解析器,但也许它有效,因为它只是HTML。如果您尝试使用<asp:Table>执行此操作,则无效。无论如何,它不会呈现有效的HTML - Panel创建一个div所以表元素将被包装在div中。无论如何,没有理由这样做;相反,只需寻找元素本身。在您的示例中,thtd元素已设置为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,我会制作另一个模板。