GridView に列を動的に追加する際に問題が発生しています。DropDownList の値に基づいて、レイアウト (つまり、含まれる列) を変更する必要があります。ユーザーがこのリストの選択を変更すると、最初の列を除くすべてを削除し、選択に基づいて列を動的に追加する必要があります。
マークアップで定義されている列は 1 つだけです。列 0 はテンプレート列で、そこで Select リンクと別のアプリケーション固有の LinkButton を宣言します。その列は常にそこにある必要があります。ListBoxSelection が作成されたら、最初の列以外をすべて削除してから、目的の列を再度追加します (このサンプルでは、常に「タイトル」列を追加するように簡略化しています)。コードの一部を次に示します。
RemoveVariableColumnsFromGrid();
BoundField b = new BoundField();
b.DataField = "Title";
this.gvPrimaryListView.Columns.Add(b);
this.gvPrimaryListView.DataBind();
private void RemoveVariableColumnsFromGrid() {
int ColCount = this.gvPrimaryListView.Columns.Count;
//Leave column 0 -- our select and view template column
while (ColCount > 1) {
this.gvPrimaryListView.Columns.RemoveAt(ColCount - 1);
--ColCount;
}
}
このコードを初めて実行すると、静的列と動的に追加された「タイトル」列の両方が表示されます。ただし、次に選択が行われると、最初の列は空 (何もない) で生成されます。タイトル列が表示され、その左側に最初の列が表示されますが、その中には何も生成されていません。デバッガーを見ると、gvPrimaryListView にはまだ 2 つの列があり、最初の列 (インデックス 0) は実際にはテンプレート列であることがわかります。実際、列は、以下のマークアップで 165px として設定されている幅も保持します (デバッグ目的で)。
何か案は?
<asp:GridView ID="gvPrimaryListView" runat="server" Width="100%" AutoGenerateColumns="false"
DataKeyNames="Document_ID" EnableViewState="true" DataSourceID="odsPrimaryDataSource"
AllowPaging="true" AllowSorting="true" PageSize="10" OnPageIndexChanging="activeListView_PageIndexChanging"
AutoGenerateSelectButton="False" OnSelectedIndexChanged="activeListView_SelectedIndexChanged"
Visible="true" OnRowDataBound="CtlDocList_RowDataBound" Font-Size="8pt" Font-Names="Helvetica">
<Columns>
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:LinkButton EnableTheming="false" ID="CtlSelectDocRowBtn" runat="server" Text="Select"
CommandName="Select" CssClass="gridbutton" OnClick="RowSelectBtn_Click" />
<asp:ImageButton EnableTheming="false" ID="DocViewBtn" runat="server" ImageUrl="../../images/ViewDoc3.png"
CssClass="gridbutton" CommandName="Select" OnClick="DocViewBtn_Click" />
</ItemTemplate>
<ItemStyle Width="165px" />
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
<asp:Label ID="Label6" runat="server" Text="No rows found." SkinID="LabelHeader"></asp:Label>
</EmptyDataTemplate>
</asp:GridView>
いくつかの追加情報。
それが最初の列であるという事実とは何の関係もありませんが、それが TemplateField であるという事実とはすべて関係があります。通常の列を (マークアップで) 左に配置し、TemplateField 列を右に移動すると、最初の列が正常にレンダリングされ、(現在は 2 番目の) TemplateField 列が消えます。
もう1つの奇妙なこと-問題は最初のポストバックまたは2番目のポストバックでは発生しませんが、3番目のポストバックで始まり、その後のポストバックが続きます。私は困惑しています。