Пользовательский элемент управления добавляется / удаляется в зависимости от состояния флажка. Если он отмечен, пользовательский элемент управления добавлен правильно, но не работает для удаления

#c# #winforms

#c# #winforms

Вопрос:

Я пробовал со следующим кодом, но, тем не менее, он добавляет пользовательский элемент управления без каких-либо проблем, но удаления не происходит

   private void objCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            LabelWdTxtBox objLblWdTxtBox = new LabelWdTxtBox();// user control instance created
            objLblWdTxtBox.Controls[1].Name = ((ButtonBase)sender).Text;
            objLblWdTxtBox.Controls[1].Text = ((ButtonBase)sender).Text;
            objLblWdTxtBox.Controls[0].Name = ((ButtonBase)sender).Text;
            if (((CheckBox)sender).CheckState == CheckState.Checked)
            {
                
                flowLayoutUserControl.Controls.Add(objLblWdTxtBox);//adding the user control to panel
            }
            else if (((CheckBox)sender).CheckState == CheckState.Unchecked)
            {  
                     flowLayoutUserControl.Controls.Remove(objLblWdTxtBox);//Removing the user control to panel
                     objLblWdTxtBox.Dispose();  
            }
            flowLayoutUserControl.Refresh();
          // flowLayoutUserControl.ResumeLayout(false);
        }  

 
  

Комментарии:

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

Ответ №1:

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

 private void objCheckBox_CheckedChanged(object sender, EventArgs e)
{
    CheckBox cb = (CheckBox)sender;
    if (cb.CheckState == CheckState.Checked)
    {
        if (cb.Tag == null)
        {
            LabelWdTxtBox objLblWdTxtBox = new LabelWdTxtBox();// user control instance created
            objLblWdTxtBox.Controls[1].Name = ((ButtonBase)sender).Text;
            objLblWdTxtBox.Controls[1].Text = ((ButtonBase)sender).Text;
            objLblWdTxtBox.Controls[0].Name = ((ButtonBase)sender).Text;
            cb.Tag = objLblWdTxtBox;
        }
        flowLayoutUserControl.Controls.Add(cb.Tag); //adding the user control to panel
    }
    else 
    {
        if (cb.Tag != null)
        {  
            flowLayoutUserControl.Controls.Remove(cb.Tag); //Removing the user control to panel
        }
    }
}
  

Ответ №2:

Цель состоит в том, чтобы удалить текстовое поле после того, как пользователь снял флажок? Полностью удалить текстовое поле из элементов управления или сделать его невидимым?

Предполагая, что в вызываемой форме есть элемент управления флажком cb_User , и элемент управления текстовым tb_Input полем необходимо добавить / удалить из формы

 private void cb_User_CheckedChanged(object sender, EventArgs e)
{
    var checkbox = (CheckBox)sender;
    if (checkbox.Checked)
    {
        var tb_Input = new TextBox();
        tb_Input.Name = "tb_Input";
        this.Controls.Add(tb_Input);
    }
    else
    {
        var tb_Input = this.Controls.Find("tb_Input", true).First();
        this.Controls.Remove(tb_Input);
    }
}
  

То, что должно произойти, это найти элемент управления текстовым полем, который был добавлен ранее в форму, и удалить этот экземпляр из Form , что this.Controls.Find() и делает — он находит добавленный элемент управления по имени (обратите внимание, что у него установлено свойство name)

Комментарии:

1. @Scratte спасибо за разъяснения и -1, отправлено по ошибке перед добавлением фактического содержимого ответа.

2. Я вижу 🙂 Я думаю, что лучше не задавать никаких вопросов в ответе, хотя 🙂