Лучшие практики для динамически добавляемых классов Web.UI.ITemplate - PullRequest
4 голосов
/ 27 августа 2008

У нас есть несколько шаблонов столбцов 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, потому что тогда его не будет для привязки к данным.

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

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

Ответы [ 2 ]

2 голосов
/ 27 августа 2008

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

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

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

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

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

Обратите внимание, я не проверял это.

1 голос
/ 28 декабря 2012

Одним из решений является создание самого шаблона реализации 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, потому что элементы управления будут внедрены в дереве элементов управления страницы и автоматически удалены платформой!

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