`
touchinsert
  • 浏览: 1289774 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

extjs书籍管理

 
阅读更多

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="bookIndex.aspx.cs" Inherits="book_bookIndex" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<link rel="stylesheet" type="text/css" href="../ext-3.2.1/resources/css/ext-all.css" />
<script type="text/javascript" src="../ext-3.2.1/adapter/ext/ext-base-debug.js"></script>
<script type="text/javascript" src="../ext-3.2.1/ext-all-debug.js"></script>
<script language="javascript">
Ext.onReady(function(){


//主面板的创建
new Ext.Viewport({
layout:'border',
items:[{
title:'简单书籍管理',
collapsible:true,
html:'<br><center><font size=6>简单书籍管理</font></center>',
region:'north',//指定子面板所在的区域为north
height:100
},{
title:'功能菜单',
items:menu,//???????
split:true,//分割线允许拖 动
id:'menu1',//add by me
collapsible:true,
region:'west',//指定子面板所在的区域为west
width:150
},{
title:'系统说明',
contentEl:'aboutDiv',
collapsible:true,
id:'mainContent',//主面板id
region:'center'//指定子面板所在的区域为center
}]
});



//菜单栏
var root=new Ext.tree.TreeNode();//创建根节点
var node1=new Ext.tree.TreeNode({//创建书籍类型维护节点
text:'书籍类型维护',//设置节点标题
url:'bookex.ashx?action=showBookTypeList'//设置节点对应的url地址
});
var node2=new Ext.tree.TreeNode({
text:'书籍维护',//设置节点标题
url:'bookex.ashx?action=showBookList'//设置节点对应的url地址
});
root.appendChild(node1);//将节点加入到根节点中
root.appendChild(node2);
var menu=new Ext.tree.TreePanel({//创建树面板
border:false,//不显示边框
root:root,//加载根节点
applyTo:'menu1',//add by me
rootVisible:false,//不显示根节点
listeners:{
click:function(node,e){//树节点单击事件
mainPanel.load({//调用主面板的load方法加载指定页面, load( Object/String/Function config ) : Ext.Panel
url:node.attributes.url,//获取当前节点对应的url地址
callback:function(){//加载成功后回调函数
mainPanel.setTitle(node.text);//setTitle(String title, String iconCls )设置面板的标题文本,你也可以在这里指定面板的图片(透过CSS样式类)。

},
scripts:true//执行加载页面中的脚本
})
}
}
});
var mainPanel=Ext.getCmp('mainContent');//页面初始化后获取主面板的引用 getCmp 返回Ext.Component





//书籍维护界面
var bookStore=new Ext.data.Store({//Store类封装了一个客户端的Record对象的缓存, 为诸如GridPanel、ComboBox和DataView等的小部件提供了数据的入口。

autoLoad:true,//自动加载
reader:new Ext.data.JsonReader({
root: 'Data' ,
totalProperty:'Count'

},
Ext.data.Record.create([//定义记录格式

{name:'brief',mapping:'brief'},
{name:'price',mapping:'price'},
{name:'title',mapping:'title'},
{name:'author',mapping:'author'},
{name:'book_name',mapping: 'book_name'},
{name:'id',mapping:'id'} //mappping:由json取值时的字段顺

])
),
proxy:new Ext.data.HttpProxy({
url:'bookex.ashx?action=getBookList'
})
});


//创建工具栏组件
var toolbar=new Ext.Toolbar([
{text:'新增书籍',iconCls:'add',handler:showAddBook},
{text:'修改书籍',iconCls:'option',handler:showModifyBook},
{text:'删除书籍',iconCls:'remove',handler:showDeleteBook}
]);

//创建grid表格组件
var cb=new Ext.grid.CheckboxSelectionModel();//创建选择模式对象 通过checkbox选择或反选时触发选区轮换的一个制定选区模型。
var bookGrid=new Ext.grid.GridPanel({
applyTo:'grid-div',//设置表格显示的位置
height:400,
layout:'fit',
frame:true,//渲染表格面板
tbar:toolbar,//设置顶端工具栏
store:bookStore,//设置表格对应数据集
stripeRows:true,//True表示为显示行的分隔符(默认为true)。
autoScroll:true,//当数据超过表格高度时,自动显示出滚动条
viewConfig:{//viewConfig 任何Ext.grid.GridView可用的配置选项都可在这里指定。若view已指定则此项无效。
autoFill:true//自动充满表格
},
sm:cb,//设置表格的选择模式???
columns:[//自动创建列模型(ColumnModel)的数组
new Ext.grid.RowNumberer({//创建表格行号
header:'行号',
width:40
}),
cb,//在表中显示复选框
{header:'简介',width:80,dataIndex:'brief',sortable:true},
{header:'价格',width:80,dataIndex:'price',sortable:true},
{header:'类型',width:80,dataIndex:'title',sortable:true},
{header:'作者',width:80,dataIndex:'author',sortable:true},
{header:'书籍名称',width:80,dataIndex:'book_name',sortable:true},
{header:'书籍编号',width:80,dataIndex:'id',sortable:true}

]
});






//书籍新增界面
Ext.QuickTips.init();//所有基于标签的提示将开始启用
Ext.form.Field.prototype.msgTarget='side';//统一指定错误的提示方式
var bookForm=new Ext.FormPanel({
labelSeparator:':',
frame:true,
border:false,
items:[
{
xtype:'textfield',//文本区
width:200,
allowBlank:false,
blankText:'书籍名称不能为空',
name:'book_name',
fieldLabel:'书籍名称'

},
{
xtype:'textfield',//文本区
width:200,
allowBlank:false,
blankText:'书籍作者不能为空',
name:'author',
fieldLabel:'作者'
},
{
name:'title',//是设定了这个title值在增加记录和编辑记录时才有title的具体内容显示
xtype:'combo',
id:'com',
fieldLabel:'类型',
allowBlank:true,
emptyText:'不限制',
hiddenName:'type_id',
mode:'local',
displayField:'title',//显示值
valueField:'type_id',//value值
triggerAction:'all',
editable:false,
store:new Ext.data.Store({
autoLoad:true,
reader:new Ext.data.JsonReader({
root: 'Data',
totalProperty:'Count'
},
Ext.data.Record.create([//定义记录格式
{name:'detail',mapping:'detail'},
{name:'title',mapping:'title'},
{name:'type_id',mapping:'type_id'}


])
),
proxy:new Ext.data.HttpProxy({
url:'bookex.ashx?action=showBookTypeList'//
})
})





},
{
xtype:'textfield',//文本区
width:200,
name:'price',
fieldLabel:'金额'

},
{
xtype:'textarea',//多行文本区
width:200,
name:'brief',
fieldLabel:'简介'
}
,
{
xtype:'hidden',//隐藏字段,这里用于给后台传当前表单的id
name:'id'
}
],
buttons:[
{
text:'关闭',
handler:function(){
win.hide();//隐藏弹出窗口
}
},{
text:'提交',
handler: submitForm//提交表单数据 ,下面一个函数名
}
]
});

var win=new Ext.Window({//建弹出窗口
layout:'fit',
width:380,
closeAction:'hide',//hide这样使得window可通过show 的方法再显示
height:280,
resizable:false,
shadow:true,
modal:true,//模态窗口
closable:true,
bodyStyle:'padding:5 5 5 5',
animcollapse:true,
items:[bookForm]//将上面定义的bookform表单面板加入到窗口中
});


//显示新建书籍窗口
function showAddBook(){
bookForm.form.reset();//重置表单
bookForm.isAdd=true;// 设置isAdd附加属性为真
win.setTitle('新增书籍信息');
win.show();
}

//显示修改书籍窗口
function showModifyBook(){
var bookList=getBookIdList();// 函数在下方,从网上下
var num=bookList.length;
if(num>1){
Ext.MessageBox.alert('提示','每次只能修改一条信息');
}else if(num==1){
bookForm.form.reset();
bookForm.isAdd=false;
win.setTitle('修改书籍信息');
win.show();
var id=bookList[0];
loadForm(id);//函数在下方 这里的id也是后台需获取的一个参数,所以在update时要加参数id
}
}

//提交表单数据
function submitForm(){
//判断当前执行的提交操作,isAdd为true表示执行书籍新增操作
//false表示执行函数修改操作
if(bookForm.isAdd){
//新增书籍信息
bookForm.form.submit({
clientValidation:true,//客户端验证
waitMsg:'正在提交表单数据',//提示信息
waitTitle:'提示',//标题
url:'bookex.ashx?action=addBook' ,
method:'POST',
success:function(form,action){//加载成功的处理函数
win.hide();
updateBookList(action.result.id);//updateBookLits为下面的一个函数
Ext.Msg.alert('提示','新增书籍成功');
},
failure:function(form,action){//加载失败的处理函数
Ext.Msg.alert('提示','新增书籍失败');
}
});
}else{
//修改书籍信息
bookForm.form.submit({
clientValidation:true,
waitMsg:'正在提交表单数据,请稍候',
waitTitle:'提示',
url:'bookex.ashx?action=modifyBook' ,//??提交表单信息
method:'POST',
success:function(form,action){//加载成功的处理函数
win.hide();
updateBookList(action.result.id);//?函数在下面
Ext.Msg.alert('提示','修改书籍成功');
},
failure:function(form,action){//加载失败的处理函数
Ext.Msg.alert('提示','修改书籍失败');
}
})
}
}




//明细数据修改后,同步更新书籍列表信息
function updateBookList(id){
var fields=getFormFieldsObj(id);//getFormFieldsObj函数下面有定义
var index=bookStore.find('id',fields.id);//
if(index!=-1)//编辑书籍
{
var item=bookStore.getAt(index);
for(var fieldName in fields){
item.set(fieldName,fields[fieldName]);
}
bookStore.commitChanges();//commitChagnes()提交全部有变化的Record集。
}
else{
var rec=new Ext.data.Record(fields);//Ext.data.Record(fields)//参数对象数组,提供了每一个Record实例所需的字段属性定义
bookStore.add(rec);//添加书籍记录
}

}

//取得表单数据,该函数的作用是遍历表单中的所有字段,将字段中的数据封装到一个对象中,然后将该对象返回
function getFormFieldsObj(id){
var fields=bookForm.items;//取得表单中全部字段 items所有表单内元素的集合
var obj={};//创建不包含任何数据的空对象
for (var i=0;i<fields.length;i++){//循环遍历表单字段
var item=fields.itemAt(i);//获取第i个字段
var value=item.getValue();//取得字段值
if (item.getXType()=='combo'){//判断是否为组合框
var index=item.store.find('type_id',value);//find( Function fn, Object scope, String property, String/RegExp value, Number startIndex, Boolean anyMatch, Boolean caseSensitive ) : Number 由外部函数进行该Store缓存记录的筛选。Store里面的每个记录都经过这个函数内部使用。如果函数返回true的话,就引入(included)到匹配的结果集中。这里可以参看API中jsonStore,
//本例中的id是所传入Record的id 本例中的value( String/RegExp )既可以是字段开头的字符串,也可以是针对该字段的正则表达式,这里是字段开头的字符串
//返回值匹配的索引或-1
if(index!=-1){
var selItem=item.store.getAt(index);
//getAt( Number index ) : Ext.data.Record 根据指定的索引找到Record。返回值Ext.data.Record 返回匹配索引的Record,如果未找到则返回undefined
}
value=selItem.get('title');//get( String name ) : Object 根据字段返回值。
}
obj[item.name]= value;
}
if(Ext.isEmpty(obj['id'])){
obj['id']=id;//判断id字段是否为空
}


return obj;
}



//改造书籍修改界面
function loadForm(id){

bookForm.form.load({//调用表单的加载方法 //另一种加载表单的方法form.getForm().load({ url : ""})
waitMsg:'正在加载数据请稍候',//提示信息
waitTitle:'提示',
url:'bookex.ashx?action=getBookById',//请求的url地址 获取修改的那条字段
params:{id:id},
method:'POST',//之前为GET
success:function(form,action){
//Ext.Msg.alert('','数据加载成功');
},
failure:function(form,action){
Ext.Msg.alert('','数据加载失败');
}
});
}




//改造书籍删除代码
function showDeleteBook(){//显示删除书籍对话框
var bookList=getBookIdList();//

var num=bookList.length;
if(num==0)
{
return;
}
Ext.Msg.confirm('','您确定要删除所选书籍吗?',function(btnId){
if(btnId=='yes'){
deleteBooks(bookList);//deleteBooks下面
}
})
}


function deleteBooks(bookList){//删除书籍
var bookIds=bookList.join('-');//将包含书籍id的数组连接为'-'分隔的字符串
var msgTip=Ext.MessageBox.show({//显示正常删除的信息提示框
title:'提示',
width:250,
msg:'正在删除书籍请稍候'
});




Ext.Ajax.request({
url:'bookex.ashx?action=deleteBooks',
params:{bookIds:bookIds},//设置请求参数,包含书籍id的字符串将作为参数传递
method:'POST',
success:function(response,options){//请求成功后的回调函数
msgTip.hide();//隐藏信息提示框
var result=Ext.util.JSON.decode(response.responseText);//解码响应字符串为JSON对象
if(result.success)
{
//服务器端数据成功删除成功后,同步删除客户端列表中的数据

for (var i=0;i<bookList.length;i++){
var index=bookStore.find('id',bookList[i]);
if(index!=-1){
var rec=bookStore.getAt(index);
bookStore.remove(rec);//从Store中移除一Record对象,并触发remove移除事件,返回值为void
}
}
Ext.Msg.alert('','删除书籍成功');
}
else{
Ext.Msg.alert('','删除书籍失败');
}

},
failure:function(response,options){//请求失败时的回调函数
msgTip.hide();
Ext.Msg.alert('','删除书籍失败');
}
});
}



function getBookIdList(){//选择当前操作的行
var recs=bookGrid.getSelectionModel().getSelections();//getSelectionModel()返回grid的SelectionModel。
//recs 获取选中行的所有记录

var list=[];
if(recs.length==0){
Ext.Msg.alert('','请选择要进行操作的书籍');
}
else{
for(var i=0;i<recs.length;i++)
{
var rec=recs[i];
list.push(rec.get('id'))
}
}
return list;//返回当前选择行的id
};
});

</script>
<head runat="server">
<title>无标题页</title>
</head>
<body>

<div id="aboutDiv">
i am aboutDiv
<div id="grid-div">
</div>
</div>


</body>
</html>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics