市委组织部考核项目中需要录入原始数据,拿开发区的数据录入举例说明,见下图,需要给查询出的单位录入定量成绩和定性成绩,开始使用弹出框的形式逐条进行编辑,后来考虑如果每一条都需要弹出一次弹出框,每一条都需要一次保存的话,用户可能会不方便,后来发现了easyui中有这么一个好东西,用在这里非常合适——Cell Editing in DataGrid
查询出的结果图
为了控制提交时的行和他的限制条件我在原来的基础上加上了多选框,也就是说虽然你可以在上边随便写,随便改我都没有把他们真正的保存到数据库,而是在最后点击"保存"时才写入数据库的,而保存的条件是多选框被选择了,而且所选行的定量成绩和定性成绩都不为空。需求就这么简单,下面就是代码了,前面的查询功能在这里就不介绍了,主要介绍保存的功能
控件的使用
<table id="dg" class="easyui-datagrid" style="width: 1000px; height: 280px;"
data-options=" iconCls: 'icon-edit',
toolbar: '#tb',
rownumbers:true,
singleSelect: false,
url: 'DevelopmentRecord.ashx/ProcessRequest',
method:'get',
pagination:true,
onClickCell: onClickCell">
<thead>
<tr>
<th data-options="field:'ck',checkbox:true"></th>
<th data-options="field:'CityID',width:80,hidden:'hidden'">开发区id</th>
<th data-options="field:'DepartmentName',width:280">单位名称</th>
<th data-options="field:'QuantyOriginalData',width:150,editor:{type:'numberbox',options:{min:0}}">定量成绩</th>
<th data-options="field:'QualityOriginalData',width:150,editor:{type:'numberbox',options:{min:0}}">定性成绩</th>
</tr>
</thead>
</table>
代码解释:
开发区id字段和单位名称是从数据库中查询出来的,所以field的内容需要与数据库中表的字段对应,而开发区id字段只是为了我们写代码方便,不需要在页面显示的字段,所以我们使用hidden:'hidden'将其隐藏;定量成绩和定性成绩这两个字段是需要编辑的,且内容需要限制为最小为0的数字,使用:editor:{type:'numberbox',options:{min:0}}
js:
//保存按钮,多条数据一起提交
function saveAllData() {
if (endEditing()) {
//利用easyui控件本身的getChange获取新添加,删除,和修改的内容
if ($("#dg").datagrid('getChanges').length) {
var inserted = $("#dg").datagrid('getChanges', "inserted");
var deleted = $("#dg").datagrid('getChanges', "deleted");
var updated = $("#dg").datagrid('getChanges', "updated");
var effectRow = new Object();
if (inserted.length) {
effectRow["inserted"] = JSON.stringify(inserted);
}
if (deleted.length) {
effectRow["deleted"] = JSON.stringify(deleted);
}
if (updated.length) {
effectRow["updated"] = JSON.stringify(updated);
}
//利用easyui控件自身的getSelections方法获取多选框被选择的行
var row = $('#dg').datagrid('getSelections');
if (row.length < 1) {
alert("请至少选择一条数据!");
return;
}
//必填字段
var must;
if (row.length > 0) {
for (var i = 0; i < row.length; i++) {
mustQuantyOriginalData = row[i].QuantyOriginalData;//定量成绩
mustQualityOriginalData = row[i].QualityOriginalData;//定性成绩
//保证定量成绩和定性成绩都不为空才能继续操作!
if (mustQuantyOriginalData == "" || mustQuantyOriginalData == null || mustQualityOriginalData == "" || mustQualityOriginalData==null) {
alert("成绩不能为空,请核对!");
return;
}
}
}
//用户向一般处理程序传值
document.getElementById("test1").value = "SaveAllData";
var test = document.getElementById("test1").value; //方法
//获取年份
var yearNode = document.getElementById("year");
var checkedYearValue = yearNode.options[yearNode.selectedIndex].text.trim();//获取下拉框选择的年份
var data1 = new Object();//定义对象
var obj = new Object();//定义对象
//将内容写入对象中
obj.yearValue = checkedYearValue;
data1.array = row;
data1.test = test;
data1.obj = obj;
//将对象转换成json字符串
var jsonObject = JSON.stringify(data1);
$.post("DevelopmentRecord.ashx", { action: "post", jsonObject: "" + jsonObject + "" }, function (data) {
if (data = "true") {
alert("保存成功!");
$("#dg").datagrid('reload');//重新加载table
$("#recorded").datagrid('reload');//重新加载table
} else {
alert("保存失败,请重新操作!")
}
}, "json");
}
}
}
代码解释:
可编辑的DataGrid控件,关键就在这个editor属性上,还有它自带的几个方法,像getChanges(),getSelections()啦,当然还有很多自带的方法这个大家想了解的话可以去api中查看,在这里我就不一一介绍了,其他的就按常理做就可以了,为了将此功能完整的展示给大家看,下面我也将个个层的代码都贴了出来,如果大家有更好的框架,希望大家推荐给我,互相学习。谢啦。
根据隐藏控件的value值去一般处理程序中找对应的方法
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
JObject objget = (JObject)JsonConvert.DeserializeObject(command);
JArray array1 = objget["array"].Value<JArray>();
String test = objget["test"].Value<String>();
if (test == "SaveAllData")
{
Object Inquire = objget["obj"].Value<object>();
SaveAllData(context, array1, Inquire);
}
}
public void SaveAllData(HttpContext context, JArray objget, Object Inquire)
{
List<DevelopmentRecordEntity> list = new List<DevelopmentRecordEntity>();
for (int i = 0; i < objget.Count; i++)
{
JObject objectget = (JObject)objget[i];
JObject Inquireget = (JObject)Inquire;
//考核时间
string strCheckedYearValue = Inquireget["yearValue"].ToString().Trim();
StringBuilder strWhere1 = new StringBuilder();
//实例化一个实体
DevelopmentRecordEntity developEntity = new DevelopmentRecordEntity();
县市区单位名称
//string CityName = Inquireget["checkedCityName"].ToString().Trim();
//开发区Id
string strDevelopeId = objectget["CityID"].ToString().Trim();
//定量成绩
var QuantyOriginalData = objectget["QuantyOriginalData"].ToString().Trim();
//定性成绩
var QualityOriginalData = objectget["QualityOriginalData"].ToString().Trim();
时间戳
//PublicBLL publicBll = new PublicBLL();
//string timestamp = publicBll.GetTime();
//将需要保存到数据库中的数据传到实体中
developEntity.DevelopeId = strDevelopeId;
developEntity.QuantyOriginalData = QuantyOriginalData;
developEntity.YearTime = strCheckedYearValue;
//developEntity.Timestamp = timestamp;
developEntity.QualityOriginalData = QualityOriginalData;
//保存数据
list.Add(developEntity);
}
if (developmentBll.Add(list))
{
context.Response.Write("true");
}
else
{
context.Response.Write("false");
}
}
BLL层:
/// <summary>
/// 保存n条数据,1-25陈金荣
/// </summary>
public bool Add(List<DevelopmentRecordEntity> list)
{
return dal.Add(list);
}
DAL层:
/// <summary>
/// 添加n条数据,1-25陈金荣
/// </summary>
public bool Add(List<DevelopmentRecordEntity> list)
{
bool flag = false;
foreach (DevelopmentRecordEntity model in list)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into T_DevelopmentRecord(");
strSql.Append("DevelopeId,QuantyOriginalData,QuantyWeightData,QualityOriginalData,QualityWeightData,YearTime,Remarks,other2,other3,other4,other5)");
strSql.Append(" values (");
strSql.Append("@DevelopeId,@QuantyOriginalData,@QuantyWeightData,@QualityOriginalData,@QualityWeightData,@YearTime,@Remarks,@other2,@other3,@other4,@other5)");
SqlParameter[] parameters = {
new SqlParameter("@DevelopeId", SqlDbType.VarChar,50),
new SqlParameter("@QuantyOriginalData", SqlDbType.VarChar,50),
new SqlParameter("@QuantyWeightData", SqlDbType.VarChar,50),
new SqlParameter("@QualityOriginalData", SqlDbType.VarChar,50),
new SqlParameter("@QualityWeightData", SqlDbType.VarChar,50),
new SqlParameter("@YearTime", SqlDbType.VarChar,50),
new SqlParameter("@Remarks", SqlDbType.VarChar,500),
//new SqlParameter("@Timestamp", SqlDbType.VarChar,50),
//new SqlParameter("@other1", SqlDbType.VarChar,50),
new SqlParameter("@other2", SqlDbType.VarChar,50),
new SqlParameter("@other3", SqlDbType.VarChar,50),
new SqlParameter("@other4", SqlDbType.VarChar,50),
new SqlParameter("@other5", SqlDbType.VarChar,50)};
//parameters[0].Value = model.Id;
parameters[0].Value = model.DevelopeId;
parameters[1].Value = model.QuantyOriginalData;
parameters[2].Value = model.QuantyWeightData;
parameters[3].Value = model.QualityOriginalData;
parameters[4].Value = model.QualityWeightData;
parameters[5].Value = model.YearTime;
parameters[6].Value = model.Remarks;
//parameters[7].Value = model.Timestamp;
parameters[7].Value = model.other2;
parameters[8].Value = model.other3;
parameters[9].Value = model.other4;
parameters[10].Value = model.other5;
int rows = DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);
if (rows > 0)
{
flag = true;
}
else
{
flag = false;
}
}
return flag;
}
easyui的这个东西挺好用的,其实也不能这么说,还要看他你能不能给我们带来方便,如果不能的话我们也不必去费劲适应easyui,我想说的是其实这个小东东也挺拧的,有的时候你真的没办法去适应它,比如说大刚做的一个界面如果要使用它我感觉就会更完美,但是由于他那里边的内容不是死的,灵活性很好所以到目前为止还是没想到办法用上它。这次项目是第一次接触easyui,刚开始真心的觉得它不好,因为做什么事都要去适应它,它对JSON格式也有它自己的要求,再加上开始的时候对JSON也是一塌糊涂,所以对easyui的第一印象并不好,到后来做了几个窗体我对她的印象完全改变了,能给我们带来很大的方便,不过事物都有两面性,它也有不好的一面,兼容性不是很好。