Сведения о вопросе

Mathprofi

19:39, 14th August, 2020

Теги

.net   asp.net    

Лучшая практика для динамически добавляемых классов Web.UI.ITemplate

Просмотров: 433   Ответов: 2

У нас есть несколько шаблонов столбцов ASP.Net dataview, которые динамически добавляются в dataview в зависимости от Столбцов, выбранных пользователями.

Эти шаблонные ячейки должны обрабатывать пользовательские привязки данных:

public class CustomColumnTemplate: 
    ITemplate
{
    public void InstantiateIn( Control container )
    {
        //create a new label
        Label contentLabel = new Label();

        //add a custom data binding
        contentLabel.DataBinding +=
            ( sender, e ) =>
            {
                //do custom stuff at databind time
                contentLabel.Text = //bound content
            };

        //add the label to the cell
        container.Controls.Add( contentLabel );
    }
}

...

myGridView.Columns.Add( new TemplateField
    {
       ItemTemplate = new CustomColumnTemplate(),
       HeaderText = "Custom column"
    } );

Во-первых, это кажется довольно грязным, но есть также проблема ресурсов. Label генерируется и не может быть удален в InstantiateIn , потому что тогда он не будет там для привязки данных.

Есть ли лучший шаблон для этих элементов управления?

Есть ли способ убедиться, что метка удалена после привязки данных и визуализации?



  Сведения об ответе

P_S_S

19:17, 7th August, 2020

Я много работал с шаблонным контролем и не нашел лучшего решения.

Почему вы ссылаетесь на contentLable в обработчике событий?

Отправитель-это метка, которую вы можете бросить на метку и иметь ссылку на метку. Как и ниже.

        //add a custom data binding
        contentLabel.DataBinding +=
            (object sender, EventArgs e ) =>
            {
                //do custom stuff at databind time
                ((Label)sender).Text = //bound content
            };

Тогда вы сможете избавиться от ссылки на метку в InstantiateIn.

Пожалуйста, обратите внимание, что я не проверял это.


  Сведения об ответе

ASER

13:26, 21st August, 2020

Одно из решений состоит в том , чтобы сделать ваш шаблон сам реализовать IDisposable, а затем утилизировать элементы управления в методе Dispose вашего шаблона. Конечно, это означает, что вам нужна какая-то коллекция, чтобы отслеживать созданные элементы управления. Вот один из способов сделать это:

public class CustomColumnTemplate :
    ITemplate, IDisposable
{
    private readonly ICollection<Control> labels = new List<Control>();

    public void Dispose()
    {
        foreach (Control label in this.labels)
            label.Dispose();
    }

    public void InstantiateIn(Control container)
    {
        //create a new label
        Label contentLabel = new Label();

        this.labels.Add(contentLabel);
...

        //add the label to the cell
        container.Controls.Add( contentLabel );
    }
}

Теперь вы все еще сталкиваетесь с проблемой утилизации шаблона. Но, по крайней мере, ваш шаблон будет ответственным потребителем памяти, потому что при вызове Dispose в шаблоне все его метки будут удалены вместе с ним.

UPDATE

Эта ссылка на MSDN предполагает, что, возможно, для вашего шаблона нет необходимости реализовывать IDisposable , потому что элементы управления будут укоренены в дереве элементов управления страницы и автоматически удаляются платформой!


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться