我在将列动态添加到 GridView 时遇到问题。我需要根据 DropDownList 中的值更改布局——即包含的列。当用户更改此列表中的选择时,我需要删除除第一列之外的所有列,并根据选择动态添加其他列。
我的标记中只定义了一个列——第 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 确实仍然有两列,第一列(索引 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 列向右移动,则第一列呈现良好,并且(现在是第二个)TemplateField 列消失。
另一个奇怪的事情——问题不会发生在第一次回发——或第二次——但它从第三次回发开始,然后继续进行后续的回发。我难住了。