#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. Я вижу 🙂 Я думаю, что лучше не задавать никаких вопросов в ответе, хотя 🙂