2011-03-14 1 views
0

격자보기에 표시된 항목을 선택하면 확인란 값을 유지하려고합니다.페이징 asp.net/c#에서 Gridview의 checkbox 값 지속성

이가있는 gridview 생성 gridviewpage.aspx의 코드입니다 : 이것은 gridviewpage.aspx.cs

값을 지속 할 수 없습니다
using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Data.SqlClient; 
using System.Collections; 
using System.IO.Compression; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    {   
     ArrayList CheckBoxArray; 
     if (ViewState["CheckBoxArray"] != null) 
     { 
      CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"]; 
     } 
     else 
     { 
      CheckBoxArray = new ArrayList(); 
     } 

     if (IsPostBack) 
     { 
      int CheckBoxIndex; 
      bool CheckAllWasChecked=false; 
      CheckBox chkAll = (CheckBox)GridView1.HeaderRow.Cells[4].FindControl("chkAll"); 
      string checkAllIndex = "chkAll-" + GridView1.PageIndex; 
      if (chkAll.Checked) 
      {     
       if (CheckBoxArray.IndexOf(checkAllIndex) == -1) 
       { 
        CheckBoxArray.Add(checkAllIndex); 
       } 
      } 
      else 
      { 
       if (CheckBoxArray.IndexOf(checkAllIndex) != -1) 
       { 
        CheckBoxArray.Remove(checkAllIndex); 
        CheckAllWasChecked = true; 
       } 
      } 
      for (int i = 0; i < GridView1.Rows.Count; i++) 
      { 
       if (GridView1.Rows[i].RowType == DataControlRowType.DataRow) 
       { 
        CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1"); 
        CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1); 
        if (chk.Checked) 
        { 
         if (CheckBoxArray.IndexOf(CheckBoxIndex) == -1 && !CheckAllWasChecked) 
         { 
          CheckBoxArray.Add(CheckBoxIndex); 
         } 
        } 
        else 
        { 
         if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1 || CheckAllWasChecked) 
         { 
          CheckBoxArray.Remove(CheckBoxIndex); 
         } 
        } 
       } 
      } 
     } 
     ViewState["CheckBoxArray"] = CheckBoxArray; 

     GridView1.DataBind(); 
    } 

    protected void OnPaging1xxx(object sender, GridViewPageEventArgs e) 
    { 

     GridView1.PageIndex = e.NewPageIndex; 
     GridView1.DataBind(); 
     if (ViewState["CheckBoxArray"] != null) 
     { 
      ArrayList CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"]; 
      string checkAllIndex = "chkAll-" + GridView1.PageIndex; 

      if (CheckBoxArray.IndexOf(checkAllIndex) != -1) 
      { 
       CheckBox chkAll = (CheckBox)GridView1.HeaderRow.Cells[4].FindControl("chkAll"); 
       chkAll.Checked = true; 
      } 
      for (int i = 0; i < GridView1.Rows.Count; i++) 
      { 

       if (GridView1.Rows[i].RowType == DataControlRowType.DataRow) 
       { 
        if (CheckBoxArray.IndexOf(checkAllIndex) != -1) 
        { 
         CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1"); 
         chk.Checked = true; 
         GridView1.Rows[i].Attributes.Add("style","background-color:aqua");  
        } 
        else 
        { 
         int CheckBoxIndex = GridView1.PageSize * (GridView1.PageIndex) + (i + 1); 
         if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1) 
         { 
          CheckBox chk = (CheckBox)GridView1.Rows[i].Cells[4].FindControl("CheckBox1"); 
          chk.Checked = true; 
          GridView1.Rows[i].Attributes.Add("style", "background-color:aqua"); 
         } 
        } 
       } 
      } 
     } 
    } 
    protected void RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      e.Row.Attributes.Add("onmouseover", "MouseEvents(this, event)"); 
      e.Row.Attributes.Add("onmouseout", "MouseEvents(this, event)"); 
     } 
    } 
} 

