【原】提高篇:第十七篇,ext2.2打造全新功能grid系列--添加记录篇

添加记录篇里实现在分页栏里添加一个按钮,当点该按钮后弹出一个添加窗体,正确输入数据并提交成功后,窗体并不关闭(可以自己定义),但窗体下面的grid列表会自动增加刚刚添加的数据,视觉效果非常理想.

首先看看效果图.在这个效果图里面不仅仅设置了添加按钮,而且还添加了一个刷新按钮

在上面的效果图里面的分页栏里可以看见,已经将按钮添加到分页栏里面,Ext2.2以前的版本只能够将按钮添加到工具栏,当然也不是说一定不可以,如果你愿意找麻烦,你就自己扩展Ext2.2以前的版本也是能够实现的.

现在当我们点刷新按钮时,页面就能够重新加载数据库的数据,你可以在服务器端加断点测试下

在刷新按钮旁边的就是添加按钮,当点这个按钮后,就弹出一个窗体用来添加数据,看看下面的效果图就可以明白

上面这个效果图就是在点添加按钮后弹出的添加窗体,在没有关闭该窗体之前不能够对下面的列表再进行操作,如果你喜欢非模式窗口,你可以在Ext.Window组件里面更改modal:true,这个属性,可以设置为false再测试下.

这个窗体的添加事件以及获取数据的方式包括在增加数据后动态刷新列表的方式都已经写出来,并且加了详细的注释,列表数据显示的后台代码包括数据表都和上一篇完全一样,只是这里没有在后台实现具体添加的代码,这和正常的asp.net开发没有区别,你只要正确的返回json数据就可以了,在提高篇的前几篇了已经详述了如果连接后台数据库以及如何返回json数据的方式.

下面只是把客户端的实现完整的贴出来供大家参考.

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

