2009-02-17 57 views
0

我正在嘗試在WinForms .NET(不是ASP.NET)中編寫「用戶控件」。控制相對簡單。它將包含一個標籤,一個按鈕和一個DataGridView。如何在WinForms .NET中編寫遞歸自定義控件

但是,控件需要能夠實例化自己,也就是說,當用戶單擊(父控件的)按鈕時,相同類型的至少1個嵌套(子)控件將顯示在下面(類似於樹)

我沒有成功使用'用戶控件'編寫這樣的遞歸控件。在它自己的構造函數中實例化MyControl時發生StackOverflow異常。因此,我傾向於使用'自定義控件',希望它可以處理它自己的實例化(也許在Paint事件??中)。然而,更多的工作必須進入自定義控制,所以如果它要持續下去,我不想走這條路。我正處於緊急的最後期限之中。

任何人使用自定義控件完成此操作或對如何創建遞歸控件有任何堅實的想法?

順便說一句,這個控件將用於相當有限數量的遞歸組合,所以也許最好爲每個父/子場景創建一個單獨的控件?我想這會導致至少10個單獨的用戶控件。

感謝您的幫助

UPDATE(這裏是我按照您的反饋停止條件的初步嘗試,但是這仍然是造成兒童被無限期地創建):

 

public partial class CustomX : UserControl 
    { 
     private IList _children = new List(); 

     public CustomX() 
     { 
      InitializeComponent(); 

      Recurse(0); 

     } 

     private void Recurse(int childCount) 
     { 
      if (childCount 
+0

請給我們看一些代碼或原理圖。做你想做的事情應該不成問題。 – Stefan 2009-02-17 13:16:42

回答

2

問題可能是子控件也實例化了一個子控件。必須有一個停止條件或控件將生成,直到堆棧溢出。

這應該工作:

public partial class CustomX : UserControl 
    { 
     private IList _children = new List(); 

     public CustomX(int depth) 
     { 
      InitializeComponent(); 
      if(depth > 0) 
      { 
       CustomX child = new CustomX(depth-1); 
       this.Controls.Add(child) 
      } 
     } 
    } 
2

你應該沒有問題,用戶控件這樣做。這更可能是沒有正確終止遞歸的問題。它可能更易於在最頂層的父控件中執行控件創建,而不是將該任務委託給每個構造器。

你可以發佈你的構造函數中的代碼嗎?

相關問題