2010-12-14 79 views
0

Ok les gars, donc j'essaie de lier les données dans une liste déroulante de C#. Je reçois une erreur Null en essayant d'entrer les données dans les DDL. J'utilise ce code pour la partie frontale.Lier des données SQL aux listes déroulantes dans les répéteurs C#

<asp:Repeater ID="RepeaterHardDrives" runat="server"> 
        <HeaderTemplate> 
         <table border="0" cellpadding="0" cellspacing="0" width="100%"> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <tr> 
          <td> 
           <asp:HiddenField ID="hidHardDrivesPackageDefaultID" runat="server" /> 
           <asp:HiddenField ID="hidHardDrivesPackageDefaultPrice" runat="server" /> 
           <span> 
            <asp:Label runat="server" ID="lbHardDiskPrice" Text="$00.00/mo"></asp:Label></span><label>Hard 
             Drive:</label><asp:DropDownList ID="ddHardDrive" DataTextField="ItemName" DataValueField="ProductItemID" runat="server" CssClass="lidropdown"> 
             </asp:DropDownList> 
           <asp:ImageButton runat="server" ID="ShowHarddriveInfo" ImageUrl="/_Images/server_configurator_helpbutton.png" 
            OnClick="lnkShowHarddriveInfo_OnClick" /></div> 
          </td> 
          <td align="right"> 
           <asp:Label runat="server" ID="lbHardDrivesPrice" /> 
          </td> 
         </tr> 
        </ItemTemplate> 
        <FooterTemplate> 
         </table> 
         <br /> 
        </FooterTemplate> 
       </asp:Repeater> 

pour le back-end, je suis en train de charger un nombre dynamique de listes déroulantes dans le répéteur puis DataBind tous avec les mêmes données.

public void PopulateHardDrives(int intSupportedDrives) 
    { 
    PreloadHardDriveRepeater(intSupportedDrives); 

    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["connstrname"].ConnectionString); 
    SqlCommand cmd = new SqlCommand("Prod_SelectIDNamePriceByCategory", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@CategoryCode", "Hard Drive"); 
    DataTable dtHardDrives = new DataTable(); 
    using (conn) 
    { 
     conn.Open(); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     dtHardDrives.Load(dr); 
     ViewState.Add("dtHardDrives", dtHardDrives); 
    } 

    foreach (RepeaterItem riHardDrive in RepeaterHardDrives.Items) 
    { 
     DropDownList ddHardDrives = (DropDownList)riHardDrive.FindControl("ddHardDrives"); 
     ddHardDrives.DataSource = dtHardDrives;//program gives NULL exception error here(object not set to instance of object however it know the count of the rows it is supposed to be pulling) 
     ddHardDrives.DataValueField = "ProductItemID"; 
     ddHardDrives.DataTextField = "ItemName"; 
     ddHardDrives.DataBind(); 
     Label lbHardDrive = (Label)riHardDrive.FindControl("lbHardDrivesPrice"); 
     lbHardDrive.Text = String.Format("{0:c}", Convert.ToDecimal("0.00")); 
     if (riHardDrive.ItemIndex != 0) //We do not want to allow None to be selected on the main drive 
     { 
     ddHardDrives.Items.Insert(0, "None"); 
     } 
    } 
    } 

and last but not least the function to setup the dynamic amount of DDL's looks like this 

    private void PreloadHardDriveRepeater(int intSupportedDrives) 
    { 
     int[] intArrDisks = new int[intSupportedDrives]; 
     for (int intDiskCount = 0; intDiskCount < intArrDisks.Length; intDiskCount++) 
     { 
      intArrDisks[intDiskCount] = intDiskCount; 
     } 
     RepeaterHardDrives.DataSource = intArrDisks; 
     RepeaterHardDrives.DataBind(); 
    } 

J'appelle une liste de fonctions POPULATE dans un Page.IsPostBack! Instruction if et le seul qui ne reçoit pas les données est celui-ci avec les listes Drown. Il obtient le nombre de Rows (18) de la base de données, mais il lance une erreur Null (Référence d'objet non définie sur une instance d'un objet). J'ai vu pas mal de gens courir cette erreur en recherchant le problème , mais je ne pouvais pas trouver une solution qui a fonctionné pour moi. La fonction PreloadHardDriveRepeater semble fonctionner correctement lorsqu'elle s'exécute seule elle charge la quantité correcte de DDL sur la page.

Merci d'avance.

Répondre

1

Votre commande est « ddHardDrive »:

<asp:DropDownList ID="ddHardDrive" DataTextField="ItemName" DataValueField="ProductItemID" runat="server" CssClass="lidropdown"> 

et votre code recherche « ddHardDrives »

riHardDrive.FindControl("ddHardDrives"); 

Ce serait facile de remarquer si vous débogués dans la fonction et regardé votre valeurs de variable juste avant que l'exception soit levée.

+0

lol ok bien qui a fonctionné à merveille (pas étonnant aucun des exemples que j'ai trouvé travaillé). merci de me prêter vos yeux – h34dhun73r