2011-03-30 3 views
2

나는 gridview에서 페이징을 사용했습니다.
서버 측 또는 클라이언트 측에서 gridview에서 확인/선택 취소를위한 코드가 필요합니다.
페이징없이 시도했지만 작동하고 있습니다. 나는 페이징으로 그것을 필요로한다.격자보기에서 처리 된 페이징에서 점검/선택 취소하지 않음

<asp:TemplateField> 
<HeaderTemplate> 
<asp:CheckBox ID="chkHGrid" runat="server" /> 
</HeaderTemplate> 
<ItemTemplate> 
<asp:CheckBox ID="chkGrid" runat="server" /> 
</ItemTemplate> 
<ItemStyle HorizontalAlign="Center" /> 
<HeaderStyle HorizontalAlign="Center" /> 
</asp:TemplateField> 

답변

4

이 기술은 페이징에서 GridView CheckBox의 상태를 유지 관리한다고합니다. 이를 달성하기위한 한 가지 방법은 다음과 같습니다.

  1. 확인 된 행과 관련된 DataKeys를 저장할 int 또는 string의 Genric List를 만듭니다.
  2. PageIndex를 새 색인으로 설정하기 전에 PageIndexChanging에서 지정하십시오. GridView의 각 행에 대해
    • 확인란을 선택하면 id가 일반 목록에 저장됩니다.
    • 체크 박스가 선택 해제되어있는 경우 & ID가 일반 목록에 존재하면 목록에서 해당 ID를 제거하십시오.
  3. RowDataBound 이벤트에서 각 DataRow에 대해 DataKeyName이 일반 목록에 있는지 확인하십시오. 그렇다면 CheckBox를 찾아 선택합니다.

제품 표와 간단한 예는 Northwind 데이터베이스는

private List<int> ProductIDs 
{ 
    get 
    { 
     if (this.ViewState["ProductIDs"] == null) 
     { 
      this.ViewState["ProductIDs"] = new List<int>(); 
     } 
     return this.ViewState["ProductIDs"] as List<int>; 
    } 
} 

protected void gvProducts_PageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    foreach (GridViewRow gvr in gvProducts.Rows) 
    { 
     CheckBox chkSelect = gvr.FindControl("chkSelect") as CheckBox; 
     if (chkSelect != null) 
     { 
      int productID = Convert.ToInt32(gvProducts.DataKeys[gvr.RowIndex]["ProductID"]); 
      if (chkSelect.Checked && !this.ProductIDs.Contains(productID)) 
      { 
       this.ProductIDs.Add(productID); 
      } 
      else if (!chkSelect.Checked && this.ProductIDs.Contains(productID)) 
      { 
       this.ProductIDs.Remove(productID); 
      } 
     } 
    } 
} 

protected void gvProducts_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    GridViewRow gvr = e.Row; 
    if (gvr.RowType == DataControlRowType.DataRow) 
    { 
     CheckBox chkSelect = gvr.FindControl("chkSelect") as CheckBox; 
     if (chkSelect != null) 
     { 
      int productID = Convert.ToInt32(gvProducts.DataKeys[gvr.RowIndex]["ProductID"]); 
      chkSelect.Checked = this.ProductIDs.Contains(productID); 
     } 
    } 
} 
+0

을 수행하는 방법에 ... 어떤 샘플 코드 뒤에 코드

아래의 마크 업

<asp:GridView ID="gvProducts" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="ProductID" OnPageIndexChanging="gvProducts_PageIndexChanging" OnRowDataBound="gvProducts_RowDataBound"> <Columns> <asp:TemplateField HeaderText="Select"> <ItemTemplate> <asp:CheckBox ID="chkSelect" runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False" ReadOnly="True" SortExpression="ProductID" /> <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="sdsProducts" runat="server" ConnectionString='<%$ ConnectionStrings:NorthwindConnectionString %>' SelectCommand="SELECT * FROM Products"> </asp:SqlDataSource> 

주어집니다 ,,, –

+0

해당 데이터 키가 템플릿에있을 수 있습니까? feild –

+0

gridview.DataKeynames = "ProductID"의 마크 업을 확인하십시오. 당신은 ofcourse를 itemtemplate의 hiddenfield로 저장할 수 있습니다. 그러나 우리가 소스를 보았을 때 이드를 노출시키고 좋은 습관은 아닙니다. – naveen

관련 문제