嵌套ListView无法从父ListView获取值

太阳

我的网站在c#中,并且是完全动态的。菜单栏也是动态的。每个导航菜单都有子菜单。.由于菜单需要从数据库中构建,因此我使用了Listview Control。在我的菜单网站上,我需要在一个父级Listview中使用2个子级Listview。所以看起来像这样。

父菜单Listview具有子菜单listview和子菜单listviews具有另一个子Listview,我需要在其中显示任何与产品相关的父Listview类别。

我的子菜单已正确构建,但在其中,如果我尝试绑定另一个Listview,则它向我显示错误(未将对象引用设置为对象的实例。)然后,我尝试了手动sql查询,但未从ItemDataBound中定义where子句,然后它也显示相同的错误。

菜单的外观(子菜单中要显示一种电源组类别产品的空白区域(右侧)) 在此处输入图片说明

<asp:ListView ID="mainMenu" runat="server" DataKeyNames="name" OnItemDataBound="OnItemDataBound">
     <ItemTemplate>
          <li><asp:HyperLink ID="mainLinks" runat="server" NavigateUrl='<%# Eval("name", "~/{0}") %>' Text='<%# Eval("name") %>'></asp:HyperLink>

              <ul class="super-child">
                  <asp:ListView ID="childMenu" runat="server" DataKeyNames="name">
                       <ItemTemplate>
                            <div class="super-child-inner">
                                 <div class="list-child">
                                 <li><asp:HyperLink ID="cat3" runat="server" NavigateUrl='<%# Eval("category") & Eval("name", "/{0}") %>' Text='<%# Eval("name") %>'></asp:HyperLink></li>
                            </div>

                            <div class="recommended">
                            <asp:ListView ID="recommendedProducts" runat="server">
                                 <ItemTemplate>
                                     <div class="rec-img">
                                          <asp:Image ID="recImg" runat="server" ImageUrl='<%# Eval("image") %>' />
                                     </div>
                                     <p class="rec-name"><asp:HyperLink ID="recLink" runat="server" NavigateUrl='<%# Eval("category") & Eval("name", "/{0}") %>' Text='<%# Eval("name") %>'></asp:HyperLink></p>
                                 </ItemTemplate>
                              </asp:ListView>
                          </div>
                      </div>
                  </ItemTemplate>
              </asp:ListView>
           </ul>
        </li>
    </ItemTemplate>
</asp:ListView>

ItemData绑定代码

protected void onItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem) {
        ListViewDataItem itm = (ListViewDataItem)e.Item;
        string name = mainMenu.DataKeys(itm.DataItemIndex)("name");
        ListView childMenu = e.Item.FindControl("childMenu") as ListView;
        ListView recommendedProducts = e.Item.FindControl("recommendedProducts") as ListView;
        string constr = ConfigurationManager.ConnectionStrings("conio").ConnectionString;
        using (MySqlConnection con = new MySqlConnection(constr)) {
            using (MySqlCommand cmd = new MySqlCommand()) {
                cmd.CommandText = "SELECT * FROM product_categories WHERE category = '" + name + "' and status = 'active'";
                cmd.Connection = con;
                using (MySqlDataAdapter sda = new MySqlDataAdapter(cmd)) {
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    childMenu.DataSource = dt;
                    childMenu.DataBind();
                }
            }
        }

        try {
            string constr2 = ConfigurationManager.ConnectionStrings("conio").ConnectionString;
            using (MySqlConnection con = new MySqlConnection(constr2)) {
                using (MySqlCommand cmd = new MySqlCommand()) {
                    cmd.CommandText = "SELECT ID,slug,product_name,image FROM products WHERE (category Like @category) and status = 'active' Limit 1";
                    cmd.Connection = con;
                    cmd.Parameters.AddWithValue("@categoty", "%" + name + "%");
                    using (MySqlDataAdapter sda = new MySqlDataAdapter(cmd)) {
                        DataTable dt = new DataTable();
                        sda.Fill(dt);
                        recommendedProducts.DataSource = dt;
                        recommendedProducts.DataBind();
                    }
                }
            }
        } catch (Exception ex) {
            Response.Write(ex);
        }
    }
}

UPDATE(异常)

System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb:第79行的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)中。NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb:第79行的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)中。NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb中的MasterPage.onItemDataBound(Object sender,ListViewItemEventArgs e)处:行79System.NullReferenceException:对象引用未设置为对象的实例。在E:\ MY WEB \ brandstik.com1 \ MasterPage.master.vb:第79行中的MasterPage.onItemDataBound(对象发送者,ListViewItemEventArgs e)中

希腊人40

