ASP.NET Обнаружено несколько элементов управления с одинаковым идентификатором «x». FindControl

Получение следующей ошибки

Обнаружено несколько элементов управления с одинаковым идентификатором ltlItemCode. FindControl требует, чтобы элементы управления имели уникальные идентификаторы.

Эта ошибка возникает не при загрузке страницы, а при изменении значения раскрывающегося списка с AutoPostBack="true".

Код

    //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();
    }`

person Community    schedule 16.02.2009    source источник
comment
Есть ли прогресс в этом?   -  person Serge    schedule 24.04.2013


Ответы (3)



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

Я предполагаю, что проблема в этом, похоже, вы добавляете один и тот же элемент управления снова и снова, но я не уверен. Попробуйте изменить .ID только что добавленного литерала.

Кроме того, я никогда не использовал "EnsureID( )" раньше, но кажется, что это может помочь. Что-то в духе


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

Это может не сработать, поскольку похоже, что одна и та же копия дубликатаLiteral будет вставляться снова и снова, хотя я не уверен.

person Allen Rice    schedule 16.02.2009
comment
Каков синтаксис использования Ensue ID? - person ; 16.02.2009
comment
Я отредактировал ответ, включив в него фрагмент кода с помощью SureID(). дай мне знать, если это работает - person Allen Rice; 16.02.2009

Я согласен, что похоже, что вы снова и снова добавляете один и тот же элемент управления, что вызывает конфликт имен. Также похоже, что вы можете добавлять элементы управления в коллекции Controls других элементов управления в неправильном порядке. Например, вы добавляете в таком порядке:

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

Когда вы действительно должны добавлять в этом порядке:

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

Как правило, я всегда стараюсь как можно скорее добавить новый элемент управления в родительскую коллекцию Controls, чтобы убедиться, что все дочерние элементы управления наследуют правильный уникальный идентификатор. Если вы создаете новый элемент управления X и начинаете добавлять его в X.Controls ДО добавления X в родительскую коллекцию элементов управления, то дочерние элементы управления могут не наследовать правильный уникальный идентификатор.

person jakejgordon    schedule 21.02.2009

Я не думаю, что SureID решит вашу проблему, так как это создаст идентификатор только для элементов управления, у которых его еще нет.

Как указывает Аллен, вы снова и снова добавляете один и тот же элемент управления. Вам нужно создать новые элементы управления, которые дадут вам новые идентификаторы. Вы также вызываете FindControl для элемента управления, на который у вас уже есть ссылка...? При необходимости скопируйте данные из существующего элемента управления, но не добавляйте существующий элемент управления повторно. Для литерала, наверное, единственное, что в нем ценно, это текст? Поэтому измените свой код на что-то вроде:

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
person Bryan    schedule 17.02.2009