private void arryCB()
{GroupBox[] gb=new GroupBox[9];
int i;
int n=0;//读取项目
int gbb=0;//groupbox bing
int row;//gropubox row
int beforeRow=0;//上一个的行数
string[,] tt=new string[9,30];
CheckBox[,] cb=new CheckBox[9,30];
string[] filename={"content0.txt","content1.txt","content2.txt","content3.txt","content4.txt","content5.txt","content6.txt","content7.txt","content8.txt"};

for (i=0;i<8;i++)
{
gb[i]=new GroupBox();
//gb[i].Name = "groupBox8";

gb[i].TabIndex =i ;
gb[i].TabStop = false;
gb[i].Text = i.ToString();
gb[i].Visible=true;
this.tabPage1.Controls.Add(gb[i]);
StreamReader sr=new StreamReader(filename[i],System.Text.Encoding.GetEncoding("gb2312"));//循环读文件中的内容 int y=20;//
int x=0;//定义位置


while ((tt[i,n]=sr.ReadLine())!=null)
{

cb[i,n]=new CheckBox();


cb[i,n].Location = new System.Drawing.Point(90*x+10,y);
cb[i,n].Name = "checkBox1";
cb[i,n].TabIndex =n;
cb[i,n].Text = tt[i,n];
cb[i,n].Size=new System.Drawing.Size(15*tt[i,n].Length+20, 20);
gb[i].Controls.Add(cb[i,n]); n++; if ((n%6)==0)
{
y=y+24;
x=0;
}
else
{
x++;
}
//****************************


}

if ((n/6)==0)
{
row=n/6;

}
else
{
row=(n / 6+1);
}

if (i==0)
{
gb[i].Location = new System.Drawing.Point(24, 10);
gbb=10;
beforeRow=row;
}
else
{
gb[i].Location = new System.Drawing.Point(24, 10+beforeRow*35+gbb);
gbb=10+beforeRow*35+gbb;
gb[i].Text+=beforeRow.ToString();
beforeRow=row;
} gb[i].Size = new System.Drawing.Size(560, 35*row);
//b[i]=n;
n=0;
sr.Close(); }
}

解决方案 »

  1.   

    因为string[,] tt=new string[9,30];若下面这段代码中的文件的长度超过30行的话:
    则tt[i,n]=sr.ReadLine())不就越界了吗?while ((tt[i,n]=sr.ReadLine())!=null)
    {

    cb[i,n]=new CheckBox();


    cb[i,n].Location = new System.Drawing.Point(90*x+10,y);
    cb[i,n].Name = "checkBox1";
    cb[i,n].TabIndex =n;
    cb[i,n].Text = tt[i,n];
    cb[i,n].Size=new System.Drawing.Size(15*tt[i,n].Length+20, 20);
    gb[i].Controls.Add(cb[i,n]); n++; if ((n%6)==0)
    {
    y=y+24;
    x=0;
    }
    else
    {
    x++;
    }
    //****************************

    }
      

  2.   

    肯定没有越界,我一个text文件中最多只有18行。
      

  3.   

    这一句cb[i,n].Name = "checkBox1";改成cb[i,n].Name = "checkBox"+n.ToString();看看先。
      

  4.   

    哦,最好改成:cb[i,n].Name = "checkBox1"+i.ToString()+n.ToString();
      

  5.   

    我估计是我的数组的作用范围定义上有问题,我如果在这个函数中访问就不会出什么问题,...
    ==>那时自然,出了这个函数,该函数定义的局部变量当然不能访问了。可以在class级定义这些需要引用的控件数组。如:
    public class MyControls
    {
        GroupBox[] gb=new GroupBox[9];    CheckBox[,] cb=new CheckBox[9,30];    //............
       private void arryCB(){...}
    }
      

  6.   

    那怎么样通过他的name属性访问这个控件呢?
      

  7.   

    按你程序中定义的name属性其实没有什么用,还是要改定义的范围,在class中定义成类的成员变量,这样在类内部访问就没有问题,但要公开的话,在定义的时候,加上public修饰符。