2013-01-10 2 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(); 

는 그러나 이것은 내가 기대 영문 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>