2013-07-25 3 views
1

Я должен создать Label и TextBox, когда CheckBoxList Событие SelectedIndexChanged пожаров.ошибка создания динамических элементов управления

Я попытался с помощью следующего кода, но он дает мне эту ошибку:

Multiple controls with the same ID 'mylab1' were found

protected void chkCar_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Panel2.Controls.Clear(); 
    string dat = DateTime.Parse(GridView1.SelectedRow.Cells[4].Text).ToString("dd-MMM-yyyy"); 
    lblName.Text = ""; 
    for (int i = 0; i < chkCar.Items.Count; i++) 
    { 
     int sum = 0; 
     if (chkCar.Items[i].Selected == true) 
     { 
      Panel tt = new Panel(); 
      Panel2.Controls.Add(new LiteralControl("<br />")); 
      Label mylab = new Label(); 
      mylab.ID = "mylab" + NextID1; 
      mylab.Text = "No of Persons in " + chkCar.Items[i].Value; 
      Panel2.Controls.Add(mylab); 
      ControlsList1.Add(mylab.ID); 

      TextBox mytext = new TextBox(); 
      mytext.ID = "mytext" + NextID2; 
      mytext.Text = ""; 
      Panel2.Controls.Add(mytext); 
      ControlsList2.Add(mytext.ID); 
     } 
    } 
} 

protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 
    foreach (string lbID in ControlsList1) 
    { 
     Label lb = new Label(); 
     lb.ID = lbID; 
     Panel2.Controls.Add(lb); 
     Panel2.Controls.Add(new LiteralControl("<br>")); 
    } 
    foreach (string txtID in ControlsList2) 
    { 
     TextBox tb = new TextBox(); 
     tb.ID = txtID; 
     Panel2.Controls.Add(tb); 
     Panel2.Controls.Add(new LiteralControl("<br>")); 
    } 
} 

private List<string> ControlsList1 //labels 
{ 
    get 
    { 
     if (ViewState["controls"] == null) 
     { 
      ViewState["controls"] = new List<string>(); 
     } 
     return (List<string>)ViewState["controls"]; 
    }      
} 

private List<string> ControlsList2 //textboxes 
{ 
    get 
    { 
     if (ViewState["controls"] == null) 
     { 
      ViewState["controls"] = new List<string>(); 
     } 
     return (List<string>)ViewState["controls"]; 
    } 
} 

private int NextID1//label 
{ 
    get 
    { 
     return ControlsList1.Count + 1; 
    } 
} 

private int NextID2//textbox 
{ 
    get 
    { 
     return ControlsList2.Count + 1; 
    } 
} 

Может кто-нибудь помочь мне знать, где я неправильно? Заранее спасибо.

ответ

0

Проблема заключается в методе NextID1, который генерирует увеличенные идентификаторы, он не дает вам уникальных номеров. Вы можете использовать переменную цикла, чтобы сделать идентификаторы уникальными. Я не мог видеть любой код для добавления контроля в ControlsList1 так, что метод NextID1 дает следующее число каждый контроль времени в добавляемые к ControlsList1

private int NextID1//label 
{ 
    get 
    { 
     return ControlsList1.Count + 1; 
    } 
} 

Вы также не положить (присвоение) ControlsList1 к ViewState

+0

Я попытался добавить переменную цикла и присвоить идентификатор, но показать ту же ошибку – Shanna

+2

Вы должны отлаживать код для просмотра, вы должны генерировать одинаковый идентификатор, попробуйте использовать идентификатор GUID как идентификатор только для тестирования. – Adil

1

Я представляю что для выполнения этой работы вам нужно добавить новые добавленные элементы управления в ControlsList1 и ControlsList2, в противном случае NextID1 и NextID2 всегда будут возвращать одинаковое число во время цикла for.

if (chkCar.Items[i].Selected == true) 
{ 
    Panel tt = new Panel(); 
    Panel2.Controls.Add(new LiteralControl("<br />")); 
    Label mylab = new Label(); 
    mylab.ID = "mylab" + NextID1; 
    mylab.Text = "No of Persons in " + chkCar.Items[i].Value; 
    Panel2.Controls.Add(mylab); 
    ControlsList1.Add(mylab.ID) // <--- here 

    TextBox mytext = new TextBox(); 
    mytext.ID = "mytext" + NextID2; 
    mytext.Text = ""; 
    Panel2.Controls.Add(mytext); 
    ControlsList2.Add(mytext.ID) // <--- and here 
} 
+0

Спасибо. но все же он показывает ту же ошибку – Shanna

1

Может просто попробовать, чтобы не загружать ViewState и очистить элементы управления каждый раз, когда вы запускаете ваше мероприятие флажок. Кстати, зачем вы загружаете ViewState? И если ViewState уже загружает элементы управления, а затем ваш флажок снова пытается загрузить элементы управления на панели.

Его слепой выстрел надеется, что это сработает.

+0

View State, потому что после обратной передачи исчезают динамически созданные метки и текстовые поля. Поэтому я попытался добавить loadviewstate. – Shanna

+1

Ну, я столкнулся с аналогичной проблемой, когда я создал динамические элементы управления, viewstate сохраняет управляющие значения во время обратной передачи, но не воссоздает динамически добавленные элементы управления. Поэтому возможно, когда ur viewstate попытается добавить новые элементы управления, те же элементы управления с похожим идентификатором уже присутствуют в viewstate , Проверьте эту ссылку http://www.codeproject.com/Articles/3684/Retaining-State-for-Dynamically-Created-Controls-i, если она помогает –

Смежные вопросы