各位请注意,我这里说得是"当我再1页选中checkbox后,翻页后在回到第一页时,选中状态不见了."并不是说不能保存.

解决方案 »

  1.   

    http://www.csdn.net/develop/article/21/21294.shtm
      

  2.   

    呵呵,我正好做了这个东东,代码如下:
    //此结构为保存选择的关于操作员赋权信息的列表
    private struct structRoleList
    {
    public string Role_ID;
    public string Role_Name;
    public int    PageIndex;

    public structRoleList(string id,string name,int index)
    {
    Role_ID =id;
    Role_Name = name;
    PageIndex     = index;


    }
    }


    protected System.Web.UI.WebControls.Panel EnableAdd_Panel;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // Info_Label.Text=null;
    ListInfo_Panel.Visible = false;
    Info_Label.Text = null;
    Operator_Label.Text = null;
    if(!IsPostBack)
    {
    //默认为修改模式
    ViewState[MODE] = MODIFY_MODE;
        ViewState[ROLE_ID_VIEWSTATE] = "";


    RoleList_DataGrid.PageSize =5;
    ArrayList arlRole = new ArrayList();
    Session[SessionString.ROLE_LIST] = null;
    Session[SessionString.ROLE_LIST] = arlRole;






    DataGridDataBind(); 

    }



    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.imgBtnAdd.Click += new System.Web.UI.ImageClickEventHandler(this.imgBtnAdd_Click);
    this.imgBtnDel.Click += new System.Web.UI.ImageClickEventHandler(this.imgBtnDel_Click);
    this.LinkButton1.Click += new System.EventHandler(this.LinkButton1_Click);
    this.LinkButton3.Click += new System.EventHandler(this.LinkButton3_Click);
    this.LinkButton2.Click += new System.EventHandler(this.LinkButton2_Click);
    this.LinkButton4.Click += new System.EventHandler(this.LinkButton4_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
            
    //DataGrid的数据绑定

    private void DataGridDataBind()
    {
    RoleRuler oR = new RoleRuler();
    RoleData  oD = new RoleData();
       
    string errorInfo = null;
    string strOperator_ID =ConstValueProvider.Operator_ID.Trim(); 
        

    string strInfo = null;
    //get role by Role
    oD             = oR.Get_RoleData_By_Operator(strOperator_ID,out strInfo);
    if(strInfo!=null)
    return;
    oD.AcceptChanges();
    if(oD.Tables[0].Rows.Count==0)
    {
    Choice_Panel.Visible=false;
    ListInfo_Panel.Visible = true;
    return;
    }
    RoleList_DataGrid.DataSource = oD.Tables[0].DefaultView;
    RoleList_DataGrid.DataBind();
    if(oD==null)
    {
    pg.Text =  "<font color='red'>"+"0"+"</font>";
    cpg.Text =  "<font color='red'>"+"0"+"</font>";
    }
    else
    {
    pg.Text  = "<font color='red'>"+RoleList_DataGrid.PageCount.ToString()+"</font>";
    cpg.Text = "<font color='red'>"+(RoleList_DataGrid.CurrentPageIndex+1).ToString()+"</font>";
    }

    ArrayList  arlRole = (ArrayList) Session[SessionString.ROLE_LIST];

    Operator_Label.Text = null;
    if(arlRole.Count!=0)
    {
    Operator_Label.Text = "您已经选择要删除的角色为:";
    }
    for(int j=0;j<arlRole.Count;j++)
    {
       
    Operator_Label.Text +="<font color='red'>"+ ((structRoleList) arlRole[j]).Role_Name+"</font>"+" "; 
    }
               
    }

    //判断操作员是否在当前页面是否取消某一DATAGIRDITEM
    private void AbolishtorList()
    {

    ArrayList  arlRole = (ArrayList) Session[SessionString.ROLE_LIST];

    foreach(DataGridItem item in RoleList_DataGrid.Items)
    {
        
    if(item.ItemType==ListItemType.Item ||item.ItemType ==ListItemType.AlternatingItem)
    {
    CheckBox cb = (CheckBox) item.FindControl("select");
     
    if(!cb.Checked)
    {
    string Role_ID = item.Cells[1].Text.ToString();

    //    Response.Write(st.Role_ID); 
    int flag = -1;
    for(int k=0;k<arlRole.Count;k++)
    {
    if (((structRoleList) arlRole[k]).Role_ID== Role_ID)
    {
    flag =k;
    break;
    } }
    if(flag!=-1)
    arlRole.RemoveAt(flag); 

    //arlRole.
    }
    }
       
    }


    }
    //判断某一操作员是否选择了某一DATAGRIDITEM,并存储起来
    private void SetRoleList()
    {
    ArrayList  arlRole = (ArrayList) Session[SessionString.ROLE_LIST];   
    foreach(DataGridItem item in RoleList_DataGrid.Items)
    {
        
    if(item.ItemType==ListItemType.Item ||item.ItemType ==ListItemType.AlternatingItem||item.ItemType==ListItemType.EditItem)
    {
    CheckBox cb = (CheckBox) item.FindControl("select");
     
    if(cb.Checked)
    {
    string Role_ID = RoleList_DataGrid.DataKeys[item.ItemIndex].ToString() ;
    string Role_Name = null;
    if(item.ItemType==ListItemType.Item ||item.ItemType ==ListItemType.AlternatingItem)
    {
    Role_Name =((Label) item.FindControl("Role_Name_Label")).Text;
    }
    else
    {
       Role_Name =((TextBox) item.FindControl("Role_Name_TextBox")).Text;
    }
    int index         = RoleList_DataGrid.CurrentPageIndex;
    structRoleList st = new structRoleList(Role_ID,Role_Name,index);


    //    Response.Write(st.Role_ID); 
    int flag = 0;
    for(int k=0;k<arlRole.Count;k++)
    {
    if (((structRoleList) arlRole[k]).Role_ID== Role_ID)
    {
    flag =1;
    break;
    } }
    if(flag==0)
    arlRole.Add(st);

    //arlRole.
    }
    }
       
    }


    }
    #region 翻页逻辑 
    private void LinkButton1_Click(object sender, System.EventArgs e)
    {
    ViewState[MODE]  = MODIFY_MODE;
    RoleList_DataGrid.EditItemIndex = -1;
    SetRoleList();
    AbolishtorList();
    if(RoleList_DataGrid.CurrentPageIndex>0)
    {

    RoleList_DataGrid.CurrentPageIndex--;   
         
    }
    DataGridDataBind();
    } private void LinkButton2_Click(object sender, System.EventArgs e)
    {
    ViewState[MODE]  = MODIFY_MODE;
    RoleList_DataGrid.EditItemIndex = -1;
    SetRoleList();
    AbolishtorList();
    if(RoleList_DataGrid.CurrentPageIndex<(RoleList_DataGrid.PageCount-1))
    {

    RoleList_DataGrid.CurrentPageIndex++;

    }
    DataGridDataBind();
    }

    private void LinkButton3_Click(object sender, System.EventArgs e)
    {
    ViewState[MODE]  = MODIFY_MODE;
    RoleList_DataGrid.EditItemIndex = -1;
    SetRoleList();
    AbolishtorList();
    if(RoleList_DataGrid.CurrentPageIndex>0)
    {

    RoleList_DataGrid.CurrentPageIndex--;
    }
    DataGridDataBind();
    } private void LinkButton4_Click(object sender, System.EventArgs e)
    {
    ViewState[MODE]  = MODIFY_MODE;
    RoleList_DataGrid.EditItemIndex = -1;
    SetRoleList();
    AbolishtorList();
    if(RoleList_DataGrid.CurrentPageIndex<(RoleList_DataGrid.PageCount-1))
    {

    RoleList_DataGrid.CurrentPageIndex++;
    }
    DataGridDataBind();
    }
    #endregion
    #region 页面事件处理
    protected void DealWithDataGridStyle(DataGridItem item)
    {
    if((item.ItemType == ListItemType.Item) || 
    (item.ItemType == ListItemType.AlternatingItem))
    {
     
    //当鼠标指到某一行时变色
    item.Attributes.Add("onmouseover", "this.style.backgroundColor='#E1F6FA'");
    if(item.ItemType == ListItemType.AlternatingItem)
    item.Attributes.Add("onmouseout", "this.style.backgroundColor='#E9E9E9'");
    else
    item.Attributes.Add("onmouseout", "this.style.backgroundColor='#E9E9E9'");
    }


        
    }
      

  3.   

    protected void Item_Bound(Object sender, DataGridItemEventArgs e) 
    {

    DealWithDataGridStyle(e.Item);
    ArrayList  arlRole = (ArrayList) Session[SessionString.ROLE_LIST];
    RoleList_DataGrid.Columns[1].Visible = false;
    DataGridItem item = (DataGridItem) e.Item;
    //deal with visible
    if(ViewState[MODE].ToString().Trim()==SAVE_MODE)
    {
    RoleList_DataGrid.Columns[6].Visible = false;
    RoleList_DataGrid.Columns[7].Visible = false;
    RoleList_DataGrid.Columns[4].Visible = false;
                   // RoleList_DataGrid.Columns[0].Visible = false;

    }
    else
    {
    RoleList_DataGrid.Columns[6].Visible = true;
    RoleList_DataGrid.Columns[7].Visible = true;
    RoleList_DataGrid.Columns[4].Visible = true;
    // RoleList_DataGrid.Columns[0].Visible = true;
    }
    //deal with IMAGEBUTTON
    try
    {
    ImageButton ib    = (ImageButton) e.Item.FindControl("Modify_Button"); if(ViewState[MODE].ToString()==MODIFY_MODE)
    {
    ib.ImageUrl = "../images/xiugai.gif";
    }
    if(ViewState[MODE].ToString()==SAVE_MODE)
    {
    ib.ImageUrl = "../images/xiugai.gif";
    }
    if(ViewState[MODE].ToString()==SAVE_MODE&&item.ItemType==ListItemType.EditItem)  
    {
    ib.ImageUrl ="../images/bc.gif";
    } }
    catch
    {
    }
    //deal with edititem
    if(item.ItemType==ListItemType.EditItem)
    {
    string strRole_Enable = ((DataRowView) item.DataItem).Row[RoleData.ROLE_ENABLE_FIELD].ToString().Trim();
    string strRole_Level  = ((DataRowView) item.DataItem).Row[RoleData.ROLE_LEVEL_FIELD].ToString().Trim();
    string strRole_City   = ((DataRowView) item.DataItem).Row[RoleData.ROLE_CITY_FIELD].ToString().Trim();
    CheckBox cb = (CheckBox) item.FindControl("Enable_CheckBox");
    DropDownList ddl = (DropDownList) item.FindControl("Role_Level_DDL");
                    DropDownList ddl_Company = (DropDownList) item.FindControl("Company_DDL");
    if(strRole_Enable=="1")
    {

    cb.Checked  = true;
    }
    else
    {
       cb.Checked   = false; 
    }
    if(strRole_Level=="1")
    {
    ddl.SelectedIndex = 0;
    }
    else
    {
       ddl.SelectedIndex  = 1;
    }
    string errorInfo = null;
    DataTable dt_Company  = (new PublicRuler()).GetAllCompanyDataByOperatorID(ConstValueProvider.Operator_ID,out errorInfo);
                    if(errorInfo!= null)
    return;
    ddl_Company.DataSource        = dt_Company;
    ddl_Company.DataTextField     = "Company_Name";
    ddl_Company.DataValueField    = "Company_ID";
    ddl_Company.DataBind(); 
    for(int i=0;i<ddl_Company.Items.Count;i++)
    {
       if(ddl_Company.Items[i].Value==strRole_City)
       ddl_Company.Items[i].Selected = true;
    }
                    //wrap the role_create_user and role_create_time and role_level
      

                    
    }
    //format transfer
    if(item.ItemType==ListItemType.Item ||item.ItemType ==ListItemType.AlternatingItem)
    {
    Label l = (Label) item.FindControl("Enable_Flag_Label");
        if(l.Text.Trim()=="1")
    l.Text = "有效";
        else
    l.Text = "无效";
                    
        Label ll = (Label) item.FindControl("Role_Level_Label");
       if(ll.Text.Trim()=="1")
    ll.Text = "省级";
       else
    ll.Text = "省级";
      string strTime = item.Cells[7].Text.Trim();
      DateTime dateTime = Convert.ToDateTime(strTime);  
         item.Cells[7].Text =  dateTime.ToShortDateString(); 
    //transfer companyid to companyname  
    string strCompanyID   = ((Label) item.FindControl("Company_Label")).Text.Trim();
                      string strCompanyName = (new PublicDataAccessor()).Get_CompanyName_By_CompanyID(strCompanyID);
      item.Cells[5].Text    =  strCompanyName;
    }
            
    if(item.ItemType==ListItemType.Item ||item.ItemType ==ListItemType.AlternatingItem)
    {


    string Role_ID = RoleList_DataGrid.DataKeys[item.ItemIndex].ToString();

    for(int k=0;k<arlRole.Count;k++)
    {

    if (((structRoleList) arlRole[k]).Role_ID== Role_ID )
    {
    CheckBox cb = (CheckBox) item.FindControl("select");
    cb.Checked = true;
    }
    }
    }

            
     
    }
    //取消操作员对此指标的权限
    private void imgBtnDel_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {
    SetRoleList();
    AbolishtorList();
    ArrayList  arlRole = (ArrayList) Session[SessionString.ROLE_LIST];
    ViewState[MODE] = MODIFY_MODE;
    RoleList_DataGrid.EditItemIndex = -1;
    if(arlRole.Count==0)
    {

    Info_Label.Text = "对不起,您没有选择要取消菜单权限的用户,请选择用户!";
    //Response.Write("<script language='JavaScript'>alert('您就已经添加了这个用户')</script>");
    return; }
    else
    {
     
                ArrayList al = new ArrayList();
    for(int i=0;i<arlRole.Count;i++)
    {
    structRoleList structRole = (structRoleList) arlRole[i];
                        al.Add(structRole.Role_ID.Trim());
     
    }
    string info = null;
    //调用后台类取消权限
    bool p = (new RoleDataAccessor()).Delete_RoleData(al);
      
    if(!p)
    {
    Info_Label.Text = info;
    Response.Redirect("AbolishMenuPowerPage.aspx",true);
    }
    else
    {
    Info_Label.Text = "您已经成功的删除了你所选角色:";
    for(int x=0;x<arlRole.Count;x++)
    {
    Info_Label.Text +="<font color='red'>"+ ((structRoleList) arlRole[x]).Role_Name+"</font>"+" "; 
    }
    Info_Label.Text  +=",请继续选择角色或者重新选择菜单!";
    RoleList_DataGrid.CurrentPageIndex = 0;
    arlRole.Clear(); 
    Operator_Label.Text = null;
    DataGridDataBind();
    }

    }




    }
      

  4.   

    讲一下思路:
    1。structRoleList结构为被选中的DATAGRIDITEM的记录器,如果你的一条记录中只有一个关键字,就不需要用这个了,
    2。把structRoleList放在ARRAYLIST里,并在第一次初始页面的时候开SEESION,当然你可以用VIEWSTATE,不过要以STRING的形式存在,
    3。关键的两个函数是SETROLELIST(),ABOLISHLIST(),他们的分别是在页面回访的时候设置别选中的CHECKBOX,和被勾掉的CHECKBOX,注意,不见得就只有分页才会引起回访。
    4。在所有的回访事件中调用上述两个函数。
    5。在DATAGRID的数据绑定事件中恢复CHECKBOX的状态,如上。
    7。保证在一定情况下清掉SESSION值,比如在页面第一次访问的时候,设置SESSION[ROLELIST] = NULL,然后重新设置为一个NEW ARRAYLIST
      

  5.   

    谢谢各位的参与特别是 conquersky(宇森),因为zhongkeruanjian(编程亮子)的代码较长,没有来的机看,以后再说了.本问题我已经解决!解决方案主要参考http://www.csdn.net/develop/article/21/21294.shtm
    但是有一个问题是文章没有注意的.如果最末页面的记录不能填满此页面.将有出错信息:索引超出范围.我的解决方法如下,之列出不同点.
    Dim j, k As Integer        If (DataGrid2.CurrentPageIndex + 1) * DataGrid2.PageSize > count Then
               '现在是最后一页
                k = count- (DataGrid2.CurrentPageIndex) * DataGrid2.PageSize 
            Else
                k = DataGrid2.PageSize - 1
            End If        For j = 0 To k-1
    ......................................................
    通例:
    Dim i As Integer
            If (DataGrid2.CurrentPageIndex + 1) * DataGrid2.PageSize > count Then
                '现在是最后一页
                k = count - (DataGrid2.CurrentPageIndex) * DataGrid2.PageSize
            Else
                k = DataGrid2.PageSize
            End If        For i = 0 To k - 1
    ...........................................................
    再次感谢ereryone!