2009-02-16 17 views
5

Obtention de l'erreur suivanteASP.NET Plusieurs contrôles avec le même ID 'x' ont été trouvés. FindControl

Plusieurs contrôles avec le même ID 'ltlItemCode' ont été détectés. FindControl requiert que les contrôles aient des ID uniques.

Cette erreur ne se produit pas sur les chargements de page mais lorsque je change la valeur d'un menu déroulant qui a AutoPostBack = "true".

code

est

//Number of Services 
    numberofServices = Int32.Parse(DCCFunctions.GetNumServicesPerRoom(roomId.ToString())); 
    additionalServices = new UserControls_AdditionalService[numberofServices - 1]; 

    String htmlTable = String.Empty; 
    Int32 cell = 1; 
    Int32 rows = numberofServices; 
    Int32 cols = 4; 


    TableHeaderRow h = new TableHeaderRow(); 
    TableHeaderCell hc1 = new TableHeaderCell(); 
    hc1.Text = "Item Description"; 
    h.Cells.Add(hc1); 
    TableHeaderCell hc2 = new TableHeaderCell(); 
    hc2.Text = "Item Price"; 
    h.Cells.Add(hc2); 
    TableHeaderCell hc3 = new TableHeaderCell(); 
    hc3.Text = "Item Quantity"; 
    h.Cells.Add(hc3); 
    TableHeaderCell hc4 = new TableHeaderCell(); 
    hc4.Text = "Item Sub Total"; 
    h.Cells.Add(hc4); 
    Table1.Rows.Add(h); 

    // Open database connection 
    DBConnection conn = new DBConnection(); 

    // Retrieve details 
    SqlCommand sqlGetDetails = conn.SetStoredProcedure("spGetAdditionalServicesDetails"); 
    DBConnection.AddNewParameter(sqlGetDetails, "@roomId", ParameterDirection.Input, SqlDbType.Int, roomId); 

    try 
    { 
     conn.Open(); 

     SqlDataReader reader_list = sqlGetDetails.ExecuteReader(); 
     if (reader_list.HasRows) 
     { 
      while (reader_list.Read()) 
      { 
       //returnVal = reader_list["Num"].ToString(); 
       htmlTable += "<tr>" + Environment.NewLine; 
       TableRow r = new TableRow(); 

       additionalServices[cell - 1] = (ASP.usercontrols_additionalservice_ascx)LoadControl("~/UserControls/AdditionalService.ascx"); 

       Literal ItemCode = (Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal; 
       ItemCode.Text = reader_list["itemDescription"].ToString(); 


       Literal ItemPrice = (Literal)additionalServices[cell - 1].FindControl("ltlItemPrice") as Literal; 
       ItemPrice.Text = "€" + reader_list["unitPrice"].ToString(); 

       Literal ItemTotal = (Literal)additionalServices[cell - 1].FindControl("ltlTotalPrice") as Literal; 
       ItemTotal.Text = "€" + "0"; 

       TableCell ItemCodeCell = new TableCell(); 
       ItemCodeCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal); 

       TableCell ItemCodePriceCell = new TableCell(); 
       ItemCodePriceCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlItemPrice") as Literal); 

       TableCell ItemCodeTotalCell = new TableCell(); 
       ItemCodeTotalCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlTotalPrice") as Literal); 

       TableCell c = new TableCell(); 
       DropDownList qtyList = (DropDownList)additionalServices[cell - 1].FindControl("qtyList") as DropDownList; 
       qtyList.Items.Add(new System.Web.UI.WebControls.ListItem("Select Quantity...", "0")); 
       qtyList.DataBind(); 

       for (Int32 count = 1; count < 101; count++) 
       { 
        qtyList.Items.Add(new System.Web.UI.WebControls.ListItem(count.ToString(),count.ToString())); 
       } 
       //c.ColumnSpan = 5; 
       c.Controls.Add((DropDownList)additionalServices[cell - 1].FindControl("qtyList") as DropDownList); 


       r.Cells.Add(ItemCodeCell); 
       r.Cells.Add(ItemCodePriceCell); 
       r.Cells.Add(c); 
       r.Cells.Add(ItemCodeTotalCell); 
       //r.Controls.Add(additionalServices[cell - 1]); 
       //cell += 1; 

       // Add the row 
       Table1.Rows.Add(r); 
      } 
     } 
     reader_list.Close(); 
    } 
    catch (Exception ex) 
    { 
     M1Utils.ErrorHandler(ex); 
    } 
    finally 
    { 
     conn.Close(); 
    }` 
+0

Des progrès à ce sujet? – Serge

Répondre

3

ItemCodeCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal); 

Je suppose que le problème est, il semble que vous ajoutez le même contrôle et plus, mais je ne suis pas sûr. Essayez de changer le .ID de ce littéral nouvellement ajouté.

Aussi, je n'ai jamais utilisé "EnsureID()" avant mais il semble que cela puisse aider. Quelque chose le long des lignes de


Literal duplicateLiteral = (Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal; 
duplicateLiteral.EnsureID(); 
ItemCodeCell.Controls.Add(duplicateLiteral); 

Cela peut ne pas fonctionner bien, car on dirait qu'il insérerait la même copie de duplicateLiteral encore et, bien, je ne suis pas sûr.

+0

Quelle est la syntaxe pour utiliser Ensue ID? –

+0

J'ai modifié la réponse pour inclure un extrait utilisant EnsureID(). Faites-moi savoir si cela fonctionne –

1

Je ne pense pas que EnsureID va résoudre votre problème, car cela ne créera qu'un ID pour les contrôles qui n'en ont pas déjà.

Comme Allen le souligne, vous ajoutez le même contrôle encore et encore. Vous devez créer de nouveaux contrôles, ce qui vous donnera de nouveaux ID. Vous appelez également FindControl pour un contrôle auquel vous avez déjà fait référence ...? Copiez les données du contrôle existant si nécessaire, mais n'ajoutez pas le contrôle existant à plusieurs reprises. Pour un littéral, probablement la seule chose de valeur est le texte? Donc, changer votre code à quelque chose comme:

Literal ItemCode = (Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal; 
ItemCode.Text = reader_list["itemDescription"].ToString(); 

Literal ItemCode2 = new Literal(); //create a new control 
ItemCode2.Text = ItemCode.Text;  //copy the data you need 

TableCell ItemCodeCell = new TableCell(); 
ItemCodeCell.Controls.Add(ItemCode2); // add new control 
3

Je suis d'accord qu'il semble que vous ajoutez le même contrôle et sur ce qui provoque un conflit de nom. Il semble également que vous puissiez ajouter des contrôles aux collections Controls d'autres contrôles dans le mauvais ordre. Par exemple, vous ajoutez dans cet ordre:

TableHeaderRow h = new TableHeaderRow();  
TableHeaderCell hc1 = new TableHeaderCell();  
hc1.Text = "Item Description";  
h.Cells.Add(hc1);  
TableHeaderCell hc2 = new TableHeaderCell();  
hc2.Text = "Item Price";  
h.Cells.Add(hc2);  
TableHeaderCell hc3 = new TableHeaderCell();  
hc3.Text = "Item Quantity";  
h.Cells.Add(hc3);  
TableHeaderCell hc4 = new TableHeaderCell();  
hc4.Text = "Item Sub Total";  
h.Cells.Add(hc4);  
Table1.Rows.Add(h); 

Lorsque vous devriez vraiment ajouterez dans cet ordre:

TableHeaderRow h = new TableHeaderRow(); 
Table1.Rows.Add(h); 
TableHeaderCell hc1 = new TableHeaderCell(); 
h.Cells.Add(hc1); 
hc1.Text = "Item Description";  
TableHeaderCell hc2 = new TableHeaderCell(); 
h.Cells.Add(hc2);  
hc2.Text = "Item Price";  
TableHeaderCell hc3 = new TableHeaderCell(); 
h.Cells.Add(hc3);  
hc3.Text = "Item Quantity";  
TableHeaderCell hc4 = new TableHeaderCell(); 
h.Cells.Add(hc4);  
hc4.Text = "Item Sub Total";  

En règle générale, j'essaie toujours d'ajouter un nouveau contrôle aux contrôles des parents la collecte dès que possible pour garantir que les contrôles enfants héritent de l'ID unique correct. Si vous créez un nouveau contrôle X et commencez à ajouter à X.Controls avant d'ajouter X à la collection de contrôles parent, les contrôles enfants peuvent ne pas hériter le droit UniqueID.