【发布时间】:2010-09-19 02:16:16
【问题描述】:
我在向 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 列消失了。
另外一件奇怪的事情——问题不会发生在第一次回发——或第二次——但它从第三次回发开始,然后继续进行后续的回发。我被难住了。
【问题讨论】:
-
我正在做同样的事情来在后面的代码中动态添加列,但是,问题是如果我动态添加 20+ 列,for each 循环会减慢整个页面的速度,你有没有相同的问题?