Не удается изменить режимы с помощью динамических шаблонов FormView - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть страница ASP.NET с привязкой данных FormView к ObjectDataSource, которая использует динамически генерируемые шаблоны для визуализации пользовательского интерфейса на основе информации макета из базы данных приложения. Я смог заставить шаблоны отображаться правильно, и все выглядит нормально, пока я не нажму одну из кнопок, чтобы изменить режимы - ничего не изменится.

Мой код основан на пояснениях, представленных в следующих статьях / сообщениях:

http://www.codeproject.com/KB/aspnet/DynamicFormview.aspx

http://msdn.microsoft.com/en-us/library/ms227423.aspx

http://msdn.microsoft.com/en-us/library/y0h809ak(vs.71).aspx

http://forums.asp.net/p/1379371/2911424.aspx#2911424?Data+Binding+with+Dynamically+Created+controls+not+working+both+ways

В двух словах, в методе Page.OnInit я назначаю экземпляр моих шаблонов свойствам FormView EditItemTemplate, EmptyDataTemplate, InsertItemTemplate и ItemTemplate (другой экземпляр для каждого свойства с соответствующими элементами управления, макетом и т. Д. Для этого шаблона) , Я вижу, что вызывается метод InstantiateIn шаблона, соответствующего режиму по умолчанию, иерархия элементов управления создается правильно, а пользовательский интерфейс отображается в соответствии с ожиданиями.

У меня есть набор кнопок управления в каждом из моих шаблонов, которые включают переключатели режима. Так, например, в ItemTemplate у меня есть кнопка с CommandName = "New". Я ожидаю, что нажатие этой кнопки приведет к переходу FormView в режим вставки. Вместо этого я получаю обратную передачу, и InstantiateIn вызывается на моем ItemTemplate. Обработчики, которые я прикрепил к событиям ModeChanging и ModeChanged в FormView, не запускаются.

Когда я прохожу иерархию элементов управления, я вижу ту же объектную модель, что и страница, которую я создал в разметке - за одним исключением. Я использую элементы управления HtmlTable, HtmlTableRow и HtmlTableCell для построения макета, тогда как в разметке используются элементы

.

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

Вот код, использованный для генерации шаблона:

public class FormViewTemplate : INamingContainer, ITemplate
{
    private Boolean _childControlsCreated;
    private Panel _panel;

    public FormViewTemplate(TemplateMode mode) { Mode = mode; }

    public TemplateMode Mode { get; private set; }

    private void CreateChildControls()
    {
        _panel = new Panel();

        _panel.Controls.Add(CreateButtons());

        switch (Mode)
        {
            case TemplateMode.Edit:
                _panel.Controls.Add(new LiteralControl("Edit Mode"));
                break;
            case TemplateMode.Empty:
                _panel.Controls.Add(new LiteralControl("Empty Mode"));
                break;
            case TemplateMode.Insert:
                _panel.Controls.Add(new LiteralControl("Insert Mode"));
                break;
            case TemplateMode.ReadOnly:
                _panel.Controls.Add(new LiteralControl("Read-Only Mode"));
                break;
        }
    }

    private Panel CreateButtons()
    {
        var panel = new Panel();

        var table = new HtmlTable()
        {
            Border = 0,
            CellPadding = 2,
            CellSpacing = 0
        };

        panel.Controls.Add(table);

        var tr = new HtmlTableRow();

        table.Rows.Add(tr);

        var td = new HtmlTableCell();

        tr.Cells.Add(td);

        var addButton = new ASPxButton()
        {
            CommandName = "New",
            Enabled = (Mode == TemplateMode.ReadOnly),
            ID = "AddButton",
            Text = "Add"
        };

        td.Controls.Add(addButton);
        return panel;
    }

    private void EnsureChildControls()
    {
        if (!_childControlsCreated)
        {
            CreateChildControls();

            _childControlsCreated = true;
        }
    }

    void ITemplate.InstantiateIn(Control container)
    {
        EnsureChildControls();

        container.Controls.Add(_panel);
    }
}

(Обратите внимание, что шаблон кэшируется, поэтому иерархия элементов управления создается только один раз.)

...