为了解决该问题,有两个主要概念需要理解。

  • ID值范围
  • 初始化时间

关于ID值的范围:

中的元素IDItemTemplate仅在此项目的范围内可用。否则,多个项目将产生具有重复ID值的元素。在childMenu中有两项,您希望哪一项返回FindControl

关于时序,ListView仅在执行时DataSource分配了a之后,才会创建a的嵌套项DataBind这意味着,您不能指望recommendedProducts它在childMenu.DataSource = dt; childMenu.DataBind();执行之前存在

在以下示例中,您的复杂数据逻辑被简单但有效的调试值所代替:

protected void Page_Load(object sender, EventArgs e)
{
    mainMenu.DataSource = new[] { "M1", "M2" };
    mainMenu.DataBind();
}

protected void mainMenu_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    var childMenu = e.Item.FindControl("childMenu") as ListView;

    // will always be null, because ID scope is not correct
    ListView recommendedProducts1 = e.Item.FindControl("recommendedProducts") as ListView;

    // query the correct ID scope, but Items will be empty
    foreach (var item in childMenu.Items)
    {
        var recommendedProducts2 = item.FindControl("recommendedProducts") as ListView;
    }

    // initialize sub-items
    childMenu.DataSource = new object[] { "C1", "C2" };
    childMenu.DataBind();

    // query the correct ID scope, with items
    foreach (var item in childMenu.Items)
    {
        // finally, recommendedProducts for each childmenu-item within the currently processed childmenu is accessible
        var recommendedProducts3 = item.FindControl("recommendedProducts") as ListView;
        recommendedProducts3.DataSource = new[] { "Best" };
        recommendedProducts3.DataBind();
    }
}

为了完整性起见,我测试了ASPX:

<asp:ListView ID="mainMenu" runat="server" OnItemDataBound="mainMenu_ItemDataBound">
    <LayoutTemplate>
        <ul>
            <li id="itemPlaceholder" runat="server"/>
        </ul>
    </LayoutTemplate>
    <ItemTemplate>
        <li runat="server">
            <%# Container.DataItem %>
            <asp:ListView ID="childMenu" runat="server">
                <LayoutTemplate>
                    <ul>
                        <li id="itemPlaceholder" runat="server"/>
                    </ul>
                </LayoutTemplate>
                <ItemTemplate>
                    <li runat="server">
                        <%# Container.DataItem %>
                        <div class="recommended">
                            <asp:ListView ID="recommendedProducts" runat="server">
                                <ItemTemplate>
                                    <div style="background-color:green">
                                        <%# Container.DataItem %>
                                    </div>
                                </ItemTemplate>
                            </asp:ListView>
                        </div>
                    </li>
                </ItemTemplate>
            </asp:ListView>
        </li>
    </ItemTemplate>
</asp:ListView>

希望这有助于了解何时,如何以及如何访问控件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法从Listview的EditText获取值?

来自分类Dev

从android中的嵌套json获取值并将其传递给listview

来自分类Dev

在ListView中获取值微调器(android)

来自分类Dev

在ListView C#的ItemTemplate中获取值

来自分类Dev

从可扩展 ListView 中的 Child 获取值

来自分类Dev

如何从Android ListView中的选定行中获取值?

来自分类Dev

嵌套的ListView或嵌套的Repeater

来自分类Dev

从嵌套字典获取值

来自分类Dev

从父活动获取值将返回null

来自分类Dev

如何从父 ViewController 中的 ContainerView 获取值?

来自分类Dev

无法获取ListView来停止闪烁

来自分类Dev

无法从 ListView 获取所选项目文本

来自分类Dev

无法从JSON获取值

来自分类Dev

无法从Gridview获取值

来自分类Dev

无法从groupby获取值

来自分类Dev

无法获取值

来自分类Dev

无法从Gridview获取值

来自分类Dev

无法从mysql获取值

来自分类Dev

无法从 JSONObject 获取值

来自分类Dev

如何从嵌套字典获取值?

来自分类Dev

从嵌套的Json对象获取值

来自分类Dev

从嵌套JSON中获取值

来自分类Dev

如何从ListView获取值并将JSON数据传递到另一个Activity

来自分类Dev

如何在回发时从ListView中的动态控件获取值?

来自分类Dev

Android ListView - 从 SQLite 中获取值,其中一列的分组依据

来自分类Dev

无法从自定义ListView Android获取ImageView onItemClick [编辑]

来自分类Dev

从json api获取数据但无法在listview中查看

来自分类Dev

WPF嵌套绑定麻烦:使用嵌套ListView访问外部ListView

来自分类Dev

获取ListView的高度