【问题标题】:HowTo write a recursive Custom Control in WinForms .NET如何在 WinForms .NET 中编写递归自定义控件
【发布时间】:2009-02-17 13:06:05
【问题描述】:

我正在尝试在 WinForms .NET(不是 ASP.NET)中编写“用户控件”。控制比较简单。它将包含一个标签、一个按钮和一个 DataGridView。

但是,控件需要能够实例化自身,即当用户单击(父控件的)按钮时,下方将显示至少 1 个相同类型的嵌套(子)控件(有点像树)

我没有成功使用“用户控件”编写这样的递归控件。在其自己的构造函数中实例化 MyControl 时会发生 StackOverflow 异常。

因此,我倾向于使用“自定义控件”,希望它能够处理自身的实例化(可能在 Paint 事件中??)。然而,更多的工作必须进入自定义控件,所以如果它要永远走下去,我不想走这条路。我的期限很紧。

有人使用自定义控件完成此操作,或者对如何创建递归控件有任何可靠的想法吗?

顺便说一句,这个控件将用于相当有限数量的递归组合,所以为每个父/子场景创建一个单独的控件会更好吗?我认为这将导致至少 10 个单独的用户控件。

感谢您的帮助

更新(这是我根据您的反馈初步尝试停止条件,但这仍然会导致无限期地创建孩子):

公共部分类 CustomX:UserControl { 私人 IList _children = new List(); 公共自定义X() { 初始化组件(); 递归(0); } 私人无效递归(int childCount) { 如果 (childCount

【问题讨论】:

  • 请给我们看一些代码或原理图。做你想做的应该不是问题。
  • 继续发布整个 CustomX 控件代码。让我们看看递归函数中有什么。我没有看到重载的构造函数,所以我试图弄清楚你是如何将有关递归状态的任何信息传递给子控件的。

标签: winforms user-controls controls recursion


【解决方案1】:

问题可能是子控件也实例化了子控件。必须有一个停止条件,否则将生成控件,直到堆栈溢出。

这应该可行:

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】:

    使用用户控件执行此操作应该没有问题。更可能是没有正确终止递归的问题。仅在最顶层的父控件中执行控件创建(而不是将该任务委托给每个构造函数)(可能)更具可读性。

    你能发布你在构造函数中的代码吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多