решение проблемы с полем управления и шаблона GridView. Я определил GridView как это:ASP.NET GridView TemplateField элементы управления потеряли после PostBack
<asp:GridView ID="gridView" runat="server" ShowFooter="True" onrowdatabound="onRowDataBound" AutoGenerateColumns="False" onrowcreated="onRowCreated" onrowcommand="onRowCommand" onselectedindexchanged="onSelectedIndexChanged">
<Columns>
<asp:CommandField SelectText="cmdSelectRow" ShowSelectButton="True" />
<asp:TemplateField AccessibleHeaderText="treeController" HeaderText="">
<ItemTemplate>
<asp:ImageButton ID="btnShow" runat="server" ImageUrl="~\\Images\\treePlus.png" CommandName="TreeShow" UseSubmitBehavior="False"/>
<asp:ImageButton ID="btnHide" runat="server" Visible="False" ImageUrl="~\\Images\\treeMinus.png" CommandName="TreeHide" UseSubmitBehavior="False" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="treeLevel" HeaderText="Tree Level" />
<asp:BoundField DataField="parentTaskId" HeaderText="parent_task_id" />
<asp:BoundField DataField="taskId" HeaderText="task_id" />
<asp:BoundField DataField="groupId" HeaderText="group_id" />
<asp:BoundField DataField="hasTiming" HeaderText="" />
... much more BoundFiels ...</Columns>
Я полагаю, вы поняли, что с помощью этого GridView я реализую в TreeView ... эти два ImageButtons кнопки для expland/Collapse дочерние элементы.
Если я НЕ НИЧЕГО с сеткой, отлично работает, событие после PostBacks. Но, поскольку есть много столбцов, у меня есть настройка, позволяющая настроить макет gridView, определяющий порядок столбцов и видимость. Если я что-то делаю с столбцами GridView (переупорядочить столбцы или просто удалить столбец и вставить его в ту же позицию), кнопки TemplateField теряются на PostBack. Даже если я ничего не делаю с определением столбца TemplateField, но переупорядочивая столбцы BoundFields, столбцы TemplateField теряются после PostBack.
Похоже, что есть проблема с ViewState (я не знаю). Дело в том, что:
1. Я делаю GridView настройку по методу Page_Init
2. я Связывание данных (из-за некоторых причин) по методу Page_PreRender, только если НЕ Postback
Я видел несколько вопросов Решая проблемы с элементами TemplateField после обратной передачи, но я не нашел решение.
Имеет ли идея, где должна быть проблема? Почему это работает, когда ничего не сделано с структурой gridview (столбцы) и НЕ РАБОТАЕТ, когда один и тот же столбец вынут и снова вставлен в столбцы сетки?
Благодарим за помощь или идеи.
Чтобы продемонстрировать «поток» страницы, я добавляю более подробную информацию ...
GridView является частью моего пользовательского контроля.
protected void Page_Init (object sender, EventArgs e)
{
/* customize grid control */
/* here I load the customization defined by user and change GridView.Columns */
layoutCustomize(gridControl, accountId);
}
Как показано, я изменяю структуру GridView (при первой загрузке страницы или постбэков)
protected override void OnDataBinding(EventArgs e)
{
/* declarations */
DbModel.TaskView [] tasks = null;
DataTable tasksTable = null;
/* call parent method */
base.OnDataBinding(e);
/* get data */
if ((tasks = TasksView.Data) != null)
{
/* build data table */
tasksTable = TsGridView.BuildDataTable(TasksTreeView, tasks, typeof(TaskView));
/* apply filter */
DataTable viewTable = Filter(tasksTable);
/* bound the data source to the gird */
TasksTreeView.DataSource = viewTable;
TasksTreeView.DataBind();
}
}
Это DataBind событие пользовательского элемента управления, основной целью которого является для привязки данных к сетке: -) событие инициируется вызовом DataBind в методе Page_PreRender родительского элемента управления, например:
protected void Page_PreRender(object sender, System.EventArgs e)
{
/* set active view */
if (IsPostBack == false)
SetView(tasksMultiView.ActiveViewIndex);
}
protected void SetView (int viewIndex)
{
/* declarations */
Control viewControl = null;
View selectedView = null;
ListItem selectedItem = null;
/* get control */
selectedView = tasksMultiView.Views[viewIndex];
selectedItem = View.Items[viewIndex];
/* get control */
if ((viewControl = selectedView.FindControl(selectedItem.Value)) != null)
/* bind data */
viewControl.DataBind();
}
Hopes это помощь.
Благодарим Брайана за ваш ответ. Но: я добавляю/удаляю столбцы в методе Page_Init, поэтому до того, как мой GridView будет привязан к базе данных, и это не нормально. Поэтому я не понимаю, почему это не должно работать ... Я привязываю данные, когда структура gridView установлена и не изменена позже. Предлагаемое второе возможное решение в моем решении для решения проблемы ... Я могу попробовать это, но я хотел бы понять, что я делаю неправильно и как это делать должным образом. Тем не менее, спасибо. – 12moyo34
Хорошо опубликуйте свой код, чтобы я мог видеть, что вы делаете «неправильно». Потому что вещи должны быть найдены, если столбцы добавляются/удаляются до того, как GridView привязан к данным. Возможно, вы удаляете неверный индекс столбца? (Столбец (i)) –
Хорошо, я отправлю его в следующем ответе. BTW, решение обходного решения работает, но в любом случае, я хочу знать, что я делаю неправильно :-) – 12moyo34