处理父母VisibleChanged事件c#

时间:2013-11-28 12:06:07

标签: c# .net events

我创建了一个C#usercontrol。

此用户控件托管在如下面板中:

UserControlQuestion1 question1 = new UserControlQuestion1();
panel1.Controls.Add(question1);
panel1.Visible = true;

我想在usercontrol中添加一个事件处理程序来处理VisibleChanged事件面板。

我试过这个正确编译:

  private void InitializeComponent()
    {

        this.Parent.VisibleChanged += new System.EventHandler(this.Parent_VisibleChanged);

但是当我运行我的程序时,this.Parent为null,因为它尚未添加到父面板但我想

我该怎么做?

3 个答案:

答案 0 :(得分:1)

创建控件后设置VisibleChanged事件处理程序

UserControlQuestion1 question1 = new UserControlQuestion1();
panel1.Controls.Add(question1);
question1.Parent.VisibleChanged += new System.EventHandler(question1.Parent_VisibleChanged);
panel1.Visible = true;

OR

UserControlQuestion1 question1 = new UserControlQuestion1();
panel1.Controls.Add(question1);
panel1.VisibleChanged += new System.EventHandler(question1.Parent_VisibleChanged);
panel1.Visible = true;

答案 1 :(得分:1)

利用您目前所拥有的功能,您可以在用户控件中创建“注册事件”功能......

void RegisterEvent()
{
    this.Parent.VisibleChanged += new System.EventHandler(this.Parent_VisibleChanged);
}

您可以在将其添加到父级后调用:

UserControlQuestion1 question1 = new UserControlQuestion1();
panel1.Controls.Add(question1);
question1.RegisterEvent();
panel1.Visible = true;

答案 2 :(得分:1)

您可以尝试处理ParentChanged事件或覆盖OnParentChanged事件提升者:

Control previousParent;
protected override void OnParentChanged(object sender, EventArgs e){
   if(Parent != previousParent){
     if(Parent != null) Parent.VisibleChanged += Parent_VisibleChanged;
     if(previousParent != null) previousParent.VisibleChanged -= Parent_VisibleChanged;
     previousParent = Parent;
   }       
}

请注意,使用上面的代码,您无需在Parent_VisibleChanged中注册InitializeComponent代码。