在网上看到有很多人写extjs下的表格控件的增删改查,但是大多数都是直接从后台读取数据,很少有跟数据库进行交互的模式。
今天就来写一个这样的例子。欢迎大家交流指正。
首先简单介绍一下MVC模式,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。
Model(模型)
是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
通常模型对象负责在数据库中存取数据。
View(视图)
是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
通常视图是依据模型数据创建的。
Controller(控制器)
是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
下面就为大家说明代码示例:
视图部分:
前台JS部分代码:
Ext.onReady(function () {
var csm = new Ext.grid.CheckboxSelectionModel({//创建checkbox对象
handleMouseDown: new Ext.emptyFn()
});
var cum = new Ext.grid.ColumnModel([
csm, //checkbox对象
{header: "用户ID", dataIndex: "id", sortable: true
},
{ header: '用户姓名', dataIndex: 'name', sortable: true,
editor: new Ext.grid.GridEditor(
new Ext.form.TextField({ allowBlank: false }))
},
{ header: '性别', dataIndex: 'sex', sortable: true,
editor: new Ext.grid.GridEditor(
new Ext.form.TextField({ allowBlank: false }))
}
]);
; var store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({ url: 'UserData.aspx' }),
reader: new Ext.data.JsonReader({
totalProperty: 'totalCount', //json字符串中的字段,数据量大小
root: 'data'//json字符串中的字段
}, [
{ name: 'id' },
{ name: 'name' },
{ name: 'sex' }
]),
remoteSort: true
});
var Record = Ext.data.Record.create([
{ name: 'id', type: 'string' },
{ name: 'name', type: 'string' },
{ name: 'sex', type: 'string' }
]);
store.load({ params: { start: 0, limit: 5} }); //运行加载表格数据 var cumgrid = new Ext.grid.EditorGridPanel({
renderTo: 'cumGrid',
store: store,
stripeRows: true, //斑马线效果
viewConfig: {
forceFit: true,
columnsText: "显示的列",
sortAscText: "升序",
sortDescText: "降序"
},
height: 200,
width: 550,
sm: csm,
bbar: new Ext.PagingToolbar({
pageSize: 5, //每页信息条数
store: store,
autowidth: true,
autoHeight: true,
displayInfo: true,
prevText: "上一页",
nextText: "下一页",
refreshText: "刷新",
lastText: "最后页",
firstText: "第一页",
beforePageText: "当前页",
afterPageText: "共{0}页",
displayMsg: '显示第{0}条到第{1}条记录,一共{2}条',
emptyMsg: '没有记录'
}),
tbar: new Ext.Toolbar(['-', {
text: '添加一行',
handler: function () {
var win = new Ext.Window({
title: '添加用户',
layout: 'fit',
height: 300,
width: 300,
border: 0,
frame: true, //去除窗体的panel框架
plain: true,
html: '<iframe frameborder=0 width="100%" height="100%" allowtransparency="true" scrolling=auto src="addUser.htm"></iframe>'
});
win.show(); //显示窗口 }
}, '-', {
text: '删除一行',
handler: function () {
Ext.Msg.confirm('信息', '确定要删除?', function (btn) {
if (btn = 'yes') {
var id = "";
function getid() {
for (var i = 0; i < cumgrid.getSelectionModel().getSelections().length; i++) {
id += cumgrid.getSelectionModel().getSelections()[i].get("id");
id += ',';
}
};
getid(); //初始化选中行id字符串数组
Ext.Ajax.request({
url: "DelUserInfo.aspx",
method: "post",
params: { id: id },
success: function (response) {
Ext.Msg.alert("恭喜", "删除成功了!");
store.reload();
},
failure: function () {
Ext.Msg.alert("提 示", "删除失败了!");
}
})
}
});
}
}, '-', {
text: '保存',
handler: function () {
var m = store.getModifiedRecords().slice(0);
var jsonArray = [];
Ext.each(m, function (item) {
jsonArray.push(item.data); }) if (false) {//判断条件
return;
} else { // alert(Ext.encode(jsonArray)) Ext.Ajax.request({
//url: "Demo/Operator.aspx",
url: "SaveUserInfo.aspx",
method: "POST",
params: 'data=' + encodeURIComponent(Ext.encode(jsonArray)),
success: function (response, option) {
store.reload();
alert(response.responseText);
},
failure: function (response) {
store.reload();
alert(response.responseText)
Ext.Msg.alert("提示", "修改失败了!");
}
});
}
}
}, '-']),
cm: cum
});
cumgrid.render(); //刷新表格
});
表格界面如上图所示。增删改查分别通过,添加,删除,保存修改,和后台读取数据并分页实现。
业务处理部分:
UserBll.cs:
public class UserBLL
{
public UserBLL()
{
//
//TODO: 在此处添加构造函数逻辑
//
} UserDao dao = new UserDao();
JsonHelper json = new JsonHelper();
DataTable dt = new DataTable();
//获取全部数据
public string GetUserInfo()
{
dt = dao.GetAllInfo();//从数据库中读取数据
json.success = true;
foreach (DataRow dr in dt.Rows) //将读取出的数据转换成字符串
{
json.AddItem("id", dr["id"].ToString());
json.AddItem("name", dr["name"].ToString());
json.AddItem("sex", dr["sex"].ToString());
json.ItemOk();
}
string jsons = json.ToString();
return jsons;
}
//根据id获取用户数据
public UserBean getUserInfosNoState(int id)
{
return dao.getUserInfosNoState(id);
}
//分页获取数据
public string GetUserInfoPage(int start, int limit)
{
JSONHelper json = new JSONHelper();
dt = dao.GetUserInfoPaging(start, limit); //从数据库中读取数据
json.success = true;
foreach (DataRow dr in dt.Rows) //将读取出的数据转换成字符串
{
json.AddItem("id", dr["id"].ToString());
json.AddItem("name", dr["name"].ToString());
json.AddItem("sex", dr["sex"].ToString());
json.ItemOk();
}
json.totlalCount = dao.GetAllUserCount();
string jsons = "";
if (json.totlalCount > )
{
jsons = json.ToString();
}
else
{
jsons = @"{success:false}";
}
return jsons;
}
//删除用户信息
public int DelUserInfos(int id)
{
return dao.DelUserInfos(id);
}
//更新用户信息
public int SaveUserInfo(UserBean user)
{
return dao.SaveUserInfo(user);
}
//添加用户信息
public int AddUserInfo(UserBean user)
{
return dao.AddUserInfo(user);
} }
后台查询数据部分:
UserData.aspx.cs:
public string ds = string.Empty;
public UserBLL ub = new UserBLL(); protected void Page_Load(object sender, EventArgs e)
{
string starts = Request.Form["start"];//获取读取数据的范围
string limits = Request.Form["limit"];
int index = Convert.ToInt32(starts);
int length = Convert.ToInt32(limits);
ds = ub.GetUserInfoPage(index, length);
}
增加数据:
AddUserInfo.aspx.cs:
UserBLL ub = new UserBLL();
protected void Page_Load(object sender, EventArgs e)
{
AddUserInfos();
} public void AddUserInfos() //添加数据
{
//获取姓名性别
string name = Request.Form["name"];
string sex = Request.Form["sex"];
UserBean user = new UserBean();
user.Name = name;
user.Sex = sex;
int count = ub.AddUserInfo(user);
if (count > )
Response.Write(@"{success:true}");
else
Response.Write(@"{success:false}");
}
删除数据部分:
DelUserInfo.aspx.cs:
需要注意因为从前台传来的是所有改变行所有数据id的json字符串,需要进行字符串分割获取到要删除行的id
UserBLL ub = new UserBLL();
protected void Page_Load(object sender, EventArgs e)
{
DeleteRoomInfo();
}
public void DeleteRoomInfo()
{
string id = Request.Form["id"];//获取要删除用户的id字符串
if (id != null)
{
string[] ids = id.Split(',');//将每一名用户的id分割存入字符串数组
try
{
foreach (string r in ids)
{
ub.DelUserInfos(Convert.ToInt32(r));//循环删除用户信息
}
Response.Write(@"{success:true}");
}
catch (Exception)
{
Response.Write(@"{success:false}");
} }
else
{
Response.Write(@"{success:false}");
}
}
修改数据部分:
SaveUserInfo.aspx.cs:
此处需要注意,因为前台传来的是所有改变行所有数据的json字符串,需要进行分割处理,先去掉多余的字符,在根据','分割成“数据名:数据值的形式”,再循环根据:进行分割
UserBLL ub = new UserBLL();
protected void Page_Load(object sender, EventArgs e)
{
SaveRoomInfo();
}
public void SaveRoomInfo()
{
int count=;
string data = Request.Form["data"];// 对传值过来的json字符串进行处理,分解成键值对 data = RemoveChars(data,"[");
data = RemoveChars(data, "]");
data = RemoveChars(data,"\"");
data = RemoveChars(data, "}");
data = RemoveChars(data, "{");
string[] field = data.Split(',');
string[] keyvalue;
for (int i = ; i < field.Length / ; i++)
{
UserBean user = new UserBean();
for (int j = i * , k = ; k < ; j++, k++)
{
keyvalue = field[j].Split(':');//将json字符串中的数据项名和数据项值分开,分别存入user对象中
if (keyvalue[] == "id")
{
user.Id = Convert.ToInt32(keyvalue[]);
}
else if (keyvalue[] == "name")
{
user.Name = keyvalue[];
}
else if (keyvalue[] == "sex")
{
user.Sex = keyvalue[];
}
}
count = ub.SaveUserInfo(user);
}
if (count > )
{
Response.Write("{success:'true'},{data:" + field[] + "}");
}
else
{
Response.Write("{success:'false'},{data:" + field[] + "}");
} } //删除字符串中某个字符
static string RemoveChars(string str, string remove)
{
if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(remove))
{
throw new ArgumentException("....");
} StringBuilder result = new StringBuilder(str.Length); Dictionary<char, bool> dictionary = new Dictionary<char, bool>(); foreach (char ch in remove)
{
dictionary[ch] = true;
} foreach (char ch in str)
{
if (!dictionary.ContainsKey(ch))
{
result.Append(ch);
}
} return result.ToString();
}
模型部分:
UserBean.cs:
public class UserDao
{
public UserDao()
{
//
//TODO: 在此处添加构造函数逻辑
//
} private DataTable dt;
public DataTable GetAllInfo()
{
try
{
return SqlHelper.ExecuteDataTable("select * from T_user");
}
catch(Exception){throw;}
}
//分页读取数据
public DataTable GetUserInfoPaging(int start, int limit)
{
try
{
return SqlHelper.ExecuteDataTable("select top " + limit + " * from T_user where id not in(select top " + start + " id from T_user order by id asc) order by id asc");
}
catch (Exception) { throw; }
} public UserBean getUserInfosNoState(int id)
{
try
{
dt = SqlHelper.ExecuteDataTable("select * from T_user where id=" + id);
UserBean user = new UserBean();
user.Id = int.Parse(dt.Rows[]["id"].ToString());
user.Name = dt.Rows[]["name"].ToString();
user.Sex = dt.Rows[]["sex"].ToString();
return user;
}
catch (Exception){ throw; }
} //获得用户总数
public int GetAllUserCount()
{
try
{
return (int)SqlHelper.ExecuteScalar("select count(*) from T_user");
}
catch (Exception) { throw; }
} //删除用户信息
public int DelUserInfos(int id)
{
try
{
int count = SqlHelper.ExecuteNonQuery("delete T_user where id=" + id);
return count;
}
catch (Exception){ throw; }
} //保存修改
public int SaveUserInfo(UserBean user)
{
try
{
int count = SqlHelper.ExecuteNonQuery("update T_user set name='" + user.Name + "',sex='" + user.Sex + "' where id=" + user.Id);
return count;
}
catch (Exception){ throw;}
} //新增用户
public int AddUserInfo(UserBean user)
{
try
{
int count = SqlHelper.ExecuteNonQuery("insert into T_user values('" + user.Name + "','" + user.Sex + "')");
return count;
}
catch (Exception)
{ throw; }
}
}
UserBean.cs
public class UserBean
{
public UserBean()
{
//
//TODO: 在此处添加构造函数逻辑
//
} private long id;
private string sex;
private string name; public long Id
{
get { return id; }
set { id = value; }
} public string Name
{
get { return name; }
set { name = value; }
} public string Sex
{
get { return sex; }
set { sex = value; }
}
}