被选复选框的靠前显示
一、其他不多说,直接进入正题:我现在要把前一篇博客中,被选中的复选框都靠前显示,就是说要有图一的效果做成图二的效果:
二、实现思路
这也是一个难点,困扰了我很久,现在和大家一起分享:
实现思路:UserGroup表与 UserList_UserGroup(where UuserCode='')所属的分组集合(即复选框备选中的组) 进行左连接; 增加一个字段groupOrder(存在的组为1,不存在的为0)然后按groupOrder排序降序,即可实现靠前显示
其中UserGroup表存的是用户组信息, UserList_UserGroup是用户和用户组关系表。
这是数据库的测试效果:
SELECT
ug.Code,ug.GroupName,ug.GroupMark,ug.ValidStatus,ul_ug.UserGroupCode,ul_ug.UserListCode,(CASEWHEN ISNULL (ul_ug.Code,'0')='0' THEN '0' ELSE '1' END ) AS groupOrder , ROW_NUMBER() OVER (ORDER BY(CASE WHEN ISNULL (ul_ug.Code,'0')='0' THEN '0' ELSE '1' END) DESC ) AS 'RowNumberForSplit'
FROM [ManageCenter].[UserGroup] ug LEFT JOIN(SELECT * FROM ManageCenter.UserList_UserGroup WHEREUserListCode='d6ab201f-0cf2-8af4-40fb-5f6e7bfd6277')ul_ug ON ug.Code=ul_ug.UserGroupCode
WHERE 1 = 1 AND 1=1
其中groupOrder为1,靠前在前面,显示在页面的结果就是备选中的复选框靠前显示。
代码实现:
#region DataBinder()方法, Repeater1绑定用户组
/// <summary>
/// Repeater1绑定用户组
/// </summary>
protected List<string> strRoleCodeList = newList<string>();
public void DataBinder()
{
//从用户列表中传过来要分组的用户
string[] userCodes =Request.QueryString["userCode"].ToString().Split(',');
//查询单个用户的多分组集合code
if (userCodes.Length == 1) {
Data.UserList_UserGroupCollection UL_UserGroup =Data.UserList_UserGroupAdapter.Instance.LoadUserList_UserGroupCollByUserCode(userCodes[0]);
foreach (var p in UL_UserGroup)
{
strRoleCodeList.Add(p.UserGroupCode);
}
}
//绑定所有用户组列表
int startRowIndex = (curPageIndex -1) * AspNetPager1.PageSize;
int RecordCount = 0;
strSqlWhere ="1=1 ";
QueryCondition qc = newQueryCondition();
qc.FromClause= " [ManageCenter].[UserGroup] ug LEFT JOIN (SELECT * FROM ManageCenter.UserList_UserGroupWHERE UserListCode='" + userCodes[0] + "')ul_ug ON ug.Code=ul_ug.UserGroupCode ";
qc.OrderByClause = "(CASE WHEN ISNULL (ul_ug.Code,'0')='0' THEN '0' ELSE '1' END ) DESC ";
qc.SelectFields = "ug.Code,ug.GroupName,ug.GroupMark,ug.ValidStatus,ul_ug.UserGroupCode,ul_ug.UserListCode,(CASEWHEN ISNULL (ul_ug.Code,'0')='0' THEN '0' ELSE '1' END ) AS groupOrder ";
qc.WhereClause = strSqlWhere;
DataSet ds = new DataSet();
ds =CommData.commdata.GetDataPageList(startRowIndex, AspNetPager1.PageSize, refRecordCount, qc);
AspNetPager1.RecordCount =RecordCount;
Repeater1.DataSource = ds;
Repeater1.DataBind();
}
#endregion
#region CheckBoxStatus(string code) 方法; 前台绑定此方法,检查哪些复选框处于被选中的状态
protected string CheckBoxStatus(stringcode)
{
if (strRoleCodeList.Contains(code))
{ return"checked='checked'"; }
else
{ return ""; }
}
#endregion
/// <summary>
///包装分页查询的查询参数
///</summary>
[Serializable]
publicclass QueryCondition
{
privatestring selectFields = string.Empty;
privatestring fromClause = string.Empty;
privatestring whereClause = string.Empty;
privatestring orderByClause = string.Empty;
privatestring groupByClause = string.Empty;
privateint rowIndex = 0;
privateint pageSize = 10;
privatestring primaryKey = string.Empty;
///<summary>
///构造方法
///</summary>
publicQueryCondition()
{
}
///<summary>
///构造方法
///</summary>
///<param name="rowIndex">从第几行开始</param>
///<param name="pageSize">每页的行数</param>
///<param name="select">sql语句返回的字段</param>
///<param name="from">sql语句的from部分</param>
///<param name="orderBy">sql语句的orderBy部分</param>
publicQueryCondition(int rowIndex, int pageSize, string select, string from, stringorderBy)
{
this.rowIndex= rowIndex;
this.pageSize= pageSize;
this.selectFields= select;
this.fromClause= from;
this.orderByClause= orderBy;
}
}
说明:他们底层已经封装好了,通过QueryCondition实体,传递把所需要的sql部分传给去,然后拼接成我们的SQL语句的执行。截获的sql语句同上测试。
三、做这块的时候,由于对sql的使用不太熟练,刚开始没有思路,后来在同事周周帮助下完成了此操作,花的时间比较长;不过,做完之后还是很欣喜的。继续努力吧,需要学习的东西还很多。