ОШИБКА: имя 'lvSubCategories' не существует в текущем контексте

Я пытаюсь показать подкатегории в соответствии с категориями. Я помещаю Listview в другое представление списка, но внутреннее представление ListView выдает ошибку в файле cs, что имя 'lvSubCategories' не существует в текущем контексте.

Может ли listView не содержать в себе другого listview?

Вот мой Test.aspx разметка:

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="ShoppingHeart.Test" %>
    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
        <link href="css/font-awesome.css" rel="stylesheet" />
        <link href="Scripts/bootstrap.css" rel="stylesheet" />
        <script src="Scripts/jquery-3.1.1.js"></script>
        <script src="Scripts/bootstrap.js"></script>
        <link href="Styling/TablesStyle.css" rel="stylesheet" />
        <link href="Styling/paneLStyle.css" rel="stylesheet" />
        <link href="Styling/NavBarStyle.css" rel="stylesheet" />
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <nav class="navbar navbar-default" style="background-color: rgba(154, 153, 153, 0.93)">
                    <div class="container">
                        <div class="navbar-header">
                            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
                                <span class="icon-bar"></span>
                                <span class="icon-bar"></span>
                                <span class="icon-bar"></span>
                            </button>
                            <asp:Image ID="Image1" Height="60px" Width="85px" ImageUrl="~/Images/FinalLogo.png"
                                runat="server" />
                        </div>
                        <div class="collapse navbar-collapse" id="myNavbar">

                            <ul class="nav navbar-nav">

                                <asp:ListView ID="lvCategories" runat="server">
                                    <ItemTemplate>
                                        <li class="dropdown">
                                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                                                <%# Eval("CategoryName") %> <span class="caret"></span>
                                            </a>
                                            <asp:ListView ID="lvSubCategories" runat="server">
                                                <ItemTemplate>
                                                    <ul class="dropdown-menu">
                                                        <li><a href="#"><%# Eval("SubCategoryName") %></a></li>
                                                    </ul>
                                                </ItemTemplate>
                                            </asp:ListView>
                                        </li>

                                    </ItemTemplate>
                                </asp:ListView>
                            </ul>
                        </div>
                    </div>
                </nav>

                <asp:Button ID="btnLoadCategories" runat="server" Text="Load Categories"
                    OnClick="btnLoadCategories_Click" />
            </div>
        </form>
    </body>
    </html>

Вот мой Test.aspx.cs код:

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace ShoppingHeart
    {
        public partial class Test : System.Web.UI.Page
        {
            protected void btnLoadCategories_Click(object sender, EventArgs e)
            {
                var ds = new DataSet();
                var ds1 = new DataSet();

                string Categoryquery = "Select * from Category";
                string SubCategoryquery = "Select SubCategoryName from SubCategory where CategoryId = 1003";

                string ConString = ConfigurationManager.ConnectionStrings["MyCon"].ConnectionString.ToString();

                using (var conn = new SqlConnection(ConString))
                {
                    var adpt = new SqlDataAdapter(Categoryquery, conn);
                    adpt.Fill(ds);

                    lvCategories.DataSource = ds;
                    lvCategories.DataBind();
                }

                using (var conn = new SqlConnection(ConString))
                {
                    var adpt = new SqlDataAdapter(SubCategoryquery, conn);
                    adpt.Fill(ds1);

                    lvSubCategories.DataSource = ds1;
                    lvSubCategories.DataBind();
                }
            }
        }
    }

1 ответ

Решение

Поскольку это вложенный ListView, у вас нет прямого доступа. Вам нужно использовать FindControl. Это может быть использовано в OnItemDataBound событие ListView

<asp:ListView ID="lvCategories" runat="server" OnItemDataBound="lvCategories_ItemDataBound">

protected void lvCategories_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    ListView lvSubCategories = e.Item.FindControl("lvSubCategories") as ListView;

    lvSubCategories.DataSource = source;
    lvSubCategories.DataBind();
}

Или путем доступа к элементу по индексу.

ListView lvSubCategories = lvCategories.Items[i].FindControl("lvSubCategories") as ListView;

lvSubCategories.DataSource = source;
lvSubCategories.DataBind();
Другие вопросы по тегам