C # удаление динамических текстовых полей с помощью флажка

#c# #winforms #checkbox #textbox

#c# #winforms #флажок #текстовое поле

Вопрос:

Я пишу код на C #, у меня есть 2 формы, и код динамически создает текстовые поля и соответствующие флажки. Написанный мной код успешно создает динамические текстовые поля и флажки. Однако я не могу удалить строку текстовых полей в выбранной строке флажка.

 public void CreateTextBox(int i, StringReader sr)
        {
        ProductForm form2 = new ProductForm();
        _cb = new CheckBox[i];
        form2.Visible = true;
        form2.Activate();

        int x = 10;
        int y = 30;
        int width = 100;
        int height = 20;


        for (int n = 0; n < i; n  )
        {

            String line = sr.ReadLine();
            String[] line_ = line.Split(new char[] {'t'});

            String cbName = "chkBox_"   n.ToString();



            _cb[n] = new CheckBox();
            _cb[n].Name = cbName;
            _cb[n].Location = new Point(2, y);
            _cb[n].Checked = false;
            form2.Controls.Add(_cb[n]);
            if (line.Length > 3)
            {

                for (int row = 0; row < 4; row  )
                {
                    String name = "txtBox_"   row.ToString();
                    TextBox tb = new TextBox();
                    tb.Name = name;
                    tb.Text = line_[row].ToString();
                    tb.Location = new Point(x, y);
                    tb.Height = height;
                    if (row == 1)
                    {
                        tb.Width = width * row;
                    }

                    if (row == 3)
                    {
                        tb.Width = width * 5;
                    }
                    else
                    {
                        tb.Width = width - 20;
                    }
                    x  = 10   width;
                    form2.Controls.Add(tb);

                }
            }
            x = 10;
            y  = 25;

        }

    }

    private void DeleteTextBoxButton_Click(object sender, EventArgs e)
    {
        //Here should I add a code in order to delete dynamically created 
        //textboxes by clicking checkbox and button

    }
}
  

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

1. Похоже на winforms, но не могли бы вы указать, идет ли речь о winforms / webforms / WPF, пожалуйста?

2. Довольно очевидно, что он хочет, чтобы кто-то заполнил пробел в его функции.

3. да, мне нужен код для кнопки DeleteTextBoxButton_Click, который позволит мне удалить целую строку текстовых полей для установленных флажков.

4. Скриншот был бы очень полезен. Приводит ли нажатие флажка рядом с текстовым полем к удалению текстового поля или вам нужно удалить все текстовые поля с соответствующим установленным флажком?

5. Каждая строка содержит 4 текстовых поля и 1 флажок. Когда я нажимаю флажок, а затем нажимаю кнопку, код удаляет всю строку текстовых полей. Я могу выбирать текстовые поля с их именами.

Ответ №1:

Не уверен в вашем вопросе. Но если я прав, это может помочь.

РЕШЕНИЕ 1: при создании всех элементов управления добавьте их в a List<Controls> . Когда вы устанавливаете флажок для удаления строки, получите имя флажка, выполните поиск в List<Controls> . Таким образом, таким образом, можно получить индекс строки, в которой установлен флажок. Теперь удалите элементы управления из этих строк.

РЕШЕНИЕ 2: создайте свои элементы управления в TableLayoutPanel, и все будет просто.

Редактировать

Скопируйте и вставьте все в form1, используя btn_click в качестве обработчика событий для кнопки. Пусть размер формы будет немного большим. Теперь все должно работать нормально. Если не работает, дайте мне знать.

 class MyControl
{
    public TextBox txt1 { get; set; }
    public TextBox txt2 { get; set; }
    public TextBox txt3 { get; set; }
    public TextBox txt4 { get; set; }
    public CheckBox cb { get; set; }

