ASP.NET Plusieurs contrôles avec le même ID " x " ont été trouvés. FindControl
L'erreur suivante se produit
Plusieurs contrôles avec le même ID 'ltlItemCode' ont été trouvés. FindControl exige que des contrôles ont des Identifiants uniques.
Cette Erreur ne se produit pas sur le chargement de la page, mais lorsque je change la valeur d'une liste déroulante 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();
}`
Tout progrès en la matière?
OriginalL'auteur | 2009-02-16
Vous devez vous connecter pour publier un commentaire.
Je suppose que c'est le problème, on dirait que vous êtes en train d'ajouter le même contrôle sur et sur, mais je ne suis pas sûr. Essayez de changer la .ID de nouvellement inscrits à l'Littérale.
Aussi, je n'ai jamais utilisé "EnsureID()" avant, mais il semble que cela pourrait aider. Quelque chose le long des lignes de
Qui ne fonctionne pas bien, car il a l'air comme il l'aurait fait d'insérer la même copie de duplicateLiteral, bien que, je ne suis pas sûr.
J'ai édité la réponse à inclure un extrait de l'aide de EnsureID(). Laissez-moi savoir si cela fonctionne
OriginalL'auteur Allen Rice
Je suis d'accord qu'il semble que vous ajoutez plus de et plus ce qui provoque un conflit de noms. Aussi, il semble que vous pouvez peut-être ajouter des contrôles à d'autres contrôles de Contrôles de collections dans le mauvais ordre. Par exemple, vous ajoutez dans cet ordre:
Lorsque vous devriez vraiment être ajouter dans cet ordre:
En règle générale, j'essaie toujours d'ajouter un nouveau contrôle pour les Contrôles parent collection dès que possible pour s'assurer que tous les contrôles enfants héritent de la bonne id unique. Si vous créez un nouveau Contrôle X et commencer à ajouter à X. Contrôles AVANT d'ajouter X à la société mère Contrôle la collecte puis l'enfant contrôles ne peuvent pas hériter de la bonne id unique.
OriginalL'auteur jakejgordon
Je ne pense pas que EnsureID permettra de résoudre votre problème, car cela ne fera que créer un ID pour les contrôles qui n'ont pas déjà un.
Comme Allen points, vous ajoutez la même commande à plusieurs reprises encore. Vous devez créer de nouvelles commandes, ce qui vous donnera de nouvelles Id. Vous êtes également appel FindControl pour un contrôle vous avez déjà une référence pour... ? Copier des données à partir de l'existant de contrôle si vous avez besoin, mais ne pas ajouter le contrôle existant à plusieurs reprises. Pour un littéral, sans doute la seule chose de valeur, c'est le texte? Afin de modifier votre code pour quelque chose comme:
OriginalL'auteur Bryan