Зачем мне создавать дочерние элементы управления в CreateChildControls () на CompositeControl? - PullRequest
2 голосов
/ 10 октября 2008

Хорошо, поэтому очевидный ответ таков: поток составного элемента управления требует, чтобы мои дочерние элементы управления были созданы в определенный момент времени. У меня проблема, я думаю, что другие люди тоже должны были.

Мой элемент управления - это составной элемент управления "контейнер / сбор". Он будет снабжен объектом и на основе данных этих объектов создаст несколько дочерних элементов управления. Таким образом, мой элемент управления будет отображать заголовок (всегда) и x-число, скажем, элементов управления TextBox (в зависимости от объекта, которым он был передан).

Я, очевидно, создаю свой заголовок в CreateChildControls (), но я не могу также создать там свои TextBoxes, потому что я не знаю, был ли еще подан объект (на котором основаны TextBoxes)? Я думал об открытии свойства / метода для установки / подачи объекта, но я не уверен, когда он будет вызван.

Так что мне делать? Я имею в виду, я не могу создать TextBoxes в CreateChildControls () или я могу? Я имею в виду - когда вызывается CreateChildControls () - я знаю, что могу вызвать EnsureChildControls () (что я уже делаю в свойстве, чтобы установить innerText заголовка - так как мне нужно создать заголовок перед установкой его innerText, очевидно).

Как насчет этого

var c = new MyContainerControl();
c.Header = "fun";
c.TextBoxObject = myTextBoxes;

Это вызвало бы ошибку (или, в лучшем случае, не создавало бы TextBox'ов), если бы я поместил создание TextBoxes в CreateChildControls ().

Было бы более разумно вместо этого просто сохранять заголовок в переменной-члене и, следовательно, не вызывать EnsureChildControls () в предоставляемом методе / свойстве, устанавливающем Header innerText. Мне просто не очень нравится этот подход, так как он усложнит ситуацию, добавив дополнительную логику для временного хранения, а затем придется выяснять, когда его устанавливать (возможно, в PreRender).

Также, я думаю, я мог бы создать какой-то элемент управления с привязкой к данным, обеспечивающий присутствие данных во время вызова .DataBind (). Мне это тоже не нравится, так как в прошлый раз, когда я смотрел на создание элементов управления с привязкой к данным, это было очень сложно.

Это действительно должно быть легко решаемой задачей - я знаю, что что-то упустил где-то ...

1 Ответ

1 голос
/ 10 октября 2008

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

Тем не менее, вы рассматривали возможность использования управления повторителем, а не пытаться развернуть свой собственный композит, который ведет себя точно так же? Вместо того, чтобы передавать ему случайный объект, передайте ему коллекцию или iList с количеством нужных текстовых областей.

...