【问题标题】:Hide Div in ListView if database value is NULL如果数据库值为 NULL,则在 ListView 中隐藏 Div
【发布时间】:2021-02-24 15:10:30
【问题描述】:

我有一个 ListView,它显示每个项目的不同类型的目录。如果“pdflabel”、“pdftechlabel”、“pdfecolabel”等的值为 NULL,我想隐藏目录 div...

我进行了大量搜索,但我有限的知识使我无法连接所有点以使此功能达到预期。非常感谢任何帮助。

<div id="catalog">
    <asp:ListView ID="ListViewCatalogs" runat="server" DataSourceID="SqlCatalogs" OnItemDataBound="ListViewCatalogs_ItemDataBound">
        <EmptyDataTemplate>
        </EmptyDataTemplate>
        <ItemTemplate>
            <div id="pdfcatalogs" runat="server">
                <div id="brochure" class="pdfcat" runat="server" >
                    <asp:HyperLink ID="HyperLink2" CssClass="pdflinks" runat="server" Target="_blank" NavigateUrl='<%# Eval("catlinkpath", "Catalogs/{0}.pdf") %>' title='<%# Eval("pdfname") %>' ImageUrl='<%# Eval("pdficon") %>' />
                    <br />
                    <asp:Label ID="catnameLabel" CssClass="pdflinks" runat="server" Text='<%# Eval("pdflabel", "{0} Brochure") %>' />
                </div><!--end brochure-->

                <div id="techbrochure" class="pdfcat" runat="server">
                    <asp:HyperLink ID="HyperLink6" CssClass="pdflinks" runat="server" Target="_blank" NavigateUrl='<%# Eval("techlinkpath", "Catalogs/{0}.pdf") %>' title='<%# Eval("pdftechname") %>' ImageUrl='<%# Eval("pdftechicon") %>' />
                    <br />
                    <asp:Label ID="technameLabel" CssClass="pdflinks" runat="server" Text='<%# Eval("pdftechlabel") %>' />
                </div><!--end techbrochure-->

                <div id="ecobrochure" class="pdfcat" runat="server" >
                    <asp:HyperLink ID="HyperLink3" CssClass="pdflinks" runat="server" Target="_blank" NavigateUrl='<%# Eval("ecolinkpath", "Catalogs/{0}.pdf") %>' title='<%# Eval("pdfeconame") %>' ImageUrl='<%# Eval("pdfecoicon") %>' />
                    <br />
                    <asp:Label ID="econameLabel" CssClass="pdflinks" runat="server" Text='<%# Eval("pdfecolabel") %>' />
                </div><!--end ecobrochure-->

                <div id="sdsbrochure" class="pdfcat" runat="server" >
                    <asp:HyperLink ID="HyperLink5" CssClass="pdflinks" runat="server" Target="_blank" NavigateUrl='<%# Eval("sdslinkpath", "Catalogs/{0}.pdf") %>' title='<%# Eval("pdfeconame") %>' ImageUrl='<%# Eval("pdfsdsicon") %>' />
                    <br />
                    <asp:Label ID="sdsnameLabel" CssClass="pdflinks" runat="server" Text='<%# Eval("pdfsdslabel") %>' />
                </div><!--end sdsbrochure-->

                <div id="otherbrochure" class="pdfcat" runat="server" >
                    <asp:HyperLink ID="HyperLink7" CssClass="pdflinks" runat="server" Target="_blank" NavigateUrl='<%# Eval("otherlinkpath", "Catalogs/{0}.pdf") %>' title='<%# Eval("pdfothername") %>' ImageUrl='<%# Eval("pdfothericon") %>' />
                    <br />
                    <asp:Label ID="othernameLabel" CssClass="pdflinks" runat="server" Text='<%# Eval("pdfotherlabel") %>' />
                </div><!--end otherbrochure-->
            </div><!--end pdfcatalogs-->
        </ItemTemplate>
        <LayoutTemplate>
            <div id="itemPlaceholderContainer" runat="server" border="0" style=""><span id="itemPlaceholder" runat="server"></span></div>
        </LayoutTemplate>
    </asp:ListView>
</div><!--end catalog-->

