2013-01-10 28 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>