2009-02-16 11 views
5

Ottenere il seguente erroreASP.NET Sono stati trovati controlli multipli con lo stesso ID 'x'. FindControl

Sono stati trovati più controlli con lo stesso ID 'ltlItemCode'. FindControl richiede che i controlli abbiano ID univoci.

Questo errore non si verifica nei carichi della pagina ma quando cambio il valore di un menu a discesa con AutoPostBack = "true".

Codice è

//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

Qualche progresso su questo? – Serge

risposta

3

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

Sto indovinando questo è il problema, sembra che si sta aggiungendo lo stesso controllo più e più volte, ma non sono sicuro. Prova a cambiare l'ID di quel letterale appena aggiunto.

Inoltre, non ho mai utilizzato "EnsureID()" prima, ma sembra che possa essere d'aiuto. Qualcosa sulla falsariga di


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

Questo non può funzionare, però, dal momento che sembra che sarebbe inserire la stessa copia di duplicateLiteral più e più volte, anche se, non sono sicuro.

+0

Qual è la sintassi per l'utilizzo di Ensue ID? –

+0

Ho modificato la risposta per includere uno snippet usando ConfirmID(). Fammi sapere se funziona –

1

Non penso che l'IDENTIFICAZIONE risolverà il problema, poiché creerà solo un ID per i controlli che non ne hanno già uno.

Come sottolinea Allen, si aggiunge lo stesso controllo più e più volte. Devi creare nuovi controlli, che ti daranno nuovi ID. Stai anche chiamando FindControl per un controllo su cui hai già un riferimento ...? Copia i dati dal controllo esistente se necessario, ma non aggiungere ripetutamente il controllo esistente. Per un letterale, probabilmente l'unica cosa di valore in esso è il testo? Quindi modificare il codice a qualcosa di simile:

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

Sono d'accordo che sembra che si sta aggiungendo lo stesso controllo più e più volte che provoca un conflitto di nomi. Sembra anche che tu possa aggiungere controlli ad altri controlli "Controlla le raccolte nell'ordine sbagliato. Ad esempio, si sta aggiungendo in questo ordine:

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); 

quando si dovrebbe davvero essere l'aggiunta in questo ordine:

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

Come regola generale, cerco sempre di aggiungere un nuovo controllo per i controlli padre raccolta il prima possibile per garantire che qualsiasi controllo figlio erediti l'ID univoco corretto. Se crei un nuovo Control X e inizi ad aggiungere a X.Controls PRIMA di aggiungere X all'insieme Controlli principale, i controlli figlio potrebbero non ereditare l'ID univoco corretto.