自定义了一个usercontrol,想在控件第一次加载显示的时候执行一些代码,得到控件所属的parentform,发现没一个事件可以用
直接写在构造函数里的话,因为函数执行的时候控件还没有显示出来,parentform为null
createcontrol事件中没法取出parentform,也为null
试了一下load事件,发现这个load事件有时在构造函数都没执行的完的情况下会触发,比如usercontrol中包含了activex,这样的执行构造函
数中的InitializeComponent()是将会引发load事件,这个时候当然parentform也是null,又晕死
如果单单取usercontrol的parent属性的话,可以使用parentchanged事件,单如果usercontrol本身并不直接属于form,而是嵌套在某个其他的控件里的话,在parentchanged事件中通过递归查找parent的方法也是没法取到顶级窗体的(最后还是得到null)
怎么就没有parentformchanged事件呢?
如果直接把代码写死在form的active事件中是可以,但问题是我的usercontrol并不知道自己会被哪个form引用,故这种方式也是没法用
直接写在构造函数里的话,因为函数执行的时候控件还没有显示出来,parentform为null
createcontrol事件中没法取出parentform,也为null
试了一下load事件,发现这个load事件有时在构造函数都没执行的完的情况下会触发,比如usercontrol中包含了activex,这样的执行构造函
数中的InitializeComponent()是将会引发load事件,这个时候当然parentform也是null,又晕死
如果单单取usercontrol的parent属性的话,可以使用parentchanged事件,单如果usercontrol本身并不直接属于form,而是嵌套在某个其他的控件里的话,在parentchanged事件中通过递归查找parent的方法也是没法取到顶级窗体的(最后还是得到null)
怎么就没有parentformchanged事件呢?
如果直接把代码写死在form的active事件中是可以,但问题是我的usercontrol并不知道自己会被哪个form引用,故这种方式也是没法用
usercontrol里怎么 会有 类似form的active事件呢?
private void UserControl1_ParentChanged(object sender, EventArgs e)
{
Control ctl = this.Parent;
}
在用户控件的ParentCHanged事件里,来得到控件所属的parentform.
查 Form.ActiveForm
parentform是个没办法确定的东西
就算得到又能怎么样?你可以在你的UserControl中定义事件
然后再窗体监视这个事件不就结了么或者定义一个public的方法
等着parentform调用
在userControl中就可以通过Tag访问parentForm。试试
if(this.Visible)
我记得有这个属性.
usercontrol的parent属性只能得到panel,而不是所在的form,而panel又可能先于form加载,这样panel的parent属性是null
这个解决不了你的问题吗?还有你想知道usercontrol的parentForm.
可以递归查找啊.
如果parent是Form,就找到了,如果不是,继续查找他的Parent.
考虑这样的情况,form中包含一个panel,panel中包含一个usercontrol,usercontrol中挂接了ParentChanged事件,
可能存在如下类似的加载代码
Form frm=new Form();
Panel pl=new Panel();
UserControl uc=new UserControl();
pl.Controls.Add(uc);
//运行到这里会引发UserControl的ParentChanged事件,但在这个事件中遍历Parent的结果是Null,因为pl的Parent还没有设置
frm.Controls.Add(pl);
//运行到这里pl的Parent设置好了,但并不会引发UserControl的ParentChanged事件,即UserControl并不知道这个变化当然把上述代码的顺序改成
frm.Controls.Add(pl);
pl.Controls.Add(uc);
就能解决问题,但关键问题是上述的加载顺序并不是UserControl所能控制的,比如典型的vs本身IDE生成的就是前面描述的加载顺序,而这种顺序恰恰是会出现问题的。能否不管Form本身是以何种顺序加载控件,都能正确的得到所在的窗体?