using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Maticsoft.BLL;
using Maticsoft.Model;
public partial class test_testcheckbox : System.Web.UI.Page
{
TestBLL testBLL = new TestBLL();
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
doSearch();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string stuNo_all = string.Empty;
foreach (RepeaterItem item in this.Repeater1.Items)
{
if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
CheckBox cb = item.FindControl("chbSelect") as CheckBox;
if (cb.Checked)
{
stuNo_all += cb.Text + ",";
}
}
}
string[] stuno = stuNo_all.Split(',');
for (int i = 0; i < stuno.Length; i++)
{
if (stuno[i] != "")
{
if (stuno[i] == "1")
{
ScriptManager.RegisterStartupScript(this, this.GetType(), "test", "alert('测试数据不能删除!');", true);
}
else
{
Test testModel = testBLL.GetModel(Convert.ToInt16(stuno[i]));
testModel.stuno = Convert.ToInt16(stuno[i]);
testModel.delflag = 1;
testBLL.Update(testModel);
}
}
}
doSearch();
}
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
doSearch();
}
private void doSearch()
{
this.Repeater1.DataSource = null;
this.Repeater1.DataBind();
AspNetPager1.RecordCount = 0;
DataSet ds = testBLL.GetList("delflag=0");
if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
{
AspNetPager1.RecordCount = ds.Tables[0].Rows.Count;
PagedDataSource pds = new PagedDataSource();
pds.DataSource = ds.Tables[0].DefaultView;
pds.AllowPaging = true;
pds.CurrentPageIndex = AspNetPager1.CurrentPageIndex - 1;
pds.PageSize = AspNetPager1.PageSize;
this.Repeater1.DataSource = pds;
this.Repeater1.DataBind();
}
}
}
大家好,这个是我分页的代码,就是不知道如何保存复选框的状态。我简单把问题描述下,我在第一页选中2个复选框,然后点下一页,再回到第一页,刚刚选中的两个复选框就丢失了,也就是页面刷新了。不知道该怎么解决,麻烦各位老师帮我看下。谢谢了。
你把勾选上的复选框对应的数据行ID保存在session中,每次显示的时候做下判断需不需要勾选。
也可以把ID保存在cookies中,用javascript做判断显示。
老师您好,麻烦可以说的详细一点吗?把ID保存在session中,我写在哪个事件里面呢?可以帮我在我的代码上改改吗?谢谢了
@i surrender: 我给你写个服务器端用session保存的吧。我就简单地写一下,马上发上来。
@i surrender: 后台代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
doSearch(1);
}
}
private void doSearch(int page)
{
this.Repeater1.DataSource = null;
this.Repeater1.DataBind();
TestData testData=new TestData();
List<Model> list = testData.GetData(page);
this.Repeater1.DataSource = list;
this.Repeater1.DataBind();
}
//换页,相当于你页面改变的事件.我这里没有AspNetPager1控件,我换页就直接手写数字换页
protected void Button1_Click1(object sender, EventArgs e)
{
#region 这里就是把选中的checkbox中的Text保存起来,也可以是其它值,反正要能够通过这个值唯一地确定一个checkbox
List<string> checkedModelIdList;
var obj = Session["CheckedModelIdList"];
if (obj == null || (obj as List<string>)==null)
checkedModelIdList=new List<string>();
else
{
checkedModelIdList = obj as List<string>;
}
//换页的时候先保存已选择的checkbox的ID
foreach (RepeaterItem item in Repeater1.Items)
{
CheckBox chk = (CheckBox)item.FindControl("CheckBox1");
if (chk.Checked)
{
if(!checkedModelIdList.Contains(chk.Text))
{
checkedModelIdList.Add(chk.Text);
}
}
else
{
if (checkedModelIdList.Contains(chk.Text))
{
checkedModelIdList.Remove(chk.Text);
}
}
}
Session["CheckedModelIdList"] = checkedModelIdList;
#endregion
//显示新的页
int page = 0;
int.TryParse(TextBox1.Text.Trim(), out page);
doSearch(page);
}
///<summary>
/// 绑定数据时做判断,再设置checkbox的选中状态
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
List<string> checkedModelIdList;
var obj = Session["CheckedModelIdList"];
if (obj == null || (obj as List<string>) == null)
checkedModelIdList = new List<string>();
else
{
checkedModelIdList = obj as List<string>;
}
CheckBox chk = (CheckBox)e.Item.FindControl("CheckBox1");
chk.Checked = checkedModelIdList.Contains(chk.Text);
}
}
///<summary>
/// 这个类是模拟数据的
///</summary>
public class TestData
{
public List<Model> testDataList = new List<Model>();
public TestData()
{
testDataList.Clear();
testDataList.Add(new Model {ModelId = "1", ModelContent = "1axaa"});
testDataList.Add(new Model {ModelId = "2", ModelContent = "1aavca"});
testDataList.Add(new Model {ModelId = "3", ModelContent = "1aacxza"});
testDataList.Add(new Model {ModelId = "4", ModelContent = "1a2aa"});
testDataList.Add(new Model {ModelId = "5", ModelContent = "1abzxaa"});
testDataList.Add(new Model {ModelId = "6", ModelContent = "1abaa"});
testDataList.Add(new Model {ModelId = "7", ModelContent = "1aa a"});
testDataList.Add(new Model {ModelId = "8", ModelContent = "1acxaa"});
testDataList.Add(new Model {ModelId = "9", ModelContent = "1acaa"});
testDataList.Add(new Model {ModelId = "10", ModelContent = "1aaza"});
testDataList.Add(new Model {ModelId = "11", ModelContent = "1aaca"});
testDataList.Add(new Model {ModelId = "13", ModelContent = "1aavca"});
testDataList.Add(new Model {ModelId = "14", ModelContent = "1aaa"});
testDataList.Add(new Model {ModelId = "15", ModelContent = "1azaa"});
testDataList.Add(new Model {ModelId = "16", ModelContent = "1acaa"});
testDataList.Add(new Model {ModelId = "17", ModelContent = "1aacxa"});
testDataList.Add(new Model {ModelId = "18", ModelContent = "1aaccaa"});
testDataList.Add(new Model {ModelId = "19", ModelContent = "1a2ccsn5aa"});
testDataList.Add(new Model {ModelId = "20", ModelContent = "1weaaa"});
}
///<summary>
/// 传入页返回指定页的数据.我假设每页是显示4条数据的.
///</summary>
///<param name="page"></param>
///<returns></returns>
public List<Model> GetData(int page)
{
return testDataList.Skip(4*(page - 1)).Take(4).ToList();
}
}
///<summary>
/// 显示用的实体
///</summary>
public class Model
{
public string ModelId;
public string ModelContent;
}
前台代码如下:
<%@ Page Title="主页" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<asp:Repeater ID="Repeater1" runat="server" onitemdatabound="Repeater1_ItemDataBound">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" Text='<%# ((Model)Container.DataItem).ModelId%>' runat="server" />
<asp:Label ID="Label1" runat="server" Text='<%# ((Model)Container.DataItem).ModelContent%>'></asp:Label>
</ItemTemplate>
</asp:Repeater>
<br/>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click1"
Text="Button" />
</asp:Content>
@i surrender: 代码如上。你可以在界面上的文本框中输入页码,然后点击按钮切换页面。我机器上没有你的分页控件,就用这样模拟一下。用javascript实现的我就不写了。
@LCM: 嗯 谢谢 我先看看 不明白的地方再请教您
@LCM: 老师在您的Repeater1_ItemDataBound事件里面是不是应该加一句if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)呢?
@i surrender: 加没加应该没什么关系吧。我只是做了个示例,怎么用怎么改就看你自己的需要了。另外,楼下面说的用viewstate也挺好的。只是原理都一样,都是得把已选中checkbox保存起来。
无解,一般都不会这样做分页的批量操作。
无论保持在session或cookies中,都会有问题。
像这样保存:
Dictionary<int, decimal> dict = (Dictionary<int, decimal>)ViewState["products"];
foreach (GridViewRow row in this.gvVoucher.Rows)
{
KeyValuePair<int, decimal> item = dict.ElementAt<KeyValuePair<int, decimal>>(row.DataItemIndex);
TextBox tbx = (TextBox)row.Cells[6].FindControl("txtCount");
decimal result = 0m;
if (Decimal.TryParse(tbx.Text, out result))
{
dict[item.Key] = result;
}
}
像这样的你可以模仿viewstate,保存就可以了
怎么貌似不行啊?到底可不可以啊