我的网站在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)中
为了解决该问题,有两个主要概念需要理解。
关于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] 删除。
我来说两句