<!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">
<head runat="server">
    <title>无标题页</title>
    <link rel="Stylesheet" type="text/css" href="ExtJS/resources/css/ext-all.css" />
    <link rel="Stylesheet" type="text/css" href="ExtJS/resources/css/xtheme-green.css" />
    <script type="text/javascript" src="ExtJS/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="ExtJS/ext-all.js"></script>
    <script type="text/javascript" src="ExtJS/ext-lang-zh_CN.js"></script>
    <style type="text/css">
    .panel_icon { background-image:url(images/first.gif)}
    .center_icon { background-image:url(images/house.png)}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <script type="text/javascript">   
    function ready()
    {
        //添加下面这句,有助于当鼠标放在Ext自带的图标上时能够显示提示的功能
        Ext.QuickTips.init();
       
        var url = "jsonGrid.aspx?Param=select";
        var sm = new Ext.grid.CheckboxSelectionModel();
       
        var cm = new Ext.grid.ColumnModel
        ([       
            sm,new Ext.grid.RowNumberer({header:"编号",width:50}),
            {header:"编号",dataIndex:"ID",width:10,hidden:true},
            {header:"标题",dataIndex:"TypeCName",width:100,editor:new Ext.form.TextField()},
            {header:"英文名称",dataIndex:"TypeEName",width:100,editor:new Ext.form.TextField()},
            {header:"状态",dataIndex:"DelFlag",width:100,renderer:function(value){if(value==false) {return "显示";} else {return "隐藏";}}},
            {header:"添加日期",dataIndex:"AddDate",width:100,renderer:Ext.util.Format.dateRenderer('Y年m月d日')}
        ]);
        cm.defaultSortable = true;
        var fields =
            [
                {name:"ID"},
                {name:"TypeCName"},
                {name:"TypeEName"},
                {name:"DelFlag"},
                {name:"AddDate"}
           ];
        var store = new Ext.data.Store
        ({
            proxy:new Ext.data.HttpProxy({url:url}),
            reader:new Ext.data.JsonReader({totalProperty:"totalPorperty",root:"root",fields:fields})
        });
        store.load({params:{start:0,limit:15}});
       
        var pagingBar = new Ext.PagingToolbar
        ({
            displayInfo:true,
            emptyMsg:"没有数据显示",
            displayMsg:"显示从{0}条数据到{1}条数据,共{2}条数据",
            store:store,
            pageSize:15,
            items:
            [
                ' ',
                {
                    enableToggle: true,
                    text: '刷新',
                    cls: 'x-btn-text-icon details',icon:"images/plugin.gif",
                    toggleHandler: function(btn, pressed)
                    {
                        //动态加重新载数据列表
                        Ext.getCmp("MenuGridPanel").store.reload();
                    }
                },
                '-',
                {
                    enableToggle: true,//TypeTable实体类 ID PID TypeEName TypeCName DelFlag AddDate
                    text: '添加',
                    cls: 'x-btn-text-icon details',icon:"images/plugin.gif",
                    toggleHandler: function(btn, pressed)
                    {
                        var win = new Ext.Window
                        ({
                             title:"添加记录窗口",
                             width:257,
                             height:200,
                             layout:'form',
                             modal:true,
                             resizable:false,
                             iconCls :"center_icon",
                             items:
                             [
                                 {
                                    xtype:"form",
                                    height:200,
                                    labelPad : 0,// 标签与字段录入框之间的空白
                                    bodyStyle : 'padding-top:3px',
                                    frame : true,
                                    defaultType : 'textfield',
                                    labelAlign : 'right',
                                    labelWidth : 55,
                                    defaults : // 容器中组件默认统一配置选项
                                    {
                                        allowBlank : false,width : 150// 字段宽度                           
                                    },
                                    items :
                                    [
                                         {fieldLabel:"标题",id:"TypeCName",maxLength:50},
                                         {fieldLabel:"英文名称",id:"TypeEName",maxLength:50},
                                         {xtype:"datefield",fieldLabel:"添加日期",id:"AddDate",renderer:Ext.util.Format.dateRenderer('Y年m月d日 h:m:s')},
                                         {fieldLabel:"状态",id:"DelFlag",maxLength:4}
                                    ]
                                 }
                             ],
                             buttons:
                             [
                                 {
                                    xtype:"button",text:"确定提交",cls:"x-btn-text-icon",icon:"images/add.gif",
                                    handler:function()
                                    {
                                        //这里获取添加表单的数据
                                        var typeCName = Ext.getCmp("TypeCName").getValue();
                                        var typeEName = Ext.getCmp("TypeEName").getValue();
                                        var addDate = Ext.getCmp("AddDate").getValue();
                                        var delFlag = Ext.getCmp("DelFlag").getValue();
                                        //同时可以对上面获取的数据添加验证
                                        Ext.Ajax.request
                                        ({
                                           
http://www.cnblogs.com/mogen_yin/admin/%22jsonGrid.aspx?Param=add",//添加 url 具体在哪个页面实现添加功能
                                            params:{ParamName:"good",TypeCNameParam:typeCName},//客户端页面向服务器断传递数据,前面是参数名称,后面是参数值,多个参数用逗号分隔开
                                            success:function(respose,option)
                                            {
                                                //如果在服务器端正确处理了数据并且返回了正确的值得就执行该函数的语句
                                                //将服务器端正确返回的json字符串转换横Ext对象,然后就能够使用
                                                var result = Ext.util.JSON.decode(respose.responseText);
                                                //当确定添加成功后再执行下面的语句,动态加载数据列表
                                                Ext.getCmp("MenuGridPanel").store.reload();
                                            },
                                            failure:function()
                                            {
                                                //如果在服务器端处理数据发生了异常,就执行该函数的语句
                                            }
                                        });
                                    }
                                 },
                                 {
                                    xtype:"button",text:"关闭退出",cls:"x-btn-text-icon",icon:"images/delete.gif",
                                    handler:function()
                                    {
                                        win.destroy();
                                    }
                                 }
                             ],
                             buttonAlign:"center"
                        });
                        win.show();
                    }
                                  
                }, ' ' 
            ]  
        });
        var grid = new Ext.grid.GridPanel
        ({
            id:"MenuGridPanel",
            renderTo:document.body,
            layout:"fit",
            frame:true,
            border:true,
            width:700,
            height:450,
            autoScroll:true, 
            store:store,
            sm:sm,
            cm:cm,
            viewConfig:{forceFit: true},
            title:'<img style="height:auto; width:auto;" src="images/first.gif" /> Ext2.2全新功能版系列之--添加记录',
            bbar:pagingBar
        });
    }
    </script>   
    <script type="text/javascript">
    Ext.onReady(ready);
    </script>
    </div>
    </form>
