一个Panel上 有多个控件
其中有些用户控件 有些自定义的属性
现在想遍历这个Panel上的所有控件 并访问其属性 
Foreach(Control c in Panel.Controls)
{
     c.  
}这里访问不到这个c原来应该有的属性譬如这个c是一个label的时候 他应该有Text属性 但访问不了
再譬如遍历到这个c是我的一个用户控件的时候  c应该有一个isControl的属性   但是也访问不了请大大们指教

解决方案 »

  1.   

    Foreach(Label in Controls)
    {
      c.Text貌似这样就ok
    }
      

  2.   


     问题是,我预先是不知道他是label 他可能是其他控件 我要每个类型都做一次foreach吗?
      

  3.   

    你在循环中调用的是Control基类中的属性和方法,所以肯定无法获取具体控件的响应属性和方法咯。比如你创建一个Student类,他里面有Age属性,可是当你把一个学生看成是Object的话,你肯定找不到Age属性的foreach(Control c in Panel.Controls)
    {
      if(c is Label)   
         ((Label)c).Text;
      if(c is YourControl)
         ((YourControl)c).isControl;
      //你先将看看c是否可以转换成你希望处理的类型,然后再处理
    }
      

  4.   

    也可以用反射来实现(如果性能影响不是很大的话),代码如下(已经测试过没有问题)
            public void getPropertyValue(Control container)
            {
                string[] propertyNames = { "Text", "Value", "Name" }; //想要取得的属性名称 
                Type typeCtr = null;
                object obj = null;
                System.Reflection.PropertyInfo p = null;
                StringBuilder sbResult = new StringBuilder();            foreach (Control ctr in container.Controls)
                {
                    typeCtr = ctr.GetType();//取得控件的类别
                    foreach (string str in propertyNames)
                    {
                        p = typeCtr.GetProperty(str); //取得指定名称的属性
                        if (p != null)
                        {
                            obj = p.GetValue(ctr, null); //取得属性对应的值
                            sbResult.AppendLine(string.Format("控件 {0} 的属性 {1} 的值为:{2}", ctr.Name, p.Name, obj)); //输出结果
                        }
                    }
                }            MessageBox.Show(sbResult.ToString());
            }        private void button1_Click(object sender, EventArgs e)
            {
                getPropertyValue(this);
            }
      

  5.   

    可以利用获得的控件变量,来进行判断控件类型是什么
            For i = 0 To parent.Controls.Count - 1 Step i + 1
                If TypeOf parent.Controls(i) Is TextBox Then
                    CType(parent.Controls(i), TextBox).Text = ""
                End If
            Next