2013-10-13 70 views
1

在asp.net web应用程序中,从数据库填充datalist时出现此错误。
在设计的网页我有一个项目模板标签内的一些标签,当我试图通过FindControl访问这些标签,它给人的错误:Asp.net对象引用错误

Object reference not set to an instance of object

这里是我的代码:

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

几乎所有的'NullReferenceException'都是一样的。请参阅“[什么是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)”的一些提示。 –

回答

0

要自定义您的单个DataList项目,您需要在ItemDataBound事件中执行此操作。查看this教程了解更多详情。

但是,看起来您正在以不正确的方式接近您的任务。底线是你需要将你的DataSource绑定到一个项目集合,并且你试图一个接一个地提供它的项目。让我知道,如果我误解了你,你确实需要绑定一个单独的产品到你的DataList,在绑定时定制它的外观。

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"; 
    } 
} 
0

我觉得把你拉布勒在其他物体一样的面板。你应该在html代码中找到你的标签的真实名称,所以最好的方法是在你的脚本代码中输入一个错误的错误,当你的解决方案运行时,它会停下来,你可以找到你的标签控件的真实名称。然后使用以下代码:

标签标题标签=(标签)DataList1.FindControl(“标签控制的真实名称”);

我希望它能帮助你。