none
vs2008 C# 中动态控件删除问题 RRS feed

  • 问题

  •  private void button1_Click(object sender, EventArgs e)
            {
               int N;
                try
                {
                    N = int.Parse(textBox2.Text.Trim());

                }
                catch (Exception)
                {
                    MessageBox.Show("请输入数字");
                    return;
                }
               TextBox[] tbs = new TextBox[N];
               for (int i = 0; i < N; i++)
             {
                  tbs[i] = new TextBox();
                  this.Controls.Add(tbs[i]);
                   tbs[i].Size = new Size(100, 100);
                 tbs[i].Location = new Point(400, (i + 1) * 20);
               }
                。。。

     private void button2_Click(object sender, EventArgs e)/*清除所有数据*/
            {
               
                
                    textBox1.Text = "";
                    label3.Text = "";
                    textBox2.Text = "";
                } 
                   请问各位大侠,我在一个控件中声明并添加一个动态的 TextBox[] ,并且把计算的值放在其中,但是当我想用另一个控件清除这个控件时(因为对应不同的N,结果是不同的),怎么也做不到,求求各位大侠帮帮我。谢谢了!
               
              

    2011年6月15日 15:00

答案

  • 你好

    你需要在方法外面定义一个数组,但不要直接赋值给他。需要在点击button1的时候去动态创建N个textbox。

     TextBox[] tbs = null;
      private void button1_Click(object sender, EventArgs e)
    
      {
      int N;
      try
       {
        N = int.Parse(textBox1.Text.Trim());
     }
       catch (Exception)
       {
        MessageBox.Show("请输入数字");
        return;
       }
       tbs = new TextBox[N];  
       for (int i = 0; i < N; i++)
       {
        tbs[i] = new TextBox();
        this.Controls.Add(tbs[i]);
        tbs[i].Size = new Size(100, 100);
        tbs[i].Location = new Point(400, (i + 1) * 20);
       }
      }
      private void button3_Click(object sender, EventArgs e)
      {
       int index = int.Parse(textBox2.Text);
       this.Controls.Remove(tbs[index]);
     }
    
    

     


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已标记为答案 Cookie Luo 2011年6月21日 4:17
    2011年6月17日 5:37
  • 你好

    出现这个问题是因为,你的textbox2输入的是textbox数组的长度,但是你remove方法需要的是索引,因此每次都会超出数组界限。

     private void button2_Click_1(object sender, EventArgs e)
            {
                int index = int.Parse(textBox2.Text) - 1;
                this.Controls.Remove(tbs[index]);

                Z = 0;

                textBox1.Text = "";
                label3.Text = "";
                textBox2.Text = "";
            }


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 秦臻 2011年6月21日 1:57
    2011年6月20日 3:42

全部回复

  •  int index =int.Parse( textBox3.Text);
                this.Controls.Remove(tbs[index]);
    Ellis_Wong
    2011年6月15日 15:33
  • 谢谢您的回复!只是我还有有一些不清楚,因为我的 TextBox[] 数组是在另一个click事件中定义的,在这个click事件中不承认这个数组。当我想全局定义时,输入量N又不能满足,因为N是非静态的。请大侠帮我解决,深深致谢。
    秦臻
    2011年6月16日 1:55
  • 把 N 放到成员变量那里去,或者这届把 TextBox[] 写成一个成员变量,那样两个事件都可以访问了。
    学习学习....
    2011年6月17日 3:57
  • 你好

    你需要在方法外面定义一个数组,但不要直接赋值给他。需要在点击button1的时候去动态创建N个textbox。

     TextBox[] tbs = null;
      private void button1_Click(object sender, EventArgs e)
    
      {
      int N;
      try
       {
        N = int.Parse(textBox1.Text.Trim());
     }
       catch (Exception)
       {
        MessageBox.Show("请输入数字");
        return;
       }
       tbs = new TextBox[N];  
       for (int i = 0; i < N; i++)
       {
        tbs[i] = new TextBox();
        this.Controls.Add(tbs[i]);
        tbs[i].Size = new Size(100, 100);
        tbs[i].Location = new Point(400, (i + 1) * 20);
       }
      }
      private void button3_Click(object sender, EventArgs e)
      {
       int index = int.Parse(textBox2.Text);
       this.Controls.Remove(tbs[index]);
     }
    
    

     


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已标记为答案 Cookie Luo 2011年6月21日 4:17
    2011年6月17日 5:37
  • namespace 求周期
    {

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            double Z;
            TextBox[] tbs = null;

            private void button1_Click(object sender, EventArgs e)
            {
                double H, R;
              int N;
                try
                {
                    N = int.Parse(textBox2.Text.Trim());

                }
                catch (Exception)
                {
                    MessageBox.Show("请输入数字");
                    return;
                }
               tbs = new TextBox[N];
               for (int i = 0; i < tbs.Length; i++)
               {
                   tbs[i] = new TextBox();
                   this.Controls.Add(tbs[i]);
                   tbs[i].Size = new Size(100, 100);
                   tbs[i].Location = new Point(400, (i + 1) * 20);
               }
               
               
              
                double[] T = new double[N];
                double[] L = new double[N];
                try
                {
                    R = double.Parse(textBox1.Text.Trim());

                }
                catch (Exception)
                {
                    MessageBox.Show("请输入数字");
                    return;
                }
                H = -10 * Math.Log(R);        
             
                for (int i = 0; i < N; i++)
                {
                   
                  double p = 0;
                    for (int j = 0; j < tbs.Length; j++)
                    {
                        p += T[j];
                    }
                       int k = 1;
                        do
                        {
                            L[i] += Math.Pow(1.15,i) * 0.06* Math.Pow(k + 2.8 * p, 3) * Math.Exp(0.03 * (k + 1.5 * p));
                            k++;

                        } while (H - L[i] >= 0.000001);

                        T[i] = k - 1 ;

                      
                    tbs[i].Text = string.Format("T{0}={1}", i, T[i]);              
                }
                for (int j = 0; j < tbs.Length; j++)
                {
                   Z += T[j];
                }
                label3.Text = Z.ToString();
            }

            private void button2_Click(object sender, EventArgs e)
            {
                int index = int.Parse(textBox2.Text);
                this.Controls.Remove(tbs[index]);         
                 
                Z = 0;           

                    textBox1.Text = "";
                    label3.Text = "";
                    textBox2.Text = "";
                }    
               
              } 
          }

    当我点击button2_click时候,提醒"索引超出了数组界限",请大侠帮帮我,是不是不应该使用动态的textbox[],有没有别的方法解决我的问题。我的代码都在这里了。


    秦臻
    2011年6月20日 2:18
  • 给每个control起个名字

    tbs[i] = new TextBox();

    tbs[i],name="tbs"+i;

    然后可以用

    this.controls.find("tbs"+i,true)(0)找到对应控件


    http://feiyun0112.cnblogs.com/
    2011年6月20日 2:31
    版主
  • 你好

    出现这个问题是因为,你的textbox2输入的是textbox数组的长度,但是你remove方法需要的是索引,因此每次都会超出数组界限。

     private void button2_Click_1(object sender, EventArgs e)
            {
                int index = int.Parse(textBox2.Text) - 1;
                this.Controls.Remove(tbs[index]);

                Z = 0;

                textBox1.Text = "";
                label3.Text = "";
                textBox2.Text = "";
            }


    Cookie Luo[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 秦臻 2011年6月21日 1:57
    2011年6月20日 3:42
  • 太感谢了,谢谢您不厌其烦的帮助我。我的感激之情无法用语言表达,虽然不是我自己弄出来的,但我还是很开心。
    秦臻
    2011年6月21日 1:59