`
yesjavame
  • 浏览: 697027 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

《Ext JS高级程序设计》节选: 一个结合DataWrite和RowEditor的Grid示例(2)

阅读更多

在定义中,需要监听 beforeedit 事件,其作用是判断当前编辑状态是增加新记录还是编辑原有记录,如果是增加新记录,则 cid 字段的输入框需要处于允许编辑状态。否则, cid 字段的输入框需要处于不允许编辑状态。因为当新增一个记录时, Sotre 记录集中的每个记录的关键字使用的是 id 的值,而不是 cid 的值,虽然在新增操作成功后,会根据服务器端返回的记录修改这个关键字,但是,当再次编辑该记录并修改其 cid 值时,并不会再更新记录集中该记录的关键字,因而当你第 3 次编辑该记录时,在服务器端将找不到该记录,从而引发错误。这就是使用两个 id 的弊端。因而,要在这里禁止在编辑原有记录时修改 cid 值。

接着定义 cid 字段的 TextField ,代码如下:

var ideditor=new Ext.form.TextField({

allowBlank: false,maskRe:/[0-9]/,regex:/^(\d{3})*$/, regexText:" 请输入正确的编号 "

});

定义中,参数 maskRe 限制了输入框只能输入数字。参数 regex 限制了输入的数字的个数必须为 3 的倍数,而参数 regexText 则是验证 regex 时输出的错误信息。

最后定义 GridPanel ,代码如下:

var grid = new Ext.grid.GridPanel({

renderTo: 'grid1',

frame: true,

title: ' 一个结合 DataWrite RowEditor Grid 的示例 ',

autoScroll: true,

width:600,

height: 500,

store: store,

plugins: [editor],

columns : [

{header: " 编号 ", width: 100, sortable: true, dataIndex: 'cid',

editor: ideditor

},

{header: " 名称 ", width: 250, sortable: true, dataIndex: 'title',

editor: new Ext.form.TextField({

allowBlank: false

}

)},

{header: " 描述 ", width: 300, sortable: true, dataIndex: 'desc', editor: new Ext.form.TextField()}

],

tbar: [{

text: ' 增加 ',

handler: function(){

var u = new store.recordType({

cid : '',

title: '',

desc : ''

});

editor.stopEditing();

store.insert(0, u);

editor.startEditing(0);

}

}, {

text: ' 删除 ',

handler: function(){

var rec = grid.getSelectionModel().getSelected();

if (!rec) {

return false;

}

grid.store.remove(rec);

}

}],

viewConfig: {

forceFit: true

}

});

GridPanel 中,增加按钮用来在 Store 中创建一个新记录,然后激活 RowEditor ,进入编辑状态。删除按钮则获取选择记录,并从 Store 中删除该记录。

现在要完成服务器端代码。

VS 2008 中,创建一个名称为“ Grid.ashx ”的一般处理程序,然后添加以下引用:

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

using ExtShop;

using System.Linq;

接着修改 processRequest 方法,其代码如下:

public void ProcessRequest (HttpContext context) {

string act = context.Request["act"] ?? "";

string output = "";

switch (act)

{

case "list":

output = List(context.Request);

break;

case "create":

output = Create(context.Request);

break;

case "update":

output = Update(context.Request);

break;

case "del":

output = Del(context.Request);

break;

default:

output = "{success:false,msg:' 错误的访问类型。 '}";

break;

}

context.Response.ContentType="text/javascript";

context.Response.Write(output);

}

代码将根据提交 act 参数执行对应的方法。

首先完成 List 方法,其代码如下:

private string List(HttpRequest request)

{

ExtShopDataContext dc = new ExtShopDataContext();

return new JObject(

new JProperty("success", true),

new JProperty("total", dc.T_Categories.Count()),

new JProperty("msg", ""),

new JProperty("rows", new JArray(

from m in dc.T_Categories

select new JObject(

new JProperty("id", m.CategoryID),

new JProperty("cid", m.CategoryID),

new JProperty("title",m.Titel),

new JProperty("desc",m.Description)

)

))

).ToString();

}

因为不考虑分页问题,所以直接使用 JSON to LINQ 输入结果就可以了,要注意的就是,需要输出 2 CategoryID 值。

接着完成 Create 方法,其代码如下:

private string Create(HttpRequest request)

{

string rows = request["rows"] ?? "";

if (rows.Length > 0)

{

JObject r = JObject.Parse(rows);

string id = (string)r["cid"] ?? "";

string title = (string)r["title"] ?? "";

string desc = (string)r["desc"] ?? "";

if (id.Length > 0 & title.Length > 0)

{

try

{

ExtShopDataContext dc = new ExtShopDataContext();

var q = dc.T_Categories.SingleOrDefault(m => m.CategoryID == id);

if (q == null)

{

T_Categories rec = new T_Categories();

rec.CategoryID = id;

rec.Titel = title;

rec.Description = desc;

dc.T_Categories.InsertOnSubmit(rec);

dc.SubmitChanges();

return new JObject(

new JProperty("success", true),

new JProperty("total", 0),

new JProperty("msg", rows),

new JProperty("rows", new JArray(

new JObject(

new JProperty("id", id),

new JProperty("cid", id),

new JProperty("title", title),

new JProperty("desc", desc)

)

))

).ToString();

}

else

{

return new JObject(

new JProperty("success", false),

new JProperty("msg", " 编号“ "+id+" ”已存在。 ")

).ToString();

}

}

catch (Exception e)

{

return new JObject(

new JProperty("success", false),

new JProperty("msg", e.Message)

).ToString();

}

}

else

{

return new JObject(

new JProperty("success", false),

new JProperty("msg", " 错误的提交数据。 ")

).ToString();

}

}

else

{

return new JObject(

new JProperty("success", false),

new JProperty("msg"," 错误的提交数据。 ")

).ToString();

}

}

因为提交的参数是“ rows ”(该参数由 Store 定义的参数 root 的值决定),且值为 JSON 格式的字符串,因而最简单的方式是先将字符串转换为 JSON 对象,然后再处理。转换后将值分别保存到 id title desc 三个变量里。

保存成功一定要按 JsonStore 定义的格式返回数据,而且要返回新增的记录。如果是自动生成的 id ,需要获取并返回给 Store

接着要完成 Update 方法,代码如下:

private string Update(HttpRequest request)

{

string id = request["id"] ?? "";

string rows = request["rows"] ?? "";

if (rows.Length > 0)

{

JObject r = JObject.Parse(rows);

string cid = (string)r["cid"] ?? "";

string title = (string)r["title"] ?? "";

string desc = (string)r["desc"] ?? "";

if (title.Length <= 0)

{

return new JObject(

new JProperty("success", false),

new JProperty("total", 1),

new JProperty("msg", " 请输入名称。 "),

new JProperty("rows", new JArray(

new JObject(

new JProperty("id", id),

new JProperty("cid", id),

new JProperty("title", title),

new JProperty("desc", desc)

)

))

).ToString();

}

try

{

ExtShopDataContext dc = new ExtShopDataContext();

var q = dc.T_Categories.SingleOrDefault(m => m.CategoryID.ToLower() == id.ToLower());

if (q != null)

{

q.Titel = title;

q.Description = desc;

dc.SubmitChanges();

return new JObject(

new JProperty("success", true),

new JProperty("total", 1),

new JProperty("msg", ""),

new JProperty("rows", new JArray(

new JObject(

new JProperty("id", id),

new JProperty("cid", id),

new JProperty("title", title),

new JProperty("desc", desc)

)

))

).ToString();

}

else

{

return new JObject(

new JProperty("success", false),

new JProperty("msg", " 编号“ "+id+" ”不存在或已被删除。 "),

new JProperty("rows", new JArray(

new JObject(

new JProperty("id", id),

new JProperty("cid", id),

new JProperty("title", title),

new JProperty("desc", desc)

)

))

).ToString();

}

}

catch (Exception e)

{

return new JObject(

new JProperty("success", false),

new JProperty("msg", e.Message),

new JProperty("rows", new JArray(

new JObject(

new JProperty("id", id),

new JProperty("cid", id),

new JProperty("title", title),

new JProperty("desc", desc)

)

))

).ToString();

}

}

else

{

return new JObject(

new JProperty("success", false),

new JProperty("msg"," 错误的提交数据。 ")

).ToString();

}

}

Update 方法中,无论是返回错误信息还是成功信息,都要以 Store 中定义好的 JSON 格式返回,而且必须返回更新的记录,不然 Store 在确认记录时,会认为该条记录不存在而删除该记录,然后向服务器提交删除该记录的请求。关于这一点,在已存在数据的情况下进行调试时一定要小心,不然会误删数据。

Update 方法中还要注意,要更新记录的 id 会通过参数 id 提交,“ rows ”里提交的是更新的数据。

最后完成的是 Del 方法,其代码如下:

private string Del(HttpRequest request)

{

string id= request["rows"] ?? "";

try

{

id = id.Replace("\"", "");

ExtShopDataContext dc = new ExtShopDataContext();

var q = dc.T_Categories.SingleOrDefault(m=>m.CategoryID.ToLower()==id.ToLower());

if (q != null)

{

id = q.CategoryID;

dc.T_Categories.DeleteOnSubmit(q);

dc.SubmitChanges();

}

return new JObject(

; c

分享到:
评论

相关推荐

    Ext+JS高级程序设计.rar

    8.3.1 一个结合DataWrite和RowEditor的Grid示例 238 8.3.2 在CRUD操作中restful的设置以及使用Ext.Direct的问题 247 8.4 ListView控件 248 8.5 本章小结 251 第四部分 Ext 扩展和Ext插件 第9章 Ext 扩展 254 9.1 ...

    datawrite2021-1-12(V1.3)安装包.rar

    标题中的"datawrite2021-1-12(V1.3)"指的是一个名为DataWrite的软件,它的版本号为V1.3,日期为2021年1月12日。这个软件是一个安装包,通常包含了运行该程序所需的所有文件,包括执行文件、库文件、配置文件等。"....

    data_read_write.rar_DATAWRITE软件

    1. `ChatRoom.aps`:这是一个Visual Studio的工程文件,它存储了项目的设置和配置信息,如编译选项、链接器设置等,用于构建和运行ChatRoom应用程序。 2. `ChatRoom.clw`:这是Visual C++的类库文件,包含了项目中...

    C8051_C2接口说明

    了解并掌握C2接口的工作原理及其与闪存编程相关的寄存器和命令,对于开发基于这些单片机的应用程序至关重要。本文档提供了实现这一功能所需的理论基础和实践指导,帮助开发者更好地理解和利用这一强大的工具。

    320240LCD液晶程序

    本文将介绍320240LCD液晶程序的详细知识点,涵盖LCD的读写寄存器、初始化、显示的示例程序。 LCD的读写寄存器 在LCD中,有多个寄存器用于存储和读取数据。这些寄存器可以分为两类:控制寄存器和数据寄存器。控制...

    串口通讯测试程序.rar

    "datawrite"程序可能是一个独立的工具,用于生成特定格式的数据,然后通过VB程序的MSComm控件发送出去。在VB程序中,我们可以通过调用`Output`属性的方法,将"datawrite"程序生成的数据写入串口,如`MSComm1.Output ...

    Delphi网络通信协议分析与应用实现

    1. 客户端设计:在Delphi中,你可以使用TIdClient组件创建一个网络客户端,设置其Host、Port等属性连接到远程服务器,然后利用DataRead和DataWrite事件处理数据的发送和接收。 2. 服务器端设计:TIdServer组件用于...

    msp430单片机与lcd1602显示模块的程序

    在本例中,单片机与LCD1602的连接主要涉及P4端口的某些引脚,用于数据传输,而P5端口的一个引脚用于控制指令的写入。 **初始化LCD1602:** 在`Init_lcd()`函数中,我们看到对LCD的初始化步骤。首先,通过设置P4DIR...

    LCD320*240初始化代码

    通常会设置从屏幕的第一行第一列开始,一直到最后一行最后一列结束。 10. **开启显示:** ```c // 打开显示 LCD_CmdWrite(0x01); LCD_DataWrite(0x80); ``` 最后一步是开启LCD的显示功能,至此,初始化过程...

    MCU与LCD时序控制的基本方法

    2. 数据写函数(LCD_DataWrite):用于将一个字节的显示数据写入到 LCD 的显示缓冲 RAM 中。 3. 数据读函数(LCD_DataRead):用于从 LCD 的显示缓冲 RAM 中读取一个字节的显示数据。 在编写这些函数时,我们需要...

    FPGA PGL22G实现MDIO读写数据【Verilog HDL驱动】.zip

    MDIO接口是通信协议中的一个重要部分,特别是在以太网和串行外设接口(SPI)中,用于配置和监控网络设备的PHY(物理层)芯片。它通常包括两个信号线:MDI和MDC(Management Data Clock),通过这些线,微控制器可以...

    DAC.rar_TMS320F2812DA输出

    TMS320F2812内部集成了一个高速、高精度的DA转换器,能够将数字量转换为相应的模拟电压,这一功能对于需要输出模拟信号的应用至关重要。DA转换器的工作原理是:将输入的二进制数字序列转换为对应的电压值,通常采用R...

    有单片机控制TFT显示一个汉字“马”

    汉字的显示不同于英文字符,因为每个汉字都是由复杂的笔画构成的,因此需要使用特定的字模来表示每一个汉字。字模是指用来存储和表示汉字或图形的点阵数据,通常用二维数组的形式表示。例如,在本例中给出的`Zk_...

    采集软件数据库字典及流程1

    在电力系统自动化监控领域,电表数据采集是一项关键任务。本文将详细阐述基于数据库的电表数据采集软件的相关知识点,包括数据库设计、表结构以及数据采集流程。 首先,我们来看数据库中的主要表及其作用: 1. `...

    数据库管理习题库.pdf

    另外,“raiserror”是一个在遇到错误时能够将错误信息反馈给调用程序的T-SQL语句。 12. SQL Server中的DML(数据操纵语言): “INSERTED, DELETED”与“DELETED, ADDED”和“UPDATED, INSERTED”等词汇表明了在...

    NC_matlab_matlab二进制_二进制文件_二进制文件读写matlab_

    % 创建一个100个元素的随机数组 fid = fopen('output.bin', 'w'); % 打开文件,'w'表示写模式 fwrite(fid, data, 'double'); % 将数据写入文件 fclose(fid); % 关闭文件 ``` ### 三、`fread()`函数——读取二进制...

    MCU如何根据LCD的时序来写底层驱动

    在嵌入式系统开发中,液晶显示屏(LCD)作为人机交互的重要界面之一,其驱动程序的设计至关重要。为了确保LCD能够正常工作,必须根据LCD的时序特性正确编写底层驱动程序。本文将详细介绍如何根据LCD时序图来设计MCU...

    MCU如何根据LCD时序图来写底层驱动

    一般来说,LCD 模块的控制都是通过 MCU 对 LCD 模块的内部寄存器、显存进行...在此我们设计了三个基本的时序控制程序,分别是: 写寄存器函数(LCD_RegWrite) 数据写函数(LCD_DataWrite) 数据读函数(LCD_DataRead)

    IC芯片的时序实现

    最后,在EP信号线上产生一个上升沿,触发LCD模块将数据总线上的数据写入。 编程实现上述操作时,主要的函数包括: - `LCD_RegWrite`:用于写入控制寄存器。该函数中,首先将A0置为低电平,表示对寄存器的操作。...

Global site tag (gtag.js) - Google Analytics