2009-02-16 6 views
5

FehlermeldungASP.NET Mehrere Steuerelemente mit der gleichen ID "x" wurden gefunden. FindControl

Es wurden mehrere Steuerelemente mit derselben ID 'ltlItemCode' gefunden. FindControl erfordert, dass Steuerelemente eindeutige IDs haben.

Dieser Fehler tritt nicht beim Laden von Seiten auf, aber wenn ich den Wert eines Dropdown ändern, die AutoPostBack = "True" hat.

-Code ist

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

Irgendwelche Fortschritte dabei? – Serge

Antwort

3

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

Ich vermute, dass das Problem ist, es sieht aus wie Sie die gleiche Kontrolle über und über sind hinzufügen, aber ich bin nicht sicher. Versuchen Sie, die .ID des neu hinzugefügten Literals zu ändern.

Auch ich habe nie zuvor "EnsureID()" verwendet, aber es scheint, dass es helfen kann. Etwas nach dem Vorbild von


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

Das ist nicht obwohl arbeiten kann, da es aussieht wie es die gleiche Kopie von duplicateLiteral immer und immer wieder einsetzen würde, obwohl ich nicht sicher bin.

+0

Wie lautet die Syntax für die Verwendung der Ensue ID? –

+0

Ich habe die Antwort bearbeitet, um ein Snippet mithilfe von EnsureID() einzufügen. Lass es mich wissen, wenn das funktioniert –

1

Ich glaube nicht, EnsureID wird Ihr Problem lösen, da das nur eine ID für Steuerelemente erstellen wird, die nicht bereits eins haben.

Wie Allen betont, fügen Sie die gleiche Kontrolle immer wieder hinzu. Sie müssen neue Steuerelemente erstellen, die Ihnen neue IDs geben. Sie rufen auch FindControl für ein Steuerelement auf, auf das Sie bereits verweisen ...? Kopieren Sie bei Bedarf Daten aus dem vorhandenen Steuerelement, fügen Sie das vorhandene Steuerelement jedoch nicht wiederholt hinzu. Für ein Literal ist wahrscheinlich der einzige Wert darin der Text? So Ihr Code wie etwas ändern:

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

Ich bin damit einverstanden, dass es aussieht wie Sie die gleiche Kontrolle über hinzufügen und über was einen Namenskonflikt. Es sieht auch so aus, als ob Sie Steuerelemente anderer Steuerelemente möglicherweise in der falschen Reihenfolge hinzufügen. Zum Beispiel, fügen Sie in dieser Reihenfolge:

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

Wenn Sie wirklich in dieser Reihenfolge das Hinzufügen sollte:

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

In der Regel habe ich immer versuchen, eine neue Steuerung an die übergeordnete Steuerung hinzufügen Sammlung so schnell wie möglich, um sicherzustellen, dass alle untergeordneten Steuerelemente die richtige UniqueID erben. Wenn Sie ein neues Control X erstellen und mit dem Hinzufügen zu X.Controls beginnen, BEVOR Sie X zur übergeordneten Controls-Auflistung hinzufügen, übernehmen die untergeordneten Steuerelemente möglicherweise nicht die richtige UniqueID.