</body>
</html>

标签: grid, gridPanel
posted @ 2008-10-28 16:40 殷良胜 阅读(5152) 评论(17) 编辑 收藏

 回复 引用 查看   
#1楼[楼主]2008-10-31 12:55 | 殷良胜      
欢迎访问Ext小组: http://space.cnblogs.com/group/ext
 回复 引用   
#2楼2008-11-30 10:52 | HAC——[未注册用户]
楼主,我用EditorGridPanel,想实现用鼠标双击任意一个单元格,然后用对话框弹出这个当前单元格的值,可是我用getdataIndex,老在3万多行那报错,说
this.cfg{...}.dataIndex为空域。。郁闷死我了,整了一天也没出来,求助楼主

我是这么写的,grid里的数据是静态的数组,响应函数是:

function(grid,rowIndex,columnIndex,e)
{
var a = grid.getStore().getAt(rowIndex);
var name = grid.getColumnModel().getdataIndex(columnIndex);//到这就出错了
var data = a[name];
}
dataIndex在getColumnModel定义,楼主救我啊

 回复 引用 查看   
#3楼[楼主]2008-12-01 08:31 | 殷良胜      
@HAC——
有源代码吗
发给我看看


 回复 引用   
#4楼2008-12-01 09:38 | HAC--[未注册用户]
var sm1 = new Ext.grid.CheckboxSelectionModel();

var cm = new Ext.grid.ColumnModel([
// new Ext.grid.RowNumberer(),//自动行号
sm1,//添加的地方

{header:'编号',dataIndex:'id',editor:new Ext.form.TextField},
{header:'性别',dataIndex:'sex',editor:new Ext.form.TextField},
{header:'名称',dataIndex:'name'},
{header:'描述',dataIndex:'descn',editor:new Ext.form.TextField}
]);
cm.defaultSortable = true;
var data = [
['1','male','name1','descn1'],
['2','male','name1','descn2'],
['3','male','name3','descn3'],
['4','male','name4','descn4'],
['5','male','name5','descn5']
];
// ArrayReader
var ds = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, [
{name: 'id'},
{name: 'sex'},
{name: 'name'},
{name: 'descn'}
])
});
ds.load();
var grid = new Ext.grid.EditorGridPanel({
id:"grid",
el: 'grid1',
store:ds,
sm:sm1,
cm:cm,
loadMask:true,
stripeRows:true,
//clicksToEdit:1,
height:300,
width:800
});
grid.render();
function grid_click(grid,rowIndex, columnIndex, e)
{
var record = grid.getStore().getAt(rowIndex); //Get the Record

var fieldName = grid.getColumnModel().getDataIndex(columnIndex); //Get field name


var data = record.get(fieldName);


Ext.MessageBox.alert('show','当前选中的数据是'+data);



}

 回复 引用   
#5楼2008-12-01 11:03 | HAC--[未注册用户]
楼主,搞出来了,呵呵,好像是因为我给的列模式不对,所以才出这问题的。
 回复 引用 查看   
#6楼[楼主]2008-12-01 11:28 | 殷良胜      
@HAC--
你的列模式是对的
三万多条数据你竟然不分页,佩服(不过我只调试了10000行数据)
我结合你的需求写了一个例子
分别对100行数据 1000行数据 10000行数据做了测试
发现
10000行以上不但显示数据很慢
而且弹出窗口也很慢
下面的例子是在你的基础上修改了下
提高篇:第三十二篇,ext2.2打造全新功能grid系列--使用EditorGridPanel篇

 回复 引用   
#7楼2009-05-12 09:07 | 刘liu[未注册用户]
圣歌 ext怎样删除整个gridPanel
 回复 引用   
#8楼2009-05-25 09:19 | 刘liu[未注册用户]
怎么那么多教程 可就是偏偏没有多行添加多行删除的例子呢
DateTime.Parse("AddDate"),怎么始终也不对呀,胜哥帮忙看看呀,日期数据怎么也添加不上呀
我的邮箱413862113@qq.com
 回复 引用 查看   
#11楼[楼主]2009-08-19 23:41 | 殷良胜      
引用刘liu:圣歌 ext怎样删除整个gridPanel

destroy() 此方法即可删除整个gridPanel

 回复 引用 查看   
#12楼[楼主]2009-08-19 23:43 | 殷良胜      
引用刘liu:怎么那么多教程 可就是偏偏没有多行添加多行删除的例子呢

多行删除是有的哦 批量删除难道不是多行删除吗

 回复 引用 查看   
#13楼[楼主]2009-08-19 23:45 | 殷良胜      
引用急,紧急求助!:DateTime.Parse("AddDate"),怎么始终也不对呀,胜哥帮忙看看呀,日期数据怎么也添加不上呀

你的问题也写得清楚点呀 我哪有闲时间去猜呢

//这里获取添加表单的数据
var typeCName = Ext.getCmp("TypeCName").getValue();
var typeEName = Ext.getCmp("TypeEName").getValue();
var addDate = Ext.getCmp("AddDateB").getValue();
var delFlag = Ext.getCmp("DelFlag").getValue();

//同时可以对上面获取的数据添加验证
Ext.Ajax.request
({
url: "jsonGrid.aspx?Param=add", //添加 url 具体在哪个页面实现添加功能
params: { TypeCNameParam: typeCName, TypeENameParam: typeEName, AddDateParam: addDate, DelFlagParam: delFlag },
后台
string typeCName = Convert.ToString(Request["TypeCNameParam"]);
string typeEName = Convert.ToString(Request["TypeENameParam"]);
DateTime.Parse("AddDate"),
Boolean delFlag = Convert.ToBoolean(Request["DelFlagParam"]);

SqlParameter[] prams = { new SqlParameter("@typeCName",SqlDbType.NVarChar,50),
new SqlParameter("@typeEName",SqlDbType.NVarChar,50),
new SqlParameter("@addDate",SqlDbType.DateTime),
new SqlParameter("@delFlag",SqlDbType.Bit)};
prams[0].Value = typeCName;
prams[1].Value = typeEName;
prams[2].Value = addDate;
prams[3].Value = delFlag;

string textSql = "Insert Into typetable (typeCName,typeEName,addDate,delFlag) Values ('" + typeCName + "','" + typeEName + "','" + addDate + "','" + delFlag + "')";
DateTime.Parse("AddDate"),怎么始终也不对呀,胜哥帮忙看看呀,日期数据怎么也添加不上呀

 回复 引用   
#15楼2009-08-26 19:42 | 飞来吧[未注册用户]
殷老师:
var addDate = Ext.getCmp("AddDate").getValue();
获得的日期不对呀,怎么回事?

 回复 引用 查看   
#16楼[楼主]2009-08-27 18:38 | 殷良胜      
@飞来吧
这句话是什么意思呀?哪里不对?

 回复 引用 查看   
#17楼2010-06-02 16:39 | shasha      
请问,如何将让弹出窗口window在grid居中,而不是整个页面呢?或者将window直接加载在gridpanel中?期待您的回答