Динамически добавленные поля TemplateField в DetailsView не устанавливают привязанное свойство

Мне нужно создать веб-страницу с DetailsView, которая имеет кучу текстовых полей и раскрывающихся списков, которые привязываются к ObjectContainerDataSource. Это для односторонней привязки с использованием InsertItemTemplate.

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

Для текстовых полей это легко сделать с помощью класса BoundField, однако все идет ужасно неправильно, когда я пытаюсь использовать TemplateField для раскрывающегося списка. Я пробовал много разных методов, в том числе написал свой собственный класс TemplateField, а также установил InsertItemTemplate напрямую с помощью CompiledBindableTemplateBuilder. Но независимо от того, что я делаю, основная проблема заключается в том, что после нажатия кнопки вставки поля TemplateFields не привязываются к источнику данных объекта. Я считаю, что это связано с тем, что InsertItemTemplate имеет значение NULL при обратной передаче (обратите внимание, что когда все поля объявлены в разметке, InsertItemTemplate не имеет значения NULL). Если кто-то сделал именно то, что я пытаюсь сделать, пожалуйста, ответьте, потому что теперь я нахожусь в конце моей привязки к этому.

Я вернулся к простому текстовому окну внутри поля шаблона для подтверждения концепции, но это тоже не сработает. Я вставил то, что сделал, ниже. В этом случае я пытаюсь привязать ввод 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 - он имеет значение null, а MyCustomerRef не установлен.

Я пробовал добавлять поля в разных местах, в Page_Load () - как при каждой обратной публикации, так и только при первой загрузке; в Page_Init (), а также в событии Init () представления Details, но, кажется, никогда не имеет значения, как я это делаю. Заранее благодарим за помощь в решении этой проблемы.


person CoderJones    schedule 02.02.2012    source источник


Ответы (1)


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

person CoderJones    schedule 10.02.2012