廊坊组织部的年终绩效考核系统,用户想在下面这个页面加上一个下拉框,筛选手误录入错误的数据,接手10天,终于实现这一需求,豁然开朗!
刚调代码时,庞然一个系统摆在面前,虽然是三层的,没有使用框架,但U层看起来还是着实有些"臃肿",可能是B/S的项目接触的少,感觉界面比C/S的难画多了,尤其是添加了EasyUI前台框架,对调试来说是雪上加霜
不过,10天,熬出来了,每天都搞,越来越接近真相,当程序运行成功的那一刻,明显感觉到自己的小心脏都要蹦出来了,虽然时间有点儿长吧
按照客户需求,为了快速开发,起初我设想这么去做:在源代码上额外加一条线,B层、D层都用自己最熟悉的代码,U层从工具箱里拖出下拉框控件安在页面上,然后将查到的datatable值返给界面datagrid控件显示出来,但屡屡失败,查到的值总是不显示,也不接收下拉框的点击,当时郁闷坏我了,最终迫于无奈,而且发现原系统中有和我的功能差不多的页面,也就是说可以照葫芦画瓢,复制一套出来,那,所以,之后就去研究已有的那条线代码,然后它就成了!
第一步:在数据库的基础表添加下拉框值(或者用系统添加),因为下拉框的值是读取的库;添加几条测试数据
第二步:aspx页面添加下拉框
第三步:在JS函数中添加新参数,也就是下拉框的参数
// 根据类型选择条件进行查询
function queryRecord() {
//查询参数直接添加在queryParams中
var queryParams = $('#dg').datagrid('options').queryParams;
//getQueryParams(queryParams);
var Category = $("#unitCategory").datebox("getText").trim();
var Cadresname = document.getElementById("txtName").value;
var UnitName = $("#unitName").datebox("getText").trim();
var Type = $("#dpType").datebox("getText");//韩林添加
queryParams.Category = Category;
queryParams.CadresName = Cadresname;
queryParams.UnitName = UnitName;
queryParams.Type = Type;//韩林添加
$('#dg').datagrid('options').queryParams = queryParams; //传递参数值
$('#dg').datagrid('reload'); //重新加载表信息datagrid
}
第四步:参数传给后台
//查询并把数据传递给后台,数组
function getQueryParams(queryParams) {
var Category = $("#unitCategory").datebox("getValue");
var Cadresname = document.getElementById("txtName").innerHTML;
var UnitName = $("#unitName").datebox("getValue");
var Type = $("#dpType").datebox("getText");//韩林添加
queryParams.Category = Category;
queryParams.CadresName = Cadresname;
queryParams.UnitName = UnitName;
queryParams.Type = Type;//韩林添加
return queryParams;
}
第五步:修改一般处理程序.ashx中的代码,一是加上填充下拉框的代码,二是修改查询方法
填充下拉框代码:
public void LoadWrongItems(HttpContext context)
{
//加载管理端字典表中的数据
SystemDictionaryBLL admSystemDictionaryBll = new SystemDictionaryBLL();
//定义一个系统字典表的实体类
SystemDictionaryEntity enSystemDictionary = new SystemDictionaryEntity();
DataTable dt = new DataTable();
enSystemDictionary.Type = "错误类型";
DataTable dtSearchType = admSystemDictionaryBll.Selectbytype(enSystemDictionary);
dtSearchType.Rows.Add("0", "全部错误录入数据");
string strJson = DataTable2Json(dtSearchType);
//返回给界面
//string strJson1 = "[" + strJson + "]";//当此代码页已有给Json串加上中括号的代码后,这句话就不需要了
context.Response.Write(strJson);
context.Response.End();
}
修改查询方法(即加上下拉框参数)
public void QueryRecord(HttpContext context)
{
//===============================================================
//获取查询条件:【用户id,开始时间,结束时间,关键字】
string category, unitname, txtname, key;//key为代表筛选错误类型框中的值的变量
category = unitname = txtname = key = "";
//获取前台传来的:单位类别
if (null != context.Request.QueryString["Category"] && "" != context.Request.QueryString["Category"])
{//获取前台传来的值
category = context.Request.QueryString["Category"].ToString().Trim();
category = sysDictorybll.GetIdByName(category).Rows[0]["Id"].ToString().Trim();
}
//获取前台传递过来的:干部名称
if (null != context.Request.QueryString["CadresName"])
{
txtname = context.Request.QueryString["CadresName"].ToString().Trim();
}
//前台传递的:单位名称
if (null != context.Request.QueryString["UnitName"])
{
unitname = context.Request.QueryString["UnitName"].ToString().Trim();
}
//筛选错误数据的下拉框
if (null != context.Request.QueryString["Type"])
{
key = context.Request.QueryString["Type"].ToString().Trim();
}
//================================================================
//获取分页和排序信息:页大小,页码,排序方式,排序字段
int pageRows, page;
pageRows = 10;
page = 1;
string order, sort, oderby;
order = sort = oderby = "";
if (null != context.Request.QueryString["rows"])
{//获取前台传过来的
pageRows = int.Parse(context.Request.QueryString["rows"].ToString().Trim());
}
if (null != context.Request.QueryString["page"])
{
page = int.Parse(context.Request.QueryString["page"].ToString().Trim());
}
if (null != context.Request.QueryString["sort"])
{
order = context.Request.QueryString["sort"].ToString().Trim();
}
if (null != context.Request.QueryString["order"])
{
sort = context.Request.QueryString["order"].ToString().Trim();
}
//===================================================================
//组合查询语句:条件+排序
StringBuilder strWhere = new StringBuilder();
if (category != "")
{
if (category == "66")
{
strWhere.AppendFormat("");
}
else
{
strWhere.AppendFormat(" UnitCategory= '{0}' and ", category);
}
}
if (txtname != "")
{
strWhere.AppendFormat(" CadresName = '{0}' and ", txtname);
}
if (unitname != "")
{
strWhere.AppendFormat(" Unit = '{0}' and ", unitname);
}
if (key != "")
{
if (key == "15岁之前参加工作(须修改)")
{
strWhere.AppendFormat("DATEDIFF (MONTH ,convert(datetime,Birthday),convert(datetime,WorkYears))<180 and ");
}
if (key == "15岁之前入党(须修改)")
{
strWhere.AppendFormat("DATEDIFF (MONTH ,convert(datetime,Birthday),convert(datetime,PartyYears))<180 and ");
}
if (key == "25岁后参加工作(建议修改)")
{
strWhere.AppendFormat("DATEDIFF (MONTH ,convert(datetime,Birthday),convert(datetime,WorkYears))>300 and ");
}
if (key == "全部错误录入数据")
{
strWhere.AppendFormat(" "
+ "( DATEDIFF (MONTH ,convert(datetime,Birthday),convert(datetime,WorkYears))<180 or "
+ " DATEDIFF (MONTH ,convert(datetime,Birthday),convert(datetime,PartyYears))<180 or "
+ " DATEDIFF (MONTH ,convert(datetime,Birthday),convert(datetime,WorkYears))>300 ) " + " and ");
}
}
strWhere.AppendFormat(" Status='{0}' and ", "Active");
//删除多余的and
int startindex = strWhere.ToString().LastIndexOf("and");//获取最后一个and的位置
if (startindex >= 0)
{
strWhere.Remove(startindex, 3);//删除多余的and关键字
}
if (sort != "" && order != "")
{
oderby = order + " " + sort;
}
//调用分页的GetList方法
DataSet ds = cadresbasebll.GetListByPage(strWhere.ToString(), oderby, (page - 1) * pageRows + 1, page * pageRows);
ds.Tables[0].Columns.Add("Experence", typeof(string));
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
ds.Tables[0].Rows[i]["Experence"] = "<input type='button' onclick ='rowformater()' value='查看详情' style='border :0;color :blue ;background-color :white'></input>";
}
int count = cadresbasebll.GetRecordCount(strWhere.ToString());//获取条数
string strJson = ToJson.Dataset2Json(ds, count);//DataTable数据转化为Json数据
context.Response.Write(strJson);//返回给前台页面
context.Response.End();
}
第六步:前台页面调用
第七步:修改datatable转为Json的代码
public static string DataTable2Json(DataTable dt, int pid = -1)
{
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.Append("[");
for (int i = 0; i < dt.Rows.Count; i++)
{
jsonBuilder.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
int id = pid;
jsonBuilder.Append("\"");
dt.Columns[j].ColumnName = dt.Columns[j].ColumnName.ToLower();
if (dt.Columns[j].ColumnName == "Name") dt.Columns[j].ColumnName = "text";
jsonBuilder.Append(dt.Columns[j].ColumnName);
if (dt.Columns[j].ColumnName.ToLower() == "id" && id != -1)
{
jsonBuilder.Append("\":" + (id * 10 + Convert.ToInt32(dt.Rows[i][j])) + ",");
}
else
{
jsonBuilder.Append("\":\"" + dt.Rows[i][j].ToString() + "\",");
}
}
if (dt.Columns.Count > 0)
{
jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
}
jsonBuilder.Append("},");
}
if (dt.Rows.Count > 0)
{
jsonBuilder.Remove(jsonBuilder.Length - 1, 1);
}
jsonBuilder.Append("]");
return jsonBuilder.ToString();
}
第八步:B层代码
public DataSet GetListByPage(string strWhere, string orderby, int startIndex, int endIndex)
{
return dal.GetListByPage(strWhere, orderby, startIndex, endIndex);
}
第九步:D层代码
public DataSet GetListByPage(string strWhere, string orderby, int startIndex, int endIndex)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("SELECT * FROM ( ");
strSql.Append(" SELECT ROW_NUMBER() OVER (");
if (!string.IsNullOrEmpty(orderby.Trim()))
{
strSql.Append("order by T." + orderby);
}
else
{
strSql.Append("order by T.CadresID desc");
}
strSql.Append(")AS Row, T.* from V_CadresBaseInfo T ");
if (!string.IsNullOrEmpty(strWhere.Trim()))
{
strSql.Append(" WHERE " + strWhere);
}
strSql.Append(" ) TT");
strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);
return DbHelperSQL.Query(strSql.ToString());
}
最终效果图:
调试代码后期明白了原系统是把前台页面上所有的框封装成了参数,一个框一个参数,传给后台,后台进行业务组装后传给D层进行增删改查的操作,将结果再返回来。
干这一票,代码没有写多少,全是复用原有的代码,逻辑倒是搞了个差不多,把各个块一拼凑,就完事儿了!
回头想想这一路:
1.不能看到大系统就触头,系统之所以大,往往是很多东西别人都写好了,可以直接拿过来用
2.困难让我兴奋,但局限于时间由自己支配的时候