我有一个 GridView
,其中包含一些预定义的 Column
和一些在代码中生成的。我的想法是,我根据用户选择的类别显示 Column
。我无法创建所有 Column
并隐藏它们,因为我不知道我需要多少个 Column
。我设法生成了我需要的 Column
,但是当我尝试删除生成的 Column
时,问题就开始了。情况是这样的:
- 在第一次加载时,我看到所有类别的
GridView
。 - 点击
ListBox
后,我得到了我想要的结果。创建了 1 个额外的Column
(未调用RemoveAt
,因为尚未创建额外的Column
。)。 - 点击其他
ListBox
Item
后,我仍然得到我想要的结果。上次创建的Column
被删除并添加了新的Column
。 - 此时,如果我在调试时单击
LicensesCategoriesListBox_SelectedIndexChanged
中的任何其他ListBox
Item
,我会看到所有GridView
TemplateField
为空 ( http://tinypic.com/r/98vdkm/8 )。
如果我评论部分 gridView.Columns.RemoveAt(i - 1)
一切正常,只是 Column
不断生成和生成。为什么我的所有 TemplateField
,写在我的 Page
中的任何想法都变成空的?
我的页面
是这样的:
<asp:ListBox ID="licensesCategoriesListBox" runat="server" AutoPostBack="true" OnSelectedIndexChanged="LicensesCategoriesListBox_SelectedIndexChanged" />
<asp:GridView ID="licencesGridView" runat="server" AutoGenerateColumns="False" Caption="Licencijos" DataKeyNames="id" ShowFooter="True">
<Columns>
<asp:TemplateField HeaderText="Pavadinimas">
<EditItemTemplate>
<asp:TextBox ID="licenceNameTextBox" runat="server" MaxLength="50" Text='<%# Bind("name") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="newLicenceNameTextBox" runat="server" MaxLength="50" ToolTip="Pavadinimas" />
</FooterTemplate>
<ItemTemplate>
<span><%# Eval("name") %></span>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Kategorija">
<EditItemTemplate>
<asp:DropDownList ID="licenceCategoryDropDownList" runat="server" />
</EditItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="newLicenceCategoryDropDownList" runat="server" ToolTip="Kategorija">
<asp:ListItem Text="Pasirinkite kategoriją:" />
</asp:DropDownList>
</FooterTemplate>
<ItemTemplate>
<span><%# Eval("category") %></span>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
代码:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
FillLicences(ref licencesGridView);
}
}
protected void LicensesCategoriesListBox_SelectedIndexChanged(object sender, EventArgs e) {
FillLicences(ref licencesGridView, licensesCategoriesListBox.SelectedValue); /// Value is ID of category.
}
public void FillLicences(ref GridView gridView, string category = "") {
DataTable dataTable;
ushort categoryId;
if (UInt16.TryParse(category, out categoryId)) {
PutAdditionalColumns(ref gridView, categoryId);
dataTable = sqlCommands.GetLicences(categoryId); /// Returns DataTable [name], [category] and additional fields that I add in PutAdditionalColumns method.
} else {
dataTable = sqlCommands.GetAllLicences(); /// Returns DataTable with only [name], [category]
}
gridView.DataSource = dataTable;
gridView.DataBind();
}
public void PutAdditionalColumns(ref GridView gridView, uint category) {
for (ushort i = (ushort)gridView.Columns.Count; i > 2; i--) { /// Removes columns at the end (created for other category)
gridView.Columns.RemoveAt(i - 1);
}
foreach (var pair in sqlCommands.GetLicencesCategoryAttributes(category)) { /// Takes additional field needed.
TemplateField field = new TemplateField(); /// New empty column.
field.AccessibleHeaderText = pair.Key.ToString();
field.HeaderText = pair.Value;
gridView.Columns.Add(field);
}
}
最佳答案
Any ideas why all of my TemplateFields, written in my Page becomes empty?
因为这些字段中的每一个都被视为一个列。您正在代码中删除它们。
如果这是您的问题,您需要一些方法将 aspx 中定义的列与代码中创建的列分开。
我会使用 DataColumn.ExtendedProperties
来执行此操作。
每当您从代码中添加一列时,向 ExtendedProperties 添加一个值,表明它是在代码中创建的。
//...
TemplateField field = new TemplateField(); /// New empty column.
field.AccessibleHeaderText = pair.Key.ToString();
field.HeaderText = pair.Value;
DataColumn ourNewColumn = gridView.Columns.Add(field);
ourNewColumn.ExtendedProperties.Add("CreatedInCode", true);
//...
然后当你要删除它们时,只有当它们设置了这个属性时才删除它们。
//...
if( gridView.Columns[i - 1].ExtendedProperties.ContainsKey("CreatedInCode") ) {
gridView.Columns.RemoveAt(i - 1);
}
//...
关于c# - ASP.NET GridView 列删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22683951/