Как «клонировать» WebControls в C# .NET?

Мой основной вопрос в .NET: как клонировать WebControls?

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

Но первое препятствие, которое у меня есть, - это возможность дублировать / клонировать содержимое элемента управления.

Рассмотрим этот довольно надуманный пример;

<custom:duplicate count = "2">
    <div>
        <p>Some html</p>
        <asp:TextBox id = "tb1" runat = "server" />
    </div>
</custom:duplicate>

Разметка HTML, которая выводится, будет выглядеть примерно так:

<div>
    <p>Some html</p>
    <input type = "text" id = "tb1" />
</div>
<div>
    <p>Some html</p>
    <input type = "text" id = "tb1" />
</div>

Примечание: я знаю, что у меня дублирован идентификатор, я могу придумать решение этого позже!

Итак, у нас будет мой настраиваемый элемент управления с 3 дочерними элементами (я думаю) - буквальный элемент управления, элемент управления TextBox и еще один буквальный элемент управления.

В этом примере я сказал «count = 2», поэтому элемент управления должен дважды выводить / визуализировать своих дочерних элементов.

Я бы хотел написать код "OnInit", который делает что-то вроде:

List<WebControl> clones;
for(int i=1; i<count; i++)
{
    foreach(WebControl c in Controls) 
    {
        WebControl clone = c.Clone();
        clones.Add(clone);
    }
}

Controls.AddRange(clones);

Однако, насколько я могу судить, WebControls не реализуют ICloneable, поэтому клонировать их таким образом невозможно.

Есть идеи, как я могу клонировать WebControls?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
7 207
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В ASP.NET это можно сделать с помощью шаблонов. Для этого в MSDN есть образцы, просто поищите шаблонные элементы управления / ITemplate.

Ответ принят как подходящий

Что не так с использованием повторителя и привязкой источника данных с ошибкой. Он будет дублировать шаблонные элементы управления и обрабатывать создание идентификатора и все такое.

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

public class MyCustomServerCtrl
{

   ...

   public MyCustomServerCtrl Clone()
   {
      return MemberwiseClone() as MyCustomServerCtrl;
   }

}

Но обратите внимание: это требуется очень редко, и если да, то, скорее всего, именно тогда, когда у вас есть какая-то действительно конкретная логика. По возможности этого следует избегать. Обычно достаточно использовать существующие элементы управления, такие как Repeater, ListView и т. д.

Я действительно использовал его, поэтому я рад, что вы опубликовали это в целях документации. Всего 7 лет понадобилось, чтобы кто-то нашел его! :)

Radderz 24.01.2017 18:13

Метод WebControl.CopyBaseAttributes копирует свойства AccessKey, Enabled, ToolTip, TabIndex и Attributes из указанного серверного веб-элемента управления в серверный веб-элемент управления, из которого вызывается этот метод.

Документация MSDN

Другие вопросы по теме