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

usercontrol里怎么没有类似form的active事件,晕死了
自定义了一个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引用,故这种方式也是没法用


------解决方案--------------------

 usercontrol里怎么 会有 类似form的active事件呢?
------解决方案--------------------
C# code

        private void UserControl1_ParentChanged(object sender, EventArgs e)
        {
            Control ctl = this.Parent;
        }

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


查 Form.ActiveForm
------解决方案--------------------
为什么要得到parentform?
parentform是个没办法确定的东西
就算得到又能怎么样?

你可以在你的UserControl中定义事件
然后再窗体监视这个事件不就结了么

或者定义一个public的方法
等着parentform调用
------解决方案--------------------
在parentForm中设置userControl的Tag为parentForm
在userControl中就可以通过Tag访问parentForm。试试
------解决方案--------------------
VisibleChanged事件,
if(this.Visible)

------解决方案--------------------
usercontrol.ParentControl属性,就是你要的form了.
我记得有这个属性.
------解决方案--------------------
UserControl1_ParentChanged
这个解决不了你的问题吗?

还有你想知道usercontrol的parentForm.
可以递归查找啊.
如果parent是Form,就找到了,如果不是,继续查找他的Parent.
------解决方案--------------------
UserControl也是Window,所以如果lz想要Activate事件或者时机可以通过WM_ACTIVATE消息来判断,如果WParam是WA_ACTIVE,WA_CLICKACTIVE均是激活,只有WA_INACTIVE是不激活(具体值记不清了,lz自己去MSDN查一下吧