0


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();
    }

この助けを願っています。

4

3 に答える 3

3

GridView の構造を変更したため、Viewstate はポストバックで「失われます」。TemplateField ボタンはまだありますが... OnInit の後、GridView がデータバインドされる前に列を追加/削除すると、この問題は発生しません。ビューステートを更新するために列を削除した後、データを GridView に再バインドする必要がありますが、あなたの問題については考えています。

または、この可能な解決策も見つけました。myGridView.Columns.Clear(); を呼び出しているようです。列を追加/削除する前に、うまくいくかもしれません。

http://forums.asp.net/p/1229438/2216336.aspx#2216336

于 2013-10-13T00:07:05.330 に答える
1

.aspx ページで EnableViewState を false に設定します。私はこの問題を抱えていましたが、これで問題が解決しました。

于 2015-10-07T18:41:17.210 に答える