C#通过复选框删除动态文本框

时间:2011-10-05 20:10:22

标签: c# winforms checkbox textbox

我正在用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 个答案:

答案 0 :(得分:1)

对于WinForms,我建议将生成的TextBox放入CheckBox的Tag字段中。然后保留所有CheckBoxes的托管列表。一旦他们单击删除按钮,迭代CheckBoxes集合。如果检查了它们的状态,请将TextBox从Tag字段中拉出,将其从表单集中删除,然后将其删除。

注意:此代码未经测试但原则上应该有效。

更新:阅读您的最新评论,而不是在标记中存储单个TextBox,只需创建另一个列表并将整个列表存储在标记中。然后遍历delete方法中的那些。

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 :(得分:1)

不确定你的问题。但如果我是对的,这可以解决问题。

SOLUTION1:创建所有控件时,将它们添加到List<Controls>。当您选中复选框以删除行时,请获取复选框的名称,在List<Controls>中搜索它。因此,这种方式可以获取单击复选框行的索引。现在删除那些行的控件。

SOLUTION2:在TablelayoutPanel中创建控件,一切都很简单。

修改

将form1中的所有内容复制,se 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;
    }