C # удаление динамических текстовых полей с помощью флажка - PullRequest
1 голос
/ 06 октября 2011

Я пишу код на 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

    }
}

Ответы [ 2 ]

1 голос
/ 06 октября 2011

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

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

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

EDIT

Скопируйте и вставьте все в форму1, например 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 голос
/ 06 октября 2011

Для WinForms я рекомендую поместить сгенерированные TextBox в поле Tag CheckBox.Затем ведите управляемый список всех флажков.После того, как они нажмут кнопку «Удалить», переберите коллекцию флажков.Если их состояние проверено, вытащите TextBox из поля Tag, удалите его из коллекции форм, затем удалите его.

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

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

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 );
           }
        }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...