2012-07-11 82 views
0

我正在處理用於選擇特殊文件的UserControl,在此控件中有一個TreeView,當用戶選擇某個文件時,該節點將填充節點。用戶也可以從這個樹視圖中刪除文件!爲CustomControl創建事件

我在嚮導窗體中使用此控件。在此嚮導窗體中有一個名爲buttonNext的按鈕,默認情況下此按鈕處於禁用狀態。

如何在usercontrol中爲treeview創建一個事件,當它被填充時它會通知嚮導中的下一個按鈕以啓用該按鈕,並且如果用戶從該樹視圖中刪除所有文件,則會通知該按鈕再次被禁用。 PS:選擇文件(瀏覽器對話框和類似的東西)都在這個用戶控件中完成,所以在我的嚮導窗體中,我無法訪問此組件中正在進行的操作,但只有我設置了TreeView本身作爲公衆,所以我可以閱讀我的嚮導形式的節點。

我知道如何訂閱事件,但從來沒有建立任何情況下我自己:(

+1

[事件教程(HTTP:// msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx) – Ria 2012-07-11 09:27:50

回答

1

聲明對您的CustomControl事件:

public event EventHandler DataPopulated; 
public event EventHandler DataRemoved; 

常見的做法是創建受保護的虛擬方法(可能覆蓋這些子類),一個名爲On<EventName>這將驗證該事件是否附加了處理程序並引發事件,並傳遞了所需的參數:

protected virtual void OnDataPopulated() 
{ 
    if (DataPopulated != null) 
     DataPopulated(this, EventArgs.Empty); 
} 

注意:如果你需要一些數據傳遞給事件處理程序,然後使用通用EventHandler<DataPopulatedEventArgs>委託作爲事件類型,其中DataPopulatedEventArgs是A級,來自EventArgs繼承。

然後,只需調用這個方法填充數據剛過:

treeView.Nodes = GetNodes(); 
OnDataPopulated(); 

然後,只需訂閱這個事件,使你的下一個按鈕:

private void CustomControl_DataPopulated(object sender, EventArgs e) 
{ 
    buttonNext.Enabled = true; 
} 
1

誰是一個填充TreeView的呢?一個加載在其上的數據時,它已經完成了加載可以使下一步按鈕。 ?我失去了一些東西

順便說一句,您可以創建這樣一個事件:

public event EventHandler<EventArgs> YouEventName; 

你調用它的方法:

this.YourEventName(this,EventArgs.Emtpy); 

最佳實踐說,你應該創建一個方法調用它是這樣的:關於如何創建和火災事件的完整教程

protected virtual void OnYourEventName() 
{ 
    if (this.YourEventName != null) 
    { 
     this.YourEventName(this, EventArgs.Empty); 
    } 
} 
+0

填充樹視圖正在控制iteslf中完成。 – 2012-07-11 09:27:47

+0

你對你的設計是正確的。你應該把你的事件命名爲OperationDone。你需要通過你的事件的任何參數? – 2012-07-11 09:33:09

1

您可以傳播樹視圖的事件。

您可以將其添加到您的自定義控件,它將有一個SelectedNodeChanged事件。

public event EventHandler SelectedNodeChanged 
{ 
    add { tree.SelectedNodeChanged += value; } 
    remove { tree.SelectedNodeChanged-= value; } 
} 
0

創建一個新的事件

public event EventHandler<EventArgs> myEvent; 

然後,從某種方法

this.myEvent(sender, e); 

實際事件將看起來像這樣調用它:

protected void MyEvent(object sender, EventArgs e) 
{ 
    //Your code here 
} 
0

您的代碼可以是這樣的:

public delegate void ChangedEventHandler(object sender, EventArgs e); 

class TreeViewEx : TreeView 
{ 
    ... 

    public event ChangedEventHandler Changed; 

    protected virtual void OnChanged(EventArgs e) 
    { 
     if (Changed != null) 
      Changed(this, e); 
    } 
} 

,並使用

TreeViewEx tree = ... 
    tree.Changed += new EventHandler(TreeChanged); 


    // This will be called whenever the tree changes: 
    private void TreeChanged(object sender, EventArgs e) 
    { 
    Console.WriteLine("This is called when the event fires."); 
    }