一:事出总有因:
1:需要来源:
最近有网友给我问了一个需求功能,大体需要功能如下:
1:有一台服务器,以WebService或WCF方式提供数据。
2:有客户端(Web或Winform),调用远程WebService或WCF的数据,然后绑定显示表格数据,关键还需要带有分页功能。
2:解决方案:
由于网友使用 CYQ.Data ,我给出了以下建议:
1:WebService 端:通过MAction,查询出表(MDataTable),再调用ToJson返回json输出。2:客户端:通过调用调用远程的方法,接收返回的json字符串,然后用MDataTable.LoadFromJson方法,加载还原为表格,然后绑定到列表控件即可。3:分页控件:http://www.cnblogs.com/cyq1162/category/259559.html
方法很简单,由于需要返回记录总数,所以可以返回“记录总数,Json“,然后接收后再分隔一下。
3:方案升级:
简单无极限,我想到了还可以再简单些的方式:
我扫了下MDataTable,由于继续自IDataReader,所以有几个属性,好像派不上用场,存在也像是个浪费。
其中一个是:RecordsAffected,意思是受影响的记录总数,通常这个值默认为-1,99.9999%用不上。
为了使使用更简单,本人进行了以下的改进:
1:把调用Select分页查询后,把记录总数赋值给MDataTalle属性RecordsAffected。2:对于ToJson方法输出,把记录总数也一并集在json中。3:MDataTable.LoadFromJson时,可以还原记录总数到RecordsAffected属性。
有了以上改进,直接返回json即可,还原时也可以从RecordsAffected拿回记录总数,绑定到分页。
二:代码示例:
花了些时间,写了一个Demo:
1:解决方案:
2:界面Html:
3:WebService的代码示例:
为了方便,这里用了文本数据库示例:
namespace MyService
{
/// <summary>
/// UsersService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class UsersService : System.Web.Services.WebService
{
[WebMethod]
public string GetTableJson(int pageIndex, int pageSize)
{
CreateRow(pageIndex);
MDataTable dt;
using (Users u = new Users())
{
int count = 0;
dt = u.Select(pageIndex, pageSize, “id>1", out count);
}
return dt.ToJson();
}
//产生表的数据
private void CreateRow(int index)
{
if (index == 1)
{
using (Users u = new Users())
{
for (int i = 0; i < 30; i++)
{
u.UserName = i.ToString();
u.CreateTime = DateTime.Now;
u.Insert();
}
}
}
}
}
//为了省事,这里采用文本数据库做为示例。
public class Users : CYQ.Data.Orm.OrmBase
{
public Users()
{
base.SetInit(this, "Users", "Txt Path={0}");
}
private int _ID;
public int ID
{
get
{
return _ID;
}
set
{
_ID = value;
}
}
private string _UserName;
public string UserName
{
get
{
return _UserName;
}
set
{
_UserName = value;
}
}
private DateTime _CreateTime;
public DateTime CreateTime
{
get
{
return _CreateTime;
}
set
{
_CreateTime = value;
}
}
}
}
4:Web界面的代码:
namespace Web
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadData();
}
}
public void LoadData()
{
MyService.UsersService us = new MyService.UsersService();
string json= us.GetTableJson(pager1.PageIndex, pager1.PageSize);
MDataTable dt = MDataTable.LoadFromJson(json);
dt.Bind(gvUsers);
pager1.Count = dt.RecordsAffected;
pager1.BindName = "LoadData";
}
}
}
最终简单的效果图: