2013-10-13 2 views
1

Dans l'application Web asp.net, cette erreur s'affiche lors du remplissage de la base de données datalist.
Dans la page de conception que j'ai quelques étiquettes à l'intérieur d'une balise élément-modèle, lorsque je tente d'accéder à ces étiquettes en FindControl il donne l'erreur:Erreur de référence d'objet Asp.net

Object reference not set to an instance of object

voici mon code:

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> 

Erreur:

Line 25:    
Line 26:    Label TitleLabel = (Label)DataList1.FindControl("TitleLabel"); 
Line 27:    TitleLabel.Text = product.Name; 
Line 28: 
Line 29: 

S'il vous plaît aider, comment se débarrasser de cette erreur?

+0

Presque tous les cas de 'NullReferenceException' sont les mêmes. S'il vous plaît voir "[Qu'est-ce qu'une NullReferenceException dans .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)" pour quelques conseils. –

Répondre

0

Pour personnaliser vos éléments DataList individuels, vous devez le faire dans l'événement ItemDataBound. Découvrez tutoriel this pour plus de détails.

Cependant, il semble que vous abordiez votre tâche de manière incorrecte. En résumé, vous devez lier votre DataSource à une collection d'éléments, et vous essayez de les alimenter un à un. Faites-moi savoir si je vous ai mal compris et que vous devez lier un produit individuel à votre DataList en personnalisant son apparence au moment de la liaison.

2

La liste contient généralement plusieurs éléments, votre logique est donc erronée. Qu'est-ce que vous pouvez le faire gérer l'événement ItemDataBound de la liste en ajoutant cette ligne dans votre Page_Load:

DataList1.ItemDataBound += new DataListItemEventHandler(DataList1_ItemDataBound); 

Et avoir une telle méthode:

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

Je pense que votre lable mettre dans un autre objet même que le panneau . Vous devriez trouver le vrai nom de votre étiquette dans le code html, donc le meilleur moyen est de mettre une erreur dans le code de votre script lorsque votre solution est lancée, elle s'arrêtera et vous pourrez trouver le vrai nom de votre contrôle. Utilisez ensuite le code suivant:

Étiquette TitleLabel = (Label) DataList1.FindControl ("REAL NAME OF LABEL CONTROL");

J'espère que cela peut vous aider.