在asp.net Web应用程序中,从数据库填充datalist
时出现此错误
在设计页面中,我在item-template标签中有一些标签,当我尝试通过FindControl
访问这些标签时,它会出错:
对象引用未设置为对象的实例
这是我的代码:
Products.aspx.cs:
public partial class Products : System.Web.UI.Page
{
Product product;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
DataList1.DataBind();
product = this.getProducts();
Label TitleLabel = (Label)DataList1.FindControl("TitleLabel");
TitleLabel.Text = product.Name;
Label DescLabel = (Label)DataList1.FindControl("DescLabel");
DescLabel.Text = product.LongDescription;
Label PriceLabel = (Label)DataList1.FindControl("PriceLabel");
PriceLabel.Text = product.UnitPrice.ToString();
ImageButton PImage = (ImageButton)DataList1.FindControl("ImageButton1");
PImage.ImageUrl = "images/"+product.ImageFile;
}
private Product getProducts()
{
Product p = new Product();
DataView productsTable = (DataView)
SqlDataSource1.Select(DataSourceSelectArguments.Empty);
foreach (DataRowView row in productsTable)
{
p.ProductID = row["P_Id"].ToString();
p.Name = row["Title"].ToString();
p.ShortDescription = row["Desc"].ToString();
p.LongDescription = row["Desc_full"].ToString();
p.UnitPrice = Convert.ToDecimal(row["Price"]);
p.ImageFile = row["imageurl"].ToString();
}
return p;
}
}
Products.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Products.aspx.cs" Inherits="ECProject.Products" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DataList ID="DataList1" runat="server" DataKeyField="P_Id"
DataSourceID="SqlDataSource1" RepeatColumns="4"
RepeatDirection="Horizontal" CellPadding="4" ForeColor="#333333" >
<AlternatingItemStyle BackColor="White" ForeColor="#284775" />
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<ItemStyle BackColor="#F7F6F3" ForeColor="#333333" />
<ItemTemplate >
<asp:ImageButton ID="ImageButton1" runat="server" Height = "200px"/>
<br />
Title:
<asp:Label ID="TitleLabel" runat="server" Text='<%# Eval("Title") %>' />
<br />
Brand:
<asp:Label ID="DescLabel" runat="server" Text='<%# Eval("Desc") %>' />
<br />
Available:
<asp:Label ID="Is_ActiveLabel" runat="server" Text='<%# Eval("Is_Active") %>' />
<br />
Price:
<asp:Label ID="PriceLabel" runat="server" Text='<%# Eval("Price") %>' />
<br />
</ItemTemplate>
<SelectedItemStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
</asp:DataList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\ECDB.mdf;Integrated Security=True;User Instance=True"
ProviderName="System.Data.SqlClient" SelectCommand="SELECT * FROM [Product]">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
错误:
Line 25:
Line 26: Label TitleLabel = (Label)DataList1.FindControl("TitleLabel");
Line 27: TitleLabel.Text = product.Name;
Line 28:
Line 29:
请帮助,如何摆脱这个错误?
答案 0 :(得分:2)
列表通常包含多个项目,因此您的逻辑存在缺陷。您可以通过在ItemDataBound
中添加以下内容来处理列表的Page_Load
事件:
DataList1.ItemDataBound += new DataListItemEventHandler(DataList1_ItemDataBound);
并有这样的方法:
void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Label TitleLabel = (Label)e.Item.FindControl("TitleLabel");
TitleLabel.Text = "changed by code";
}
}
答案 1 :(得分:0)
要自定义单个DataList项,您需要在ItemDataBound事件中执行此操作。查看this教程了解更多详情。
但是,看起来您正以错误的方式接近您的任务。最重要的是,您需要将DataSource绑定到项目集合,并且您尝试逐个提供项目。如果我误解了您,您需要将单个产品绑定到DataList,以便在绑定时自定义其外观。
答案 2 :(得分:0)
我认为你的标签放在与面板相同的其他对象中。你应该在html代码中找到你的标签的真实名称,所以最好的办法是在你的解决方案运行时在脚本代码中输入一个错误错误,它会停止并且你可以找到你的标签控件的真实名称。然后使用下面的代码:
Label TitleLabel =(Label)DataList1.FindControl(“标签控件的真实名称”);
我希望它可以帮到你。