Мне нужно создать веб-страницу с DetailsView, которая имеет несколько текстовых полей и раскрывающихся списков, которые связаны с ObjectContainerDataSource. Это для односторонней привязки с использованием InsertItemTemplate.
Я легко могу заставить это работать как для текстовых полей, так и для раскрывающихся списков, используя статически определенные поля, однако моя конкретная ситуация требует, чтобы поля добавлялись во время выполнения, поскольку веб-страница должна быть легко настраиваемой.
Для текстовых полей это легко с помощью класса BoundField, однако все идет ужасно неправильно, когда я пытаюсь использовать TemplateField для выпадающего списка. Я пробовал много разных методов, включая написание своего собственного класса TemplateField, а также настройку InsertItemTemplate напрямую с помощью CompiledBindableTemplateBuilder. Но независимо от того, что я делаю, основная проблема заключается в том, что после нажатия кнопки вставки TemplateFields не привязывается к источнику данных объекта. Я считаю, что это потому, что InsertItemTemplate является нулевым при обратной передаче (обратите внимание, что, когда все поля объявлены в разметке, InsertItemTemplate не является нулевым). Если кто-то сделал именно то, что я пытаюсь сделать, пожалуйста, ответьте, потому что я сейчас нахожусь в конце моей привязи с этим.
Я вернулся к простому TextBox внутри поля шаблона для подтверждения концепции, но он также не будет работать. Я вставил то, что сделал ниже. В этом случае я пытаюсь привязать ввод 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:
ShipmentSearchView.Fields.Add(tf);
Я помещаю некоторый текст в текстовое поле и нажимаю кнопку вставки ... затем в моем обработчике событий для события вставки я пытаюсь получить источник данных, подобный этому:
var dataSource = e.Instance as MyClassName;
На данный момент в среде отладки я заметил, что у рассматриваемого поля больше нет InsertItemTemplate - оно пустое, а MyCustomerRef не установлен.
Я попытался добавить поля в разных местах, в Page_Load () - как в каждом посте назад, так и только при первой загрузке; в Page_Init (), а также в событии Init () представления сведений, но, кажется, никогда не имеет значения, как я это делаю. Заранее благодарим за любую помощь в этом вопросе.