根据 Albert D. Kallal 的原始和更新答案,我添加了以下内容(更改了 ListView 而不是 GridView)。

        private void AcceptData(string connectionString)
    {
        if (IsPostBack == false)
        {
            string strSQL;
            strSQL = "SELECT pdflabel, pdftechlabel, pdfecolabel, pdfsdslabel, pdfotherlabel from tblcatalogs";

            using (SqlCommand cmdSQL = new SqlCommand(strSQL, new SqlConnection(connectionString)))
            {
                cmdSQL.Connection.Open();
                ListViewCatalogs.DataSource = cmdSQL.ExecuteReader();
                ListViewCatalogs.DataBind();
            }
        }
    }

    protected void ListViewCatalogs_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.GetType() == typeof(ListViewDataItem))
        {
            Label lTech = (Label)e.Item.FindControl("technameLabel");
            if (lTech.Text == "testing123")
            {
                HtmlGenericControl MyDiv = (HtmlGenericControl)e.Item.FindControl("techbrochure");
                MyDiv.Visible = false;
            }
        }
    }

但是,它仍然没有隐藏 div。我希望 div 实际上是“显示:无”,这样它就不会占用页面中的空间。我目前的问题是我仍然有空 div 的空间。

我找到了一些内联选项,但这对我也不起作用。

<div id="techbrochure" class="pdfcat" runat="server" visible='<%# Eval("pdftechname") == null ? true:false %>'>
     <asp:HyperLink ID="HyperLink6" CssClass="pdflinks" runat="server" Target="_blank" NavigateUrl='<%# Eval("techlinkpath", "Catalogs/{0}.pdf") %>' title='<%# Eval("pdftechname") %>' ImageUrl='<%# Eval("pdftechicon") %>' />
     <br />
     <asp:Label ID="technameLabel" CssClass="pdflinks" runat="server" Text='<%# Eval("pdftechlabel") %>' />
</div><!--end techbrochure-->

