例如有个Panel1
里面有一个TextBox1Panel1.Controls[0]对应的是TextBox1
现在如果我知道了TextBox1,有没什么方法可以直接获取它所在父容器的集合编号?
也就是整数0

解决方案 »

  1.   

    只能通过循环找到对象后,才知道该对象的索引private void Form1_Load(object sender, EventArgs e)
            {
                Panel p = textBox1.Parent as Panel;
                if (p != null)
                {
                    foreach (Control c in p.Controls)
                    {
                        if (c.GetType() == typeof(TextBox))
                        {
                            TextBox txt = c as TextBox;
                            txt.Text = "Text属性";
                            //若有多个TextBox对象,可再判断名称
                            //if (txt.Name == "txtABC")
                            //{                        //}
                        }
                    }
                }
            }
      

  2.   

    这个方法不好,
    (name属性在代码里写是可以重复的)
    你是先判断类型再判断name属性。但是这两个都可以重复的,所以准确性太低了,而且如果容器多话就不好。。觉得应该有办法可以直接获取的。
    求高人解答。。
      

  3.   

    4楼,还是那句准确性太低了。
    而且用到循环速度效率减低。
    我觉得
    Panel1.Controls[0]可以通过下标直接指向控件,控件应该有理由知道它自己下标啊。
    真的没其它办法了吗?
      

  4.   

    Panel1.Controls[0]可以通过下标直接指向控件,控件应该有理由知道它自己下标啊。
    真的没其它办法了吗?我所了解的是没有其它办法了。
    你看构造函数中的InitializeComponent()知道它是怎么一回事了。
      

  5.   

    当然变向的方法也不是没有,那就是你自已那个类似HashTable一样的东西,然后再InitializeComponent()做相应的管理,那么效率是可以提高的。
    但与设计器不能同步。
      

  6.   

    name属性在同一容器同一级同一级别下不允许重复的。你可以试试添加两个TextBox 到Panel 对象中,并设置相同的name,运行时就会报错的。
      

  7.   

    估计你没看清楚我的话,你是在VS里直接设置Name了。
    打开
    Form1.Designer.cs
    然后展开
    Windows 窗体设计器生成的代码
    看看这两个是不是一样的Name?
    你在VS里直接修改Name当然不行,那个VS直接把对象名字也改和Name一样的。
    意义不同的。
    ****************
                // 
                // textBox1
                // 
                this.textBox1.Location = new System.Drawing.Point(20, 34);
                this.textBox1.Name = "textBox";
                this.textBox1.Size = new System.Drawing.Size(100, 21);
                this.textBox1.TabIndex = 0;
                // 
                // textBox2
                // 
                this.textBox2.Location = new System.Drawing.Point(30, 61);
                this.textBox2.Name = "textBox";
                this.textBox2.Size = new System.Drawing.Size(100, 21);
                this.textBox2.TabIndex = 4;
    *****************
    你说的这么肯定没办法的话我信你。。
    我觉得直接判断哈希码准确点。。
      

  8.   


            void GetIndex(TextBox t)
            {
                Panel p = t.Parent as Panel;
                if (p != null)
                {
                    int i = 0;
                    foreach (Control c in p.Controls)
                    {                    if (c.Equals(t))
                        {
                            MessageBox.Show(i.ToString());
                        }
                        i++;
                    }            }
            }