c# - ASP.NET GridView 列删除

标签 c# asp.net gridview

我有一个 GridView,其中包含一些预定义的 Column 和一些在代码中生成的。我的想法是,我根据用户选择的类别显示 Column。我无法创建所有 Column 并隐藏它们,因为我不知道我需要多少个 Column。我设法生成了我需要的 Column,但是当我尝试删除生成的 Column 时,问题就开始了。情况是这样的:

  1. 在第一次加载时,我看到所有类别的 GridView
  2. 点击 ListBox 后,我得到了我想要的结果。创建了 1 个额外的 Column(未调用 RemoveAt,因为尚未创建额外的 Column。)。
  3. 点击其他 ListBox Item 后,我仍然得到我想要的结果。上次创建的 Column 被删除并添加了新的 Column
  4. 此时,如果我在调试时单击 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/

相关文章:

asp.net - 在 GeneXus 应用程序中捕获 ASP.NET session 超时

c# - 检索 asp :TextBox 的值

c# - 获取数组中最常见(频繁)的字符串条目

c# - WebMethod 在参数中接收 null

c# - GridMvc 根据 if 条件渲染列

c# - 如何获取 Gridview SelectedItem 子网格?

asp.net - Gridview - 基于列数据的单元格行颜色

C#文件夹浏览器对话框问题

c# - 如何检测文本的字符集?

javascript - JavaScript 中的文本框值