标题: 使用ExtJS GridPanel从Web Service 获取、绑定和显示数据 [打印本页] 作者: superadmin 时间: 2008-8-21 17:01 标题: 使用ExtJS GridPanel从Web Service 获取、绑定和显示数据 本文将向大家介绍一种使用 ExtJS 的 GridPanel 组件从 ASP.NET Web Service 获取 XML 数据并进行绑定和显示的方法。
个人认为此方法过于繁琐,为了保证对现有的 Web Service 不做较大的调整,我决定还是继续让其返回 XML 格式的数据。因此在对 GridPanel 进行数据绑定时就要选用 XML 方式绑定了。也就是说,我们在绑定数据时要使用 Ext.data.XmlReader 而不是 Ext.data.JsonReader。具体的实现方法如下:
1. Web Service 部分:
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ArticleService : System.Web.Services.WebService {
// 从 start 开始 limit 行,按 sort 字段排序,排序方式为 dir(将传入 "asc" 或 "desc")
[WebMethod]
public DataSet GetArticles(int start, int limit, string sort, string dir)
{
DataSet ds = new DataSet("Article");
// 从数据库获取数据,放入 record 表
string strSql = string.Format(
"select top {0} * from Article where Id not in (select top {1} Id from Article order by {2} {3}) order by {2} {3}",
limit, start, sort, dir);
SqlDataAdapter da = new SqlDataAdapter(strSql, _strConn);
DataTable dtRecord = new DataTable("record");
lock (da)
{
da.Fill(dtRecord);
}
ds.Tables.Add(dtRecord);
// 计算总行数,放入 results 表
DataTable dtResult = new DataTable("results");
dtResult.Columns.Add("totalRecords");
DataRow dr = dtResult.NewRow();
using (SqlConnection conn = new SqlConnection(_strConn))
using (SqlCommand cmd = new SqlCommand("select count(*) from Article", conn))
{
try
{
conn.Open();
dr["totalRecords"] = (int)cmd.ExecuteScalar();
}
catch
{
// do nothing
}
}
dtResult.Rows.Add(dr);
ds.Tables.Add(dtResult);
从 Web Service 中由 GetArticles 方法返回的是 XML 数据。在将数据绑定到 Ext.data.Store 组件时应使用 Ext.data.XmlReader 而不是网上经常看到的 Ext.data.JsonReader。绑定时我们需要“告诉” XmlReader 在 XML 数据中哪些节点代表数据条目(本例为“record”),哪个节点代表数据总数(本例为“totalRecords”),以及数据的主键节点 (本例为“Id”)。您可以通过下图来理解 XmlReader 的数据绑定过程:
另外,从上图中的 XML 数据可以看出,日期(Date)的格式比较“丑陋”,如果不加修饰的话将会原样显示于客户的 GridPanel 组件中。因此在客户端显示数据之前,需要对日期数据进行一下加工。在创建 Ext.grid.ColumnModel 时为 Date 列指定 renderer(注意加粗部分):