Мне нужно создать веб-страницу с DetailsView, в которой есть куча текстовых полей и выпадающих списков, которые привязываются к объекту ObjectContainerDataSource. Это для односторонней привязки с использованием InsertItemTemplate.Динамически добавленные шаблоныFields в DetailsView не устанавливают связанное свойство
Я могу легко заставить это работать как для текстовых полей, так и для выпадающих списков с использованием статически определенных полей, однако моя конкретная ситуация требует добавления полей во время выполнения, так как веб-страница должна быть очень настраиваемой.
Для текстовых полей это легко с помощью класса BoundField, однако при попытке использовать TemplateField для раскрывающегося списка все это выглядит ужасно. Я пробовал много разных методов, включая написание собственного класса TemplateField, а также установку InsertItemTemplate непосредственно с помощью CompiledBindableTemplateBuilder. Но независимо от того, что я делаю, основная проблема заключается в том, что после нажатия кнопки вставки TemplateFields не привязывается к источнику данных объекта. Я считаю, что это потому, что InsertItemTemplate имеет значение null для обратной передачи (обратите внимание, что когда все поля объявлены в разметке, InsertItemTemplate не является нулевым). Если кто-то сделал именно то, что я пытаюсь сделать, ответьте, потому что я сейчас в конце своего троса с этим.
Я вернусь обратно к простому текстовому блоку внутри поля шаблона для подтверждения концепции, но это тоже не сработает. Я вставил то, что я сделал ниже. В этом случае я пытаюсь привязать вход TextBox к свойству под названием CustomerRef. Я думаю, что моя проблема может касаться того, как я устанавливаю свойство Text, но я не смог найти другого способа установить свойство Text в Bind (...) в коде позади.
Это, как я вставляю шаблонное поле:
var tf = new TemplateField();
tf.InsertItemTemplate = new CompiledBindableTemplateBuilder(delegate(Control container)
{
TextBox text = new TextBox();
text.ID = "MyTextBoxId";
text.Attributes.Add("Text", "<%# Bind(\"CustomerRef\") %>");
container.Controls.Add(text);
},
delegate(Control container)
{ // I've tried throwing an exception in here but it never gets executed
OrderedDictionary dict = new OrderedDictionary();
dict["CustomerRef"] = ((TextBox)container.Controls[0]).Text;
return dict;
});
И это, как я добавить поле в список DetailsView Fields:
ShipmentSearchView.Fields.Add(tf);
Я положил текст в текстовом поле и нажмите кнопка вставки ... затем в моем обработчике событий для события вставки я пытаюсь получить источник данных следующим образом:
var dataSource = e.Instance as MyClassName;
На этом этапе в среде отладки я замечаю, что в рассматриваемом поле больше нет InsertItemTemplate - оно равно null, а MyCustomerRef не задано.
Я попытался добавить поля в разных местах, в Page_Load() - как на каждом столбце, так и только при первой загрузке; в Page_Init(), а также в событии Init() в представлении деталей, но мне кажется, что это не так, как я это делаю. Заранее благодарим за помощь в решении этой проблемы.