의 코드가

<form id="form1" runat="server"> 
    <div> 
     <asp:GridView ID="GridView1" runat="server" 
     AutoGenerateColumns = "False" Font-Names = "Arial" 
     Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B" 
     HeaderStyle-BackColor = "green" AllowPaging ="True" 
     OnPageIndexChanging = "OnPaging1xxx" OnRowDataBound = "RowDataBound" 
      AllowSorting="True" DataKeyNames="CustomerID" DataSourceID="SqlDataSource1" > 
     <Columns> 
     <asp:BoundField ItemStyle-Width = "150px" DataField = "CustomerID" 
       HeaderText = "CustomerID" ReadOnly="True" SortExpression="CustomerID" /> 
     <asp:BoundField ItemStyle-Width = "150px" DataField = "City" HeaderText = "City" 
       SortExpression="City"/> 
     <asp:BoundField ItemStyle-Width = "150px" DataField = "Country" 
       HeaderText = "Country" SortExpression="Country"/> 
     <asp:BoundField ItemStyle-Width = "150px" DataField = "PostalCode" 
       HeaderText = "PostalCode" SortExpression="PostalCode"/> 
       <asp:TemplateField> 
       <ItemTemplate> 
       <asp:CheckBox id="CheckBox1" runat="server" onclick="Check_Click(this)"/> 
       </ItemTemplate> 
       <HeaderTemplate> 
       <asp:CheckBox id="chkAll" runat="server" Text="Select All" onclick="checkAll(this)"/> 
       </HeaderTemplate> 
       </asp:TemplateField> 
     </Columns> 
     <AlternatingRowStyle BackColor="#C2D69B" /> 

<HeaderStyle BackColor="Green"></HeaderStyle> 
    </asp:GridView> 
     <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="Data Source=SDANTURTHI-PC;Initial Catalog=ArticleDB;Integrated Security=True" 
      ProviderName="System.Data.SqlClient" 
      SelectCommand="SELECT [CustomerID], [City], [Country], [PostalCode] FROM [Customers]"> 
     </asp:SqlDataSource> 
    </div> 

는, 하지만 내가 checkboxarray을 디버그하고 viewstate["checkboxarray"] 올바른 가치를 가지고있는 것 같습니다. 왜 작동하지 않는지 나는 이해하지 못한다. 도와주세요. 기대해 주셔서 감사합니다.

답변

1

ViewState는 서버에서 브라우저로의 트립에서만 "작동"합니다. 게시물에 여전히있을 수는 없습니다.

세션을 유지해야합니다.

다시 당신이
형태로 넣어하거나 필요한 서버에 싶어 EDIT

아무것도 - 그것은으로 Request.Form [ "blabla"]에 있습니다>
또는 쿼리 문자열 (? mypage.aspx blabla = someValue와)에
-> 그것은 사람들이 당신의 페이지에 서버에서 데이터를 얻을 수있는 유일한 두 가지 방법 Request.QueryString을 [ "blabla"]

에 있습니다. .

(부록이 :

당신의 컨트롤은 당신이 당신의 코드 숨김 CS 파일에서 처리하는 이벤트를 트리거 할 때 약간 당신에게서 숨겨져

ASP.NET 폼의 컨트롤을 감싸고 다시 게시물을한다 -> 당신에게 귀하의 코드를 실행 -> 업데이트 된 페이지가 반송 됨)

+0

문제가 아니며 OnPageIndexChanging = "OnPaging1xxx"코드의 .aspx 페이지에 문제가있는 것 같습니다. 나는 그것이 특정 체크 박스를 체크하고 있다고 생각하지만, 체크 박스 값을 잃어 버리도록 페이지를 만들고있는 다른 이벤트/메소드가 있다고 생각한다. 페이지 수명주기에 대한 자세한 그림을 제공 할 수 있다면이 수수께끼를 해독하는 데 도움이 될 수 있습니다. –