【问题讨论】:

    标签: c# asp.net label hidden


    【解决方案1】:

    这是个好问题!

    您如何为网格视图、列表视图、表单视图以及 asp.net 中的“任何”转发器对象执行此操作?它们的工作方式几乎相同。

    因此,一般的方法是按照您的方式构建所有内容,并且有一个非常方便且漂亮的事件会为这些所谓的“中继器”的每一行触发。这称为 RowDataBound 事件。

    它会在数据绑定过程中为每一行触发,并让您可以轻松放置一些不错的小例程(例如您的问题)。因此,此事件会触发,并让您在填充数据之后、但在最终渲染过程之前将脏手放在行上。 (如前所述,您在 listview 中了解到这一点,然后几乎相同的方法适用于所有其他数据绑定控件 - (就给定的事件模型而言,它们的工作方式几乎相同)。

    现在又一期。我想我们可以使用 sql 来检查空值,而不是首先返回数据 - 对吧? (只是想建议 - 因为它看起来像 pdfcatalogs 是整行(是吗?)。所以理论上我们可以更改 sql 以防止这种情况发生。

    甚至说,一旦我们提取了该数据表,我们就可以过滤数据以不包括这些行。但是,到目前为止还不清楚我们是基于此隐藏整行,还是仅隐藏该行上的一些内容?所以不要排除使用过滤器 - 它们非常易于使用,因此您首先会阻止数据行成为数据表的一部分。

    所以,在大多数情况下,为了隐藏这些行,我首先不会包含这些行。但是,我们通常仍然需要/想要条件格式。 (所以如果你想说添加/拥有/更改某个行列的颜色基于其值,那么我们将要做的事情将会并且可以很好地工作。

    首先,您可以快速浏览一下我最近的这篇文章 - 这是一个网格视图,但正如我指出的,相同的方法也适用于 listview:

    How to Highlight Cells with a certain value from the DB in a GridView in ASP .NET using VB Programming?

    在上面,我想为行中的一些值着色。在这种情况下,我们只是要隐藏一些 - 但方法在执行上是相同的。

    所以,在我们的 RowDataBound 事件中,我们简单地说检查 catnamelabel,然后隐藏 div

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // this is a data row!
    
        Label catlbel = e.Row.FindControl("catnameLabel");
        if (catlbel.Text == "")
        {
            HtmlGenericControl MyDiv = e.Row.FindControl("pdfcatalogs");
            MyDiv.Style("Display") = "none";
        }
    }
    

    因此,您可以添加尽可能多的测试。并且空值将成为标签中的“”

    编辑:-----------

    这是一个使用列表视图的示例。

    首先,标记 - 我们有一些标准列 - 并注意我放置在最后两列周围的 div。

    所以,我们有这个:

      <asp:ListView ID="ListView1" runat="server" style="width:700px">
            <ItemTemplate>
                <tr style="">
                    <td><asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' /></td>
                    <td><asp:Label ID="HotelNameLabel" runat="server" Text='<%# Eval("HotelName") %>' /></td>
                    <td><asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' /></td>
                    <td><asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' /></td>
    
                    <div id="ProvinceAndComments" runat="server">
    
                        <td><asp:Label ID="ProvinceLabel" runat="server" Text='<%# Eval("Province") %>' /></td>
                        <td><asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>' /></td>
    
                    </div>
                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                    <tr runat="server" style="">
                        <th runat="server">ID</th>
                        <th runat="server" width="140px">HotelName</th>
                        <th runat="server">FirstName</th>
                        <th runat="server">City</th>
                        <th runat="server">Province</th>
                        <th runat="server">Description</th>
                    </tr>
                    <tr id="itemPlaceholder" runat="server">
                    </tr>
                </table>
            </LayoutTemplate>
        </asp:ListView>
    

    (我什至让向导为我创建行 - 毕竟这只是一个问答,所以工作量不大。

    好的,现在在我们的加载事件中,我们使用以下代码加载列表视图:

    protected void Page_Load(object sender, System.EventArgs e)
    {
    if (IsPostBack == false)
       {
        string strSQL;
        strSQL = "SELECT ID, HotelName, FirstName, City, Province, Description from tblHotels";
    
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, new SqlConnection(My.Settings.Test3)))
        {
            cmdSQL.Connection.Open();
            ListView1.DataSource = cmdSQL.ExecuteReader;
            ListView1.DataBind();
        }
       }
    }
    

    好的,上面是几行代码。我们现在得到/看到这个:

    现在,请注意上面标记中的“div”。这个:

    <div id="ProvinceAndComments" runat="server">
    
       <td><asp:Label ID="ProvinceLabel" runat="server" Text='<%# Eval("Province") %>' /></td>
       <td><asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>' /></td>
    
    </div>
    

    好的,让我们“隐藏”这个 div,如果 Province = "AB"。

    所以,在项目绑定事件中。 (显示属性表 - 只需双击该事件 - 您跳转到代码编辑器。

    所以,我们现在有了这段代码:

    protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.GetType == typeof(ListViewDataItem))
        {
           Label lProvince = e.Item.FindControl("ProvinceLabel");
           if (lProvince.Text == "AB")
              {
              HtmlGenericControl MyDiv = e.Item.FindControl("ProvinceAndComments");
              MyDiv.Visible = false;
              }
        }
    }
    

    好的,所以我们只是“隐藏”了那个 div。它围绕着最后两列。所以,现在运行这段代码,你会得到:

    如上所述,我可以根据我想要的任何标准隐藏一整行,但上面的“div”围绕最后两列。请注意,您必须给它一个“ID”,当然还要使用 runat="server" 来查看后面的代码以查看 + 使用此类控件。现在我在列和控件周围使用了一个 div。 我想您可以按名称提取控件,然后以这种方式隐藏它们,但我取决于您希望隐藏或显示多少。

    【讨论】:

    • 非常感谢您的详细回复!我已经更新了我原来的问题。它仍然给我一个空白 div 所在的空白区域。
    • 嗯,但是div内容隐藏了吗?正如我在帖子中指出的那样,如果不显示整行,那么在数据级别将其过滤掉的代码更少。此外,它可能是该 div 的类 - 也许尝试在行绑定代码中设置它。很确定隐藏 div 应该隐藏行 - 它只取决于 div 在这里结束的位置。
    • 你也可以像这样隐藏整行:e.Row.Attributes["style"] = "display:none";所以你可以通过在行数据绑定事件中尝试这个想法来隐藏整行
    • 隐藏整行,这对我有用:e.Row.Style("Display") = "none" -----这也有效:e.Row.Visible = false; --- 这表明我们使用的 div 可以被转储。
    • 我认为我的断开是因为我使用的是 ListView 而不是 GridView。如果“...nameLabel”字段为 NULL,我想隐藏整个 div。在实时页面源中,我看到:`

      `
    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2018-04-11
    • 2021-11-24
    • 1970-01-01
    • 2021-09-09
    • 2012-08-19
    相关资源
    最近更新 更多