2012-06-05 2 views
2

Я создаю ярлык «label1» динамически в методе. Затем, когда я нажимаю кнопку, я хочу удалить эту метку, но если я пишу Controls.Remove (label1), то говорится, что элемент управления не существует в контексте. Как я мог это сделать?Удалить метку, созданную во время выполнения CF C#

EDIT: Следующее предложение Джона я внедрил цикл foreach, но он ничего не делает. Это мой код, то панель, который я использую создается дизайн:

void GenerateControls() { 
    Label labelOne = new Label(); 
    Button btnContinue = new Button(); 
    panel.SuspendLayout(); 
    SuspendLayout(); 
    //btnContinue 
    btnContinue.BackColor = System.Drawing.Color.Black; 
    btnContinue.ForeColor = System.Drawing.SystemColors.Menu; 
    btnContinue.Location = new System.Drawing.Point(145, 272); 
    btnContinue.Name = "btnContinue"; 
    btnContinue.Size = new System.Drawing.Size(95, 28); 
    btnContinue.TabIndex = 13; 
    btnContinue.Text = "Continue"; 
    btnContinue.Visible = true; 
    Controls.Add(btnContinue); 
    btnContinue.Click += new System.EventHandler(btnContinue_Click);    
    //labelOne    
    labelOne.Location = new Point(0,65); 
    labelOne.Size = new System.Drawing.Size(100,20); 
    labelOne.Text = "labelOne"; 
    labelOne.Name = "labelOne"; 
    labelOne.Visible = true; 
    labelOne.TextChanged += new System.EventHandler(this.lbl_TextChanged); 
    labelOne.BackColor = System.Drawing.Color.PaleGreen; 
    Controls.Add(labelOne); 
    //panel 
    panel.Controls.Add(labelOne); 
    panel.Visible = true; 
    panel.Location = new Point(0,0); 
    panel.Size = new Size(240, 320); 
    // 
    Controls.Add(panel); 
    panel.ResumeLayout(); 
    ResumeLayout(); 
} 

А потом, когда я нажмите на btnContinue:

private void btnContinuar_Click(object sender, EventArgs e) { 
    foreach (Control control in panel.Controls) { 
     if (control.Name == "labelOne"){ 
      panel.Controls.Remove(control); 
      break; 
     } 
    } 
} 

Я отладить его и на панели. Контролируйте его, как будто это пустая панель. Спасибо за помощь!

+2

Давайте посмотрим код, который создал этикетку и назначенную его в контейнер. Возможно, вы не используете правильную ссылку экземпляра метки. –

+0

Я уже отлаживаю его с помощью BreakPoint, так я узнал, что ничего не нашел. Больше идей? –

ответ

5

Я подозреваю, что в этом контексте нет переменной . Вам нужно будет найти ярлык по его тексту или узнать что-то еще об этом. Например, при создании его можно было установить Name собственность и найти его, что, когда вы хотите, чтобы удалить его:

panel.Controls.RemoveByKey("YourLabelName"); 

EDIT: Как было отмечено в комментариях, RemoveByKey не существует в компактной структуре. Таким образом, вы бы либо должны помнить ссылку самостоятельно (в этом случае вам не нужно имя) или использовать что-то вроде:

foreach (Control control in panel.Controls) 
{ 
    if (control.Name == "YourLabelName") 
    { 
     panel.Controls.Remove(control); 
     break; 
    } 
} 

EDIT2: И чтобы сделать его еще более «общий» и рабочий стол совместимые, вы можете держать вызов RemoveByKey и добавьте в ваше приложение:

public static class FormExtensions 
{ 
    public static void RemoveByKey(this Control.ControlCollection collection, 
            string key) 
    { 
     if(!RemoveChildByName(collection, key)) 
     { 
      throw new ArgumentException("Key not found"); 
     } 
    } 

    private static bool RemoveChildByName(
     this Control.ControlCollection collection, 
     string name) 
    { 
     foreach (Control child in collection) 
     { 
      if (child.Name == name) 
      { 
       collection.Remove(child); 
       return true; 
      } 

      // Nothing found at this level: recurse down to children. 
      if (RemoveChildByName(child.Controls, name)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
} 
+1

Джон прав. Просто потому, что вы создали его, как Label label1 = new Label() не делает его имя label1, вам нужно было бы сказать label1.Name = "label1"; Затем вы можете удалить его, как вы пробовали в своем коде. И Джон, замедлив ход, и пусть остальные из нас ответят на некоторые вопросы) –

+1

Так же, как небольшая точка информации, 'RemoveByKey' не существует в Compact Framework, поэтому вам придется сначала ее найти (если вы не сделали этого, t aready имеют справочный словарь), а затем удалите его. – ctacke

+0

@ctacke: Ох, спасибо - не заметил этого. Будет редактировать. –

4

После 20 изменений в ОП вопрос, и ответ на Джон, без сходства с исходной задачей, вы остались с одной небольшим глюком.

Ваш не добавляющий labelOne к панели, которую вы добавляете в форму.

Изменить

Controls.Add(labelOne); 

в

panel.Controls.Add(labelOne); 

Тогда все должно работать

+0

Спасибо! Я добавлял labelOne к панели AND к форме. Когда я добавляю labelOne только к панели, проблема решена. –

+0

Рад, что я могу помочь –

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