在网上看到有很多人写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; }
}
}

asp.net下利用MVC模式实现Extjs表格增删改查的更多相关文章

  1. MVC模式的学生信息增删改查

    准备:建一个名为 userdb的数据库.建一个student表,有stuid,stuname,gender三个字段.其中stuid为主键.j加入相应的驱动包,相应的JSTL标签 先看目录结构 代码: ...

  2. MVC模式实现登录以及增删改查之登录(一)

    我在这里用的不是maven项目,用的一般的web项目,所以需要用到的架包需要自己去下载添加,在项目中,一定注意环境的配置,我用的是jre1.7 1  新建项目 2  建立好MVC的管理包,导入对应的架 ...

  3. 利用SQLite在android上实现增删改查

    利用SQLite在android上实现增删改查 方法: 一.直接利用database.execSQL()方法输入完整sql语句进行操作 这种方法适用于复杂的sql语句,比如多表查询等等 这里适合于增删 ...

  4. 利用API方式进行数据库的增删改查

    /* 将数据库的增删改查单独放进一个包 */ package com.itheima28.sqlitedemo.dao; import java.util.ArrayList; import java ...

  5. django 利用ORM对单表进行增删改查

    牛小妹上周末,一直在尝试如何把数据库的数据弄到界面上.毕竟是新手,搞不出来,文档也看不懂.不过没关系,才刚上大学.今晚我们就来解释下,要把数据搞到界面的第一步.先把数据放到库里,然后再把数据从库里拿出 ...

  6. 手把手教你ASP.NET Core:使用Entity Framework Core进行增删改查

    新建表Todo,如图 添加模型类 在"解决方案资源管理器"中,右键单击项目. 选择"添加" > "新建文件夹". 将文件夹命名为 Mo ...

  7. MVC中的Ajax与增删改查

    自入手新项目以来,一直处于加班状态,博客也有两周没更,刚刚完成项目的两个模组,稍有喘息之机,写写关于项目中 的增删改查,这算是一个老生常谈的问题了,就连基本的教材书上都有.刚看书的时候,以为 没什么可 ...

  8. MVC中的Ajax与增删改查(一)

    自入手新项目以来,一直处于加班状态,博客也有两周没更,刚刚完成项目的两个模组,稍有喘息之机,写写关于项目中 的增删改查,这算是一个老生常谈的问题了,就连基本的教材书上都有.刚看书的时候,以为 没什么可 ...

  9. Entity Framework应用:使用EF的DataBase First模式实现数据库的增删改查

    在上一篇文章中讲解了如何生成EF的DBFirst模式,接下来讲解如何使用DBFirst模式实现数据库数据的增删改查 一.新增数据 新增一个Student,代码如下: static void Add() ...

随机推荐

  1. AVOS Cloud Hackathon - SegmentFault

    AVOS Cloud Hackathon - SegmentFault AVOS Cloud Hackathon

  2. nginx日志每日定时写入Hdfs

    #!/bin/bash hadoop_home=/opt/hadoop-2.4.0 tw_nginx_log_file=/home/chiline.com.all/access_com_tw.log ...

  3. CentOS中使用shell的命令补全

    习惯debian的用户都知道shell中的自动补全功能非常实用,其中在CentOS中也可以有同样的功能. 只需要安装 bash-completion 包即可. rpm -ivh http://www. ...

  4. Android利用ViewFlipper实现屏幕切换动画效果

    1.屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面. 2.介绍ViewFilpper类 Vie ...

  5. ThinkPHP - F函数,更新配置文件

    Html代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&quo ...

  6. 10_9 java笔记

    java中所有的关键字都是小写的注意main虽然被编译器识别,但是它并不是关键字包:(名字小写) 单级包:liyi 多级包:cn.itcast path 和classpath的区别:path环境变量里 ...

  7. 64位系统/32位系统下/8位CPU的数据宽度

    不同的编译器根据不同的 64 位模型有所不同. 比如 Visual C++,从第一个支持 64 位的版本起,一直就是使用 LLP64 内存模型,也就是说,编译出的代码除了 long 和指针是 64 位 ...

  8. C++静态成员函数和静态成员变量的探索

    静态数据成员属于类,非属于类对象,所以,定义位置就有了限制. 静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员).类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以 ...

  9. excel unixtime与北京时间互转

    unixtime转北京时间,在单元格内输入:=INT((B2-70*365-19)*86400-8*3600)   *.要设置一下单元格格式为y-m-d h:m:s才会正确显示 北京时间转unixti ...

  10. POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)

    用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一 ...