2013-11-28 64 views
0

我創建了一個C#usercontrol。處理父母VisibleChanged事件c#

該用戶控件在面板託管像這樣:

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

我想在我的用戶添加一個事件處理程序來處理的面板VisibleChanged事件。

我已經試過這裏面編譯正確:

private void InitializeComponent() 
    { 

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

但是當我運行我的程序this.Parent爲null,因爲它沒有被添加到父面板尚未我猜

如何我可以這樣做嗎?

+0

出於興趣,當VisibleChanged事件觸發時,您計劃做什麼?可能有更好的方法來解決你的要求 – musefan

回答

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

利用你有什麼到目前爲止,你可以在你的用戶創建一個「註冊事件」功能後,控制...

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

你可以調用它後,它已被添加到父:

UserControlQuestion1 question1 = new UserControlQuestion1(); 
panel1.Controls.Add(question1); 
question1.RegisterEvent(); 
panel1.Visible = true; 
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; 
    }  
} 

注意,上面的代碼中,你不需要的代碼在InitializeComponent註冊Parent_VisibleChanged

+0

這就是我所做的。爲什麼'InitializeComponent'的'parent == null'是你的控件的創建沒有完成,所以它還沒有添加到父控件的''Controls'集合中。 – edokan

+0

@edokan我的代碼並不關心'InitializeComponent',它只是監聽ParentChanged',如果它改變了並且它不是null,那麼我們可以用它做一些事情。 –

+0

是的,你是對的。我的評論是針對問題所有者的。 – edokan