Как написать рекурсивный пользовательский элемент управления в WinForms .NET - PullRequest
0 голосов
/ 17 февраля 2009

Я пытаюсь написать пользовательский элемент управления в WinForms .NET (не ASP.NET). Управление относительно простое. Он будет содержать метку, кнопку и DataGridView.

Тем не менее, элемент управления должен иметь возможность создавать саму себя, т. Е. Когда пользователь нажимает кнопку (родительского элемента управления), под ним отображается как минимум 1 вложенный (дочерний) элемент управления того же типа (вроде дерева )

У меня нет успеха при написании такого рекурсивного элемента управления с использованием «Пользовательского элемента управления». Исключение StackOverflow возникает при создании экземпляра MyControl в его собственном конструкторе.

Поэтому я склоняюсь к использованию «Пользовательского элемента управления», надеясь, что он сможет справиться с созданием самого себя (возможно, в событии Paint ??). Однако для создания пользовательского элемента управления требуется больше работы, поэтому я не хочу идти по этому пути, если он будет длиться вечно. Я в сжатые сроки.

Кто-нибудь делал это с помощью пользовательского элемента управления или у вас есть твердые идеи о том, как создать рекурсивный элемент управления?

Кстати, этот элемент управления будет использоваться в довольно конечном числе рекурсивных комбинаций, поэтому, возможно, было бы лучше создать отдельный элемент управления для каждого сценария родитель / потомок? Я думаю, что это приведет к по крайней мере 10 отдельных пользовательских элементов управления.

спасибо за вашу помощь

ОБНОВЛЕНИЕ (вот моя первоначальная попытка остановить состояние по вашему отзыву, но это все еще приводит к тому, что дети создаются бесконечно):


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

        public CustomX()
        {
            InitializeComponent();

            Recurse(0);

        }

        private void Recurse(int childCount)
        {
            if (childCount 

Ответы [ 2 ]

2 голосов
/ 17 февраля 2009

У вас не должно возникнуть никаких проблем с пользовательским элементом управления. Это, скорее всего, проблема с неправильным завершением рекурсии. (Возможно) было бы более читабельно выполнять создание элемента управления только в самом верхнем родительском элементе управления, а не делегировать эту задачу каждому конструктору.

Можете ли вы разместить свой код в конструкторе?

2 голосов
/ 17 февраля 2009

Проблема, вероятно, в том, что дочерний элемент управления также создает экземпляр дочернего элемента управления. Должно быть условие остановки, иначе элементы управления будут генерироваться до тех пор, пока стек не переполнится.

Это должно работать:

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)
            }
        }
    }
...