我在Form窗口中拖了些控件,那么,这些控件的集合的索引值是怎么算的呢?
也就是说控件集合的索引值所对应的控件,系统是怎么算的,我又没有设置过,但还是弹出了窗口
MessageBox.Show(this.Controls[4].Text);

解决方案 »

  1.   

    之前的 for循环  不是 添加了70个么   this.panel1.Controls.Add(label);   
    所以this.Controls[0-69].Text
    索引就是0-69   超出就错了  要是70就错
      

  2.   

    应该是基于最外层的Form开始算的,Controls[0]应该就是这个Form本身吧
    然后按照在InitialnizeComponent()方法中声明的顺序去算的
    瞎猜的,没测试过的
      

  3.   

    如果这个控件this.Controls[4]刚好没有Text属性呢?
    最好之前先判断一下
    if(this.Controls[4] is TextBox)
    ...
      

  4.   

    MessageBox.Show(this.Controls[4].Text);没有这样写的吧!应该是这样吧string a=(this.Controls[4] as TextBox).Text.ToString();
    MessageBox.Show(a);估计是这样的,没试过,呵呵!
      

  5.   

    Controls集合中控件的索引就是控件的Z层叠顺序
    z层叠顺序决定当两个控件有一部分或者完全重叠的时候,哪个控件显示在上面
    (究竟是z值大的显示在上面还是z值小的显示在上面各种框架中不同,一般是大的显示在上面)
    WinForm的控件没有ZIndex之类的属性来设置z层叠顺序
    控件在Controls集合中的索引就把这个工作也包揽了
    在Controls集合中索引小的显示在上面一般来说,就像List<T>一样,你最先添加的控件索引值为0,后添加的就1,2,3,4一直递增
    所以默认情况下先添加的控件显示在最上面(当然,这个添加不是指你在窗口设计器里“画”的顺序,而是用代码往Controls集合中添加控件。你去看窗口设计器生成的代码,后画上去的控件是先添加到Controls集合中的),这种行为不是很直观(一般都会认为后添加的会盖住先添加的)这个顺序也可以人为修改
    控件自己有BringToFront和SendToBack方法来改变自己在Controls集合中索引(看方法名就知道是提升和降低z层叠顺序)
    ControlCollection(Controls属性的类型)有SetChildIndex方法来设置控件的索引,GetChildIndex函数来查询控件的索引
      

  6.   

    索引值和添加顺序有关,添加顺序是VS自动生成的定义好的,在Form.Designer.cs中可以找到,比如
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(594, 116);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.comboBox1);
      

  7.   

    z层叠顺序(也就是控件在Controls集合中的索引)不仅影响控件重叠时哪个控件显示在上面
    当两个可以获得焦点的控件具有相同的TabIndex时,Z层叠顺序小的那个会先获得焦点ControlCollectionl内部会维护所有控件的索引,保证索引值是从0开始,并且是连续递增的
    比如你的窗口只有5个子控件,现在你调用SetChildIndex,试图把某一个控件的索引值设为100,结果就是把那个控件的索引值设为了4,而不会引发异常。(同样,你把某个控件的索引设为-1这样的无效值也会导致控件的索引值被设置为最大)窗口Controls集合包含窗口的所有子控件
    即便你不显式地调用Controls.Add();方法,而是用其他方法来建立控件和窗口之间的父子关系,控件也会被添加到Controls集合中。比如设置控件的Parent属性:
    Button btn=new Button();
    btn.Parent=this;
      

  8.   

    我发觉两种生成控件的方法,期Controls的索引值不同第一种:在代码中循环生产控件
     private void Form1_Load(object sender, EventArgs e)
            {
                Label label;
                int a = -10;
                for (int i = 0; i < 70; i++)
                {
                    label = new Label(); 
                    label.Height = 72; 
                    label.Width = 10;
                    label.Top = 0;
                    label.Name = "label" + i.ToString();
                    a += 10;
                    label.Left = a;
                    label.BackColor = Color.Transparent;
                    this.panel1.Controls.Add(label);   
                }            
            }
    第二种:直接往窗口中拖控件情况是这样的:
    第一种方法,其最先生成的控件,Controls索引值为0
    第二种方法,其最后生成的控件,Controls索引值为0不知道是不是这样的?请解释一下?谢谢!!!!
      

  9.   

    MessageBox.Show(this.Controls["label4"].Text);
      

  10.   

    我在7L解释了啊,
    当然,这个添加不是指你在窗口设计器里“画”的顺序,而是用代码往Controls集合中添加控件。你去看窗口设计器生成的代码,后画上去的控件是先添加到Controls集合中的窗口设计器他实际上是根据你的一些操作来生成一些初始化语句
    比如你在窗口上画了Button1,Button2,Button3三个按钮(就没有其他东西了)
    那么窗口设计器生成的代码是:
    this.Controls.Add(Button3);
    this.Controls.Add(Button2);
    this.Controls.Add(Button1);
    你是按照1,2,3的顺序画的,但是窗口设计器实际上是按照3,2,1的顺序在往Controls里添加,结果就是Button3的索引为0,显示在最上面