У меня есть страница 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);
}
}
(Обратите внимание, что шаблон кэшируется, поэтому иерархия элементов управления создается только один раз.) |