_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 с нужными мне темплейтами и т.д.
Если у кого-то есть хоть какая-то информация буду очень признателен.
_Vit_
Дата: 10.05.2007 11:55:26
Спасибо за ответ, но дело в том, что там расказывается не про создание динамических темплейтфилдов, а про темплейтфилды вообще. А у меня проблема именно с динамическим созданием.
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 могло быть разное количество.