2009-02-17 39 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

你应该没有问题,用户控件这样做。这更可能是没有正确终止递归的问题。它可能更易于在最顶层的父控件中执行控件创建,而不是将该任务委托给每个构造器。

你可以发布你的构造函数中的代码吗?

相关问题