Динамическое создание TemplateField'ов в GridView и проблемы при этом

_Vit_
Дата: 28.04.2007 11:11:57
Добрый день всем. Уже 3-ий день бьюсь над динамическим созданием ТемплейтФилдов в ГридВью.
Ситуация такая:
При первой загрузке страницы в событии Page_Load() я динамически создаю нужное мне количество ТемплейтФилдов (их количество зависит от количества параметров изделия). В этом примере пусть добавляется только 1 темплейтфилд. Создаю я их при помощи одного переделанного мною класса GridViewTemplate. Они нормально создаются и прекрасно выводятся на экран. Помимо этого динамического темпл.филда имеются ещё 4 темпл.филда, но созданных не динамически - а в дизайнере VS (1 - ссылка, 2 - шифр, 3 - название, 4 - ссылка). в ItemTempalte находится Label, в EditItemTempalte TextBox. В динамическом в ItemTempalte находится Label, в EditItemTempalte TextBox или DropDownList .Динамический темпл.филд вставляется между 3 и 4-ым. Первый раз всё работает:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ObjectDataSource1.Select();
DataTable dt = (DataTable)Cache["SpecifData" + Session.SessionID];
//foreach (DataColumn column in dt.Columns)
//{
DataColumn column = dt.Columns[0];

TemplateField tfield = new TemplateField();

GridViewTemplate Item = new GridViewTemplate(ListItemType.Item);
GridViewTemplate EditItem = new GridViewTemplate(ListItemType.EditItem);

Label lbl = new Label();
lbl.ID = "lblValue";
lbl.Visible = true;
Item.AddControl(lbl);

DropDownList ddl = new DropDownList();
ddl.ID = "ddlGlossaries";
ListItem li = new ListItem("Look", "0");
ddl.Items.Add(li);
ddl.SelectedIndex = 0;
EditItem.AddControl(ddl);

tfield.ItemTemplate = Item;
tfield.EditItemTemplate = EditItem;

gvInfo.Columns.Insert(3, tfield);
//}
Cache.Insert("GvColumns" + Session.SessionID, gvInfo.Columns, null, DateTime.MaxValue, TimeSpan.FromMinutes(10), System.Web.Caching.CacheItemPriority.NotRemovable, null);
gvInfo.DataSource = dt.DefaultView;
gvInfo.DataBind();
}
}

На форме существует ещё кнопка "Редактировать". Когда я её нажимаю, в статических (4-ёх) темпл.филдах пропадают все контролы, а ещё точнее cсылки на EditItemTemplate, ItemTemplate становятся null:

protected void Button1_Click(object sender, EventArgs e)
{
if (Cache["SpecifData" + Session.SessionID] != null)
{
DataTable dt = (DataTable)Cache["SpecifData" + Session.SessionID];

if (Cache["GvColumns" + Session.SessionID] != null)
{
DataControlFieldCollection GvColumns = (DataControlFieldCollection)Cache["GvColumns" + Session.SessionID];
for (int i = gvInfo.Columns.Count - 1; i > 3; i--)
gvInfo.Columns.RemoveAt(gvInfo.Columns.Count - 2);

for (int i = 3; i < GvColumns.Count - 1; i++)
gvInfo.Columns.Insert(i, GvColumns[i]);

gvInfo.DataSource = dt.DefaultView;
gvInfo.DataBind();
}
}
}
Я не могу понять почему, ведь в коллекции DataControlFieldCollection GvColumns, которую я вытягиваю из кеша все эти ссылки не null, но когда темплейты добавляются к ГридВью, то ссылки теряются.
Я перепробывал много вариантов - каждый раз пересоздавал темпл.филды в событии Page_Init(), помещал в кеш не gvInfo.Columns, а другую коллекцию DataControlFieldCollection с нужными мне темплейтами и т.д.
Если у кого-то есть хоть какая-то информация буду очень признателен.
pecha
Дата: 29.04.2007 12:40:51
Возможно тут ты найдешь ответ на свой вопрос.

Using TemplateFields in the GridView Control

ну и советую посмотреть другие статьи там тоже.

GoDevs.com - Cheap Domain Names, Free/Cheap ASP.NET AJAX Web Hosting, 24x7 support and much more.
_Vit_
Дата: 10.05.2007 11:55:26
Спасибо за ответ, но дело в том, что там расказывается не про создание динамических темплейтфилдов, а про темплейтфилды вообще. А у меня проблема именно с динамическим созданием.
alex87654321
Дата: 04.12.2007 21:05:15
Удалось ли побороть проблему?
Aib
Дата: 05.12.2007 00:55:49
Для создания темплейтов динамически именно для грида хорошо подходит класс CompiledBindableTemplateBuilder, хотя и написано, что он для инфраструктуры.
Проблема может быть зарыта много где. Но, по-хорошему, это изврат - забивать темплейты программно. Только если у Вас custom control и у него есть свои темплейты, которые Вы хотите инстанциировать в уже существующие. Но тогда и подход другой должен быть. А в приведенном примере я бы просто подписался на события RowCreated и RowDataBound и добавлял бы все в обработчиках.
----------------------------------------------------------------------
Any fool can write code that a computer can understand. Good programmers write code that humans can understand. © Martin Fowler.
_Vit_
Дата: 05.12.2007 16:39:29
Этот пост я давно писал. Проблему удалось побороть. Сделал где-то так как посоветовал Aib, но всё же темплейты создавал динамически, поскольку колонок у GridView могло быть разное количество.
AHTOH_L
Дата: 25.02.2011 14:01:30
Здравствуйте.
У меня такая же проблема.
Можно поподробнее про это написать?
Спасибо.
Zoria
Дата: 25.02.2011 14:04:41
AHTOH_L,

какая "такая же"?
AHTOH_L
Дата: 25.02.2011 15:45:21
Пропадает динамический TemplateField в GridView.
Zoria
Дата: 25.02.2011 15:46:50
AHTOH_L,

а вы его при постбэке добавляете заново?