日期:2014-05-18  浏览次数:20839 次

取控件的visible属性时总是false。
private   void   button1_Click(object   sender,   EventArgs   e)
                {
                        ClassLibrary1.Form1   fo   =   new   ClassLibrary1.Form1();
                        foreach   (Control   ct   in   fo.Controls)
                        {
                                MessageBox.Show(ct.Name   +   ct.Visible.ToString());
                        }
                }
我写了上面一段代码取某一窗体内控件的名称和Visible属性可是不管Visible是否是false取出来的总是false这是怎么回事?请大家帮忙看看,非常感谢!

------解决方案--------------------
因为fo的Visible就是False,没有被显示出来,所以他里面的所有控件都是不可见状态。
------解决方案--------------------
当然是FALSE. 你FO都没显示
------解决方案--------------------
刚做了个试验,当窗体不可见时,比如没有调用 Show,或调用 Show 之后又调用 Hide,那么子控件的 Visible 返回 false。
------解决方案--------------------
不太懂你的目的,但绕过去还是可以的

将空间visible属性本来是true改成false的原因,是由于InitializeComponent初始化控件的时候,将一个可见的控件,放入一个不可见的control里了,所以属性自动改为不可见。

你要是想绕过去,就把InitializeComponent函数里面该控件的内容提出来,将定义,初始化内容放在构造函数的 InitializeComponent()之下

将this.Controls.Add(this.comboBox1);放到Form1_Load函数里,使控件在show后才添加进可见窗体里面。
------解决方案--------------------
如果确实要取控件的Visible的值,直接取一定是不行的,因为它是否可见还取决于父控件的可见,按楼主的意思,如果确实想取设计时的设置好的那个值,可以用如下的方法来得到:

private void button1_Click(object sender, EventArgs e)
{
ClassLibrary1.Form1 fo = new ClassLibrary1.Form1();
foreach (Control ct in fo.Controls)
{
MethodInfo mi = ct.GetType().GetMethod( "GetState ", BindingFlags.Instance | BindingFlags.NonPublic);
if (mi != null)
{
object objVisible = mi.Invoke(ct, new object[] { 2 });
MessageBox.Show(ct.Name + objVisible.ToString());
}
}
}