解决了GridView控件和模板字段的问题。我已经定义GridView的是这样的:解决GridView控件和模板字段存在的问题ASP.NET GridView TemplateField控件在回传后丢失
<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 /折叠子项。
如果我什么都没有与网格,完美的作品,事件后回传。但是,因为有很多列,我有定制允许调整定义列和可见性顺序的gridView布局。如果我对GridView列执行了任何操作(重新排列列,或者只是删除列并将其插入到同一位置),则PostBack上的TemplateField按钮将丢失。即使我对TemplateField列定义没有做任何处理,但重新排序了BoundFields列,在PostBack之后,TemplateField列也会丢失。
它看起来有一些问题与ViewState(我不知道)。事实是,认为:
1.我让GridView的定制上Page_Init方法
2.我做数据绑定(因为一些原因)上Page_PreRender方法,只是如果不回发
我看见几个问题解决回发后问题与TemplateField项目,但我没有找到解决方案。
有enybody的想法,在哪里应该是问题?为什么它可以工作,什么时候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事件,主要目的是将数据绑定到网格: - ) 本次活动由呼叫父控件的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();
}
希望,这帮助。
谢谢布莱恩的回复。但是:我添加/删除Page_Init方法列,所以在我的GridView是数据绑定之前,它不好。所以我不明白,为什么它不应该工作...我设置gridView结构时绑定数据,稍后不修改。建议的第二种可能的解决方案是在我的眼中解决方案...我可以尝试,但我想了解,我做错了什么,以及如何正确地做到这一点。尽管如此,谢谢。 – 12moyo34
把你的代码放在后面,这样我就可以看到你在做什么“错误”。因为在GridView绑定数据之前应该查找是否添加/删除列。可能你正在删除错误的列索引? (列(i)) –
好的,我会在下一个答案中发布它。顺便说一句,解决方案的解决方案的作品,但无论如何,我想知道我做错了:-) – 12moyo34