GridView コントロールとテンプレート フィールドの問題を解決します。次のように GridView を定義しました。
<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 を実装することを理解したと思います...これらの 2 つの ImageButtons は、子アイテムを展開/折りたたむためのボタンです。
グリッドで何もしないと、PostBacks の後のイベントで完璧に動作します。ただし、列が多いため、列の順序と可視性を定義する gridView レイアウトを調整できるカスタマイズがあります。GridView 列で何かを行うと (列の順序を変更するか、列を削除して同じ位置に挿入するだけです)、PostBack で TemplateField ボタンが失われます。TemplateField 列の定義で何もせず、BoundFields 列を並べ替えても、PostBack 後に TemplateField 列が失われます。
ViewState に問題があるようです (わかりません)。
1. Page_Init メソッドで GridView のカスタマイズを行います 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 イベントです。主な目的はデータをグリッドにバインドすることです :-) このイベントは、親コントロールの Page_PreRender メソッドで DataBind を呼び出すことによってトリガーされます。
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();
}
この助けを願っています。