    public MyControl(TextBox txt1, TextBox txt2, TextBox txt3, TextBox txt4, CheckBox cb)
    {
        this.txt1 = txt1;
        this.txt2 = txt2;
        this.txt3 = txt3;
        this.txt4 = txt4;
        this.cb = cb;
    }

}


    List<MyControl> list = new List<MyControl>();
    public int x = 50, n = 1;
    TextBox txtTemp, txt1, txt2, txt3, txt4;
    CheckBox cbTemp;
    private void btn_Click(object sender, EventArgs e)
    {

        txtTemp = new TextBox();
        txtTemp.Location = new System.Drawing.Point(10, x);
        txtTemp.Name = "txt1_"   n;
        txt1 = txtTemp;

        txtTemp = new TextBox();
        txtTemp.Location = new System.Drawing.Point(120, x);
        txtTemp.Name = "txt2_"   n;
        txt2 = txtTemp;

        txtTemp = new TextBox();
        txtTemp.Location = new System.Drawing.Point(230, x);
        txtTemp.Name = "txt3_"   n;
        txt3 = txtTemp;

        txtTemp = new TextBox();
        txtTemp.Location = new System.Drawing.Point(350, x);
        txtTemp.Name = "txt4_"   n;
        txt4 = txtTemp;

        cbTemp = new CheckBox();
        cbTemp.Name = "cb1_"   n;
        cbTemp.Enter  = new EventHandler(cbTemp_Enter);
        cbTemp.Location = new System.Drawing.Point(490, x);

        this.Controls.Add(txt1);
        this.Controls.Add(txt2);
        this.Controls.Add(txt3);
        this.Controls.Add(txt4);
        this.Controls.Add(cbTemp);

        list.Add(new MyControl(txt1, txt2, txt3, txt4, cbTemp));

        x  = 40;
        n  ;
    }

    void cbTemp_Enter(object sender, EventArgs e)
    {
        if ((MessageBox.Show("Are you Sure?", "Warning", MessageBoxButtons.YesNo)) == DialogResult.No)
            return;

        CheckBox cbMain = (CheckBox)sender;
        int index = Search(cbMain);

        this.Controls.Remove(list[index].txt1);
        this.Controls.Remove(list[index].txt2);
        this.Controls.Remove(list[index].txt3);
        this.Controls.Remove(list[index].txt4);
        this.Controls.Remove(list[index].cb);
    }

    private int Search(CheckBox cbMain)
    {
        int temp = 0;
        foreach (MyControl item in list)
        {
            if(cbMain.Name == item.cb.Name)
                temp = list.IndexOf(item);
        }
        return temp;
    }
  

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

1. Сейчас я пробую первое решение. Решение 2 звучит хорошо, но у меня нет опыта в этом.

2. для списка создайте класс (MyControls) со свойствами общедоступного элемента управления (например, текстовое поле, кнопки и все, что у вас есть). При создании каждой строки добавьте объект MyControl в список. Вы закончили почти со всем.

3. rapsalands можете ли вы написать пример того, как я могу создать список и объект MyControl?

Ответ №2:

Для WinForms я рекомендую помещать сгенерированные текстовые поля в поле тега флажка. Затем сохраните управляемый список всех флажков. Как только они нажмут кнопку удаления, выполните итерацию по коллекции флажков. Если их состояние проверено, извлеките текстовое поле из поля тега, удалите его из коллекции форм, а затем удалите.

ПРИМЕЧАНИЕ: Этот код не тестировался, но в принципе должен работать.

ОБНОВЛЕНИЕ: читая ваш последний комментарий, вместо того, чтобы сохранять одно текстовое поле в теге, просто создайте еще один их список и сохраните весь список в теге. Затем выполните итерацию по тем, которые указаны в методе удаления.

 private List<CheckBox> _checkboxes = new List<CheckBox>();

public void CreateTextBox( int i, StringReader r )
{
   // ... do your stuff here
   _cb[n].Tag = tb;
   // ... finish up
   _checkboxes.Add( _cb[n] );
}

public void DeleteTextBoxButton_Click( object sender, EventArgs e )
{
   foreach( var cb in _checkboxes )
   {
       if( cb.Checked )
       {
           TextBox tb = cb.Tag as TextBox;
           if( tb != null )
           {
              form2.Controls.Remove( tb );
           }
        }
   }
}
  

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

1. Я сделаю именно так, либо по тегу, либо через поле имени. Однако я не знаю, как я могу получить доступ к своим флажкам и текстовым полям в моей функции кнопки? Как я могу повторить это в цикле foreach или for.

2. Свойство _checkboxes в моем примере определено на уровне класса вне методов, поэтому оно будет видно внутри метода DeleteTextBoxButton_Click .

3. Я действительно заблудился в вашем решении. Я пытался, но не смог заставить это работать на меня. Все еще пытаюсь это сделать.