2012-02-02 3 views
1

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

ответ

0

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