谢谢各位的参与特别是 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!
//此结构为保存选择的关于操作员赋权信息的列表
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'");
}
}
{
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();
}
}
}
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
但是有一个问题是文章没有注意的.如果最末页面的记录不能填满此页面.将有出错信息:索引超出范围.我的解决方法如下,之列出不同点.
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!