自定义了一个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引用,故这种方式也是没法用

解决方案 »

  1.   


     usercontrol里怎么  会有 类似form的active事件呢?
      

  2.   


            private void UserControl1_ParentChanged(object sender, EventArgs e)
            {
                Control ctl = this.Parent;
            }
    在用户控件的ParentCHanged事件里,来得到控件所属的parentform.
      

  3.   

    如果直接把代码写死在form的active事件中是可以,但问题是我的usercontrol并不知道自己会被哪个form引用,故这种方式也是没法用 
    查 Form.ActiveForm
      

  4.   

    为什么要得到parentform?
    parentform是个没办法确定的东西
    就算得到又能怎么样?你可以在你的UserControl中定义事件
    然后再窗体监视这个事件不就结了么或者定义一个public的方法
    等着parentform调用
      

  5.   

    在parentForm中设置userControl的Tag为parentForm
    在userControl中就可以通过Tag访问parentForm。试试
      

  6.   

    VisibleChanged事件,
    if(this.Visible)
      

  7.   

    usercontrol.ParentControl属性,就是你要的form了.
    我记得有这个属性.
      

  8.   

    通过parent属性是没法确定的,比如usercontrol放在一个panel中,这个panel再放在form中
    usercontrol的parent属性只能得到panel,而不是所在的form,而panel又可能先于form加载,这样panel的parent属性是null
      

  9.   

    UserControl1_ParentChanged
    这个解决不了你的问题吗?还有你想知道usercontrol的parentForm.
    可以递归查找啊.
    如果parent是Form,就找到了,如果不是,继续查找他的Parent.
      

  10.   


    考虑这样的情况,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本身是以何种顺序加载控件,都能正确的得到所在的窗体?
      

  11.   

    UserControl也是Window,所以如果lz想要Activate事件或者时机可以通过WM_ACTIVATE消息来判断,如果WParam是WA_ACTIVE,WA_CLICKACTIVE均是激活,只有WA_INACTIVE是不激活(具体值记不清了,lz自己去MSDN查一下吧