Динамически добавленные TemplateFields в DetailsView не устанавливают связанное свойство - PullRequest
1 голос
/ 02 февраля 2012

Мне нужно создать веб-страницу с 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 () представления сведений, но, кажется, никогда не имеет значения, как я это делаю. Заранее благодарим за любую помощь в этом вопросе.

1 Ответ

0 голосов
/ 10 февраля 2012

Я закончил тем, что написал свой собственный пользовательский элемент управления, чтобы добиться этого - это действительно не так сложно сделать. Если кто-то заинтересован в моем решении, я буду рад опубликовать его здесь. Но, учитывая отсутствие комментариев к моему исходному сообщению, я предполагаю, что то, что я делаю на своей веб-странице, - это не то, что пытаются сделать многие люди!

...