ASP.NET GridView列删除

时间:2014-03-27 09:55:59

标签: 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. 此时,如果我在调试ListBox中点击任何其他Item LicensesCategoriesListBox_SelectedIndexChanged,我会发现所有GridView TemplateField都是空的({ {3}})。
  5. 如果我评论gridView.Columns.RemoveAt(i - 1)部分一切正常,只需Column继续生成和生成。任何想法为什么我TemplateField写的所有Page都变空了?

    我的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);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

  

任何想法为什么我的所有TemplateFields都写在我的Page中   空?

因为每个字段都被视为一个列。您已在代码中删除它们。

如果这是您的问题,您需要某种方法将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);
}
//...