2013-01-10 26 views
0

我有一个网格,我通过aspx页面向模板字段中添加了几列。使用静态列和动态列清除网格

 <asp:TemplateField> 
      <ItemTemplate> 
      <asp:LinkButton ID="lnkBtnDown" runat="server" CommandName="Download" Text="Download"></asp:LinkButton> 
       <asp:LinkButton ID="LnkBtnMan" runat="server" CommandName="Manual" Text="Manual" 
          Style="margin-left: 10px"></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 

网格从表中显示搜索结果,并有几个栏,我要躲起来,如文件名等栏,但我需要的数据,所以,我隐藏起来使用CSS样式。

private void generateSearchGrid(DataTable dt) 
    { 
     if (dt == null || dt.Rows.Count == 0) 
      return; 
     dgvSearchResults.DataSource = dt; 
     dgvSearchResults.AutoGenerateColumns = false; 

     BoundField bfName = new BoundField(); 
     bfName.DataField = dt.Columns["OsmProjectName"].ToString(); 
     bfName.HeaderText = "Project Name"; 

     BoundField bfProjID = new BoundField(); 
     bfProjID.DataField = dt.Columns["OsmProjectID"].ToString(); 
     bfProjID.HeaderText = "ID"; 


     BoundField bfProjFile = new BoundField(); 
     bfProjFile.DataField = dt.Columns["OsmProjectFile"].ToString(); 
     bfProjFile.HeaderText = "Project File"; 

     BoundField bfProjManual = new BoundField(); 
     bfProjManual.DataField = dt.Columns["OsmProjectManual"].ToString(); 
     bfProjManual.HeaderText = "Project Manual"; 

     BoundField bfProjType = new BoundField(); 
     bfProjType.DataField = dt.Columns["OsmProjectType"].ToString(); 
     bfProjType.HeaderText = "Project Type"; 

     dgvSearchResults.Columns.Add(bfProjID); 
     dgvSearchResults.Columns.Add(bfName); 
     dgvSearchResults.Columns.Add(bfProjType); 

     // WARNING : Keep these two at the end all the time in the same order. 
     dgvSearchResults.Columns.Add(bfProjFile); 
     dgvSearchResults.Columns.Add(bfProjManual); 

     dgvSearchResults.DataBind(); 

     // Assigning a css where display has been set to none. 
     bfProjManual.HeaderStyle.CssClass = "hiddenCols"; 
     bfProjID.HeaderStyle.CssClass = "hiddenCols"; 
     bfProjFile.HeaderStyle.CssClass = "hiddenCols"; 
     bfProjManual.ItemStyle.CssClass = "hiddenCols"; 
     bfProjID.ItemStyle.CssClass = "hiddenCols"; 
     bfProjFile.ItemStyle.CssClass = "hiddenCols"; 
    } 

在每一个搜索按钮单击事件我刷新由网格的开始,

 dgvSearchResults.DataSource = null; 
     dgvSearchResults.DataBind(); 
     dgvSearchResults.Columns.Clear(); 

但这清除所有列,包括我在预期ASPX page..as束缚的人。如果我不清除它们,搜索结果中的列就会一直堆积如山。

有没有一种方法,我可以只清除绑定列的动态?

回答

1

如果您知道您在aspx页面中添加了多少个以及您动态添加的数量,则可以执行此操作。

//if total added in aspx page is 2, first one is in index 0, second in index 1 

dgvSearchResults.Columns.RemoveAt(2); // this will remove the 3rd column 
dgvSearchResults.Columns.RemoveAt(3); // this will remove the 4th columns 
// you can continue till column x 
1

一种选择是disable viewstate dgvSearchResults GridView控件。在这种情况下,每回发一次,您需要绑定dgvSearchResults与数据。如果你不绑定,动态添加的列将被自动删除(不保留)。

这将发生,因为在你的情况下,动态添加的数据(和列)保持回发到回发隐藏元素(视图状态)。

因此,这将成为:

private void Page_Load(object sender, EventArgs e) 
    { 
     if(IsPostBack) // If postback, then bind GridView with previous search result 
     { 
     dgvSearchResults.DataSource = Session["dgvSearchResultsData"]; 
     dgvSearchResults.DataBind(); 
     } 
    } 


    private void generateSearchGrid(DataTable dt) 
    { 
     // ... 
     Session["dgvSearchResultsData"] = dt; // Save result into session 
     dgvSearchResults.DataSource = dt; 
     // ... 
    } 

ASPX:

<asp:GridView EnableViewState="false"> ... </GridView>