使用ASP.NET Atlas ItemView控件显示集合中的单个数据
English Version: http://dflying.dflying.net/1/archive/114_display_one_item_in_a_collection_using_aspnet_atlas_itemview_control.html
在这个系列中,我将介绍一些Atlas Sys.UI.Data中较高级的控件,包括:
- Sys.UI.Data.ListView:使用ASP.NET Atlas ListView控件显示列表数据
- Sys.UI.Data.ItemView:使用ASP.NET Atlas ItemView控件显示集合中的单个数据
- Sys.UI.Data.DataNavigator:使用 ASP.NET Atlas PageNavigator控件实现客户端分页导航
- Sys.UI.Data.SortBehavior:使用ASP.NET Atlas SortBehavior实现客户端排序
- Sys.UI.Data.XSLTView:使用ASP.NET Atlas XSLTView控件用XSLT修饰并显示XML数据
这篇是其中的第二篇:使用ASP.NET Atlas ItemView控件显示集合中的单个数据
有时候我们需要显示给用户列表中某一项的详细信息,例如,在购物程序中的产品详细情况。ASP.NET Atlas ItemView客户端控件为您提供了对这项功能的支持,就像ASP.NET服务器端控件DetailsView一样,但Atlas ItemView控件完全在客户端运行。
ItemView类(ListView类同样,见使用ASP.NET Atlas ListView控件显示列表数据 )继承于Sys.UI.Data.DataControl基类。该基类提供了一些公共的属性,包括:
- canMoveNext:当前记录后是否有下一条记录。
- canMovePrevious:当前记录前是否有前一条记录。
- data:控件包含的数据集合。
- dataIndex:当前记录的index。
- dataItem:基于dataIndex的当前的记录。
- length:记录的条目数。
同时还包括下列方法:
- addItem:添加一条记录到当前的数据集合中。
- deleteCurrentItem:删除基于dataIndex的当前记录。
- moveNext:如果canMoveNext为true,将dataIndex加1,指向下一条记录。
- movePrevious:如果canMovePrevious为true,将dataIndex减1,指向前一条记录。
请注意所有的以上操作都仅在客户端,也就是说只修改了客户端的数据。所以如果您希望将改变提交到服务器,则需要调用DataSource的相应方法。
ItemView通过继承获得了以上的属性和方法,并且还对基类有如下扩展:
- itemTemplate:指定项目模版。Atlas可以根据这个模版渲染您的内容。
- emptyTemplate:指定无数据时的模版。当数据集合为空或者DataSource还在取得数据的过程中时,Atlas会显示这个模版。
以上是ItemView的简要介绍。让我们通过一个例子来熟悉ItemView。这个程序基于Atlas官方发布的示例程序,并适当做了一些简化。
首先暴露一个Web Service以被Atlas使用。
定义item entry类:
public class Entry
{
private string _name;
private string _description;
private int _id;
[DataObjectField(true, true)]
public int Id
{
get { return _id; }
set { _id = value; }
}
[DataObjectField(false)]
[DefaultValue("New row")]
public string Name
{
get { return _name; }
set { _name = value; }
}
[DataObjectField(false)]
[DefaultValue("")]
public string Description
{
get { return _description; }
set { _description = value; }
}
public Entry()
{
_id = -1;
}
public Entry(int id, string name, string description)
{
_id = id;
_name = name;
_description = description;
}
}
定义Web Methods。我们需要提供Select,Insert,Update以及Delete方法以期对我们的数据集合进行完整的CRUD操作。注意到我们在初始化数据时使用了System.Threading.Thread.Sleep(2000)来模拟两秒钟的网络延迟,这样可以看到emptyTemplate中的内容。
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyDataService : DataService
{
static List<Entry> _data;
static int _nextId;
static object _dataLock = new object();
private static List<Entry> Data
{
get
{
if (_data == null)
{
lock (_dataLock)
{
if (_data == null)
{
System.Threading.Thread.Sleep(2000);
_data = new List<Entry>();
_data.Add(new Entry(0, "ListView", "A control to display data using templates."));
_data.Add(new Entry(1, "Window", "A control to display dialogs."));
_data.Add(new Entry(2, "Weather", "A control to display local weather."));
_nextId = 3;
}
}
}
return _data;
}
}
[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteRow(int id)
{
foreach (Entry row in _data)
{
if (row.Id == id)
{
lock (_dataLock)
{
_data.Remove(row);
}
break;
}
}
}
[DataObjectMethod(DataObjectMethodType.Select)]
public Entry[] SelectRows()
{
return MyDataService.Data.ToArray();
}
[DataObjectMethod(DataObjectMethodType.Insert)]
public Entry InsertRow(string name, string description)
{
Entry newRow;
lock (_dataLock)
{
newRow = new Entry(_nextId++, name, description);
_data.Add(newRow);
}
return newRow;
}
[DataObjectMethod(DataObjectMethodType.Update)]
public void UpdateRow(Entry updateRow)
{
foreach (Entry row in _data)
{
if (row.Id == updateRow.Id)
{
row.Name = updateRow.Name;
row.Description = updateRow.Description;
break;
}
}
}
}
然后,在ASP.NET中加入必须的标记,控件以及ItemView的模版。我们需要添加如下五部分的脚本:
- Atlas服务器端控件ScriptManager。所有的Atlas页面中都需要包含这个控件以装载Atlas所必须的JavaScript文件。
- id为detailsView的<div>,将被Atlas用来输出渲染后的内容。
- 导航部分,用于在在客户端集合中导航,以显示集合中不同的记录。
- 命令部分,用于修改,添加,删除记录(在客户端),并且提交到服务器。
- 模版部分,用于指定相应的ItemView模版。所有的模版将被置于一个隐藏的div中,这样不会在页面上显示出来。
<atlas:ScriptManager runat="server" ID="scriptManager" />
<!-- Element for ItemView (container) -->
<div id="detailsView">
</div>
<!-- Navigators -->
<input type="button" id="previousButton" value="<" title="Go to previous row" />
<span id="rowIndexLabel"></span>
<input id="nextButton" type="button" value=">" title="Go to next row" />
|
<!-- Commands -->
<input type="button" id="addButton" value="New" title="Create a new row" />
<input type="button" id="delButton" value="Delete" title="Delete the current row" />
|
<input type="button" id="saveButton" value="Save" title="Save all pending changes" />
<input type="button" id="refreshButton" value="Refresh" title="Discard pending changes and get the latest data from the server" />
<!-- Templates -->
<div style="visibility: hidden; display: none">
<div id="detailsTemplate">
Name:
<input id="nameField" size="30" /><br />
Description:<br />
<textarea id="descriptionField" rows="4" cols="40"></textarea><br />
</div>
<div id="emptyTemplate">
Getting Data
</div>
</div>
最后需要做的是在页面上添加Atlas脚本。
下面是DataSource的脚本:
下面是ItemView的脚本。我们将绑定上面的DataSource控件作为数据源,并且将ItemView的enabled属性绑定到DataSource的isReady属性上,以期在数据源没有装载完成前禁用ItemView。同样为ItemView定义了itemTemplate和emptyTemplate。
<bindings>
<binding dataContext="dataSource" dataPath="data" property="data"/>
<binding dataContext="dataSource" dataPath="isReady" property="enabled"/>
</bindings>
<itemTemplate>
<template layoutElement="detailsTemplate">
<textBox id="nameField">
<bindings>
<binding dataPath="Name" property="text" direction="InOut"/>
</bindings>
</textBox>
<textBox id="descriptionField">
<bindings>
<binding dataPath="Description" property="text" direction="InOut"/>
</bindings>
</textBox>
</template>
</itemTemplate>
<emptyTemplate>
<template layoutElement="emptyTemplate" />
</emptyTemplate>
</itemView>
下面是导航部分的脚本。我们提供了一个label用来显示当前的记录编号(记录index加上1,使用了Atlas的Add transformer。关于Atlas transformer,您可以参考:在ASP.NET Atlas中创建自定义的Transformer )。还提供了前后移动记录的导航按钮(通过使用Atlas的InvokeMethod action调用相应的ItemView的方法)。
<bindings>
<binding dataContext="detailsView" dataPath="canMovePrevious" property="enabled"/>
</bindings>
<click>
<invokeMethod target="detailsView" method="movePrevious" />
</click>
</button>
<label id="rowIndexLabel">
<bindings>
<binding dataContext="detailsView" dataPath="dataIndex" property="text" transform="Add" />
</bindings>
</label>
<button id="nextButton">
<bindings>
<binding dataContext="detailsView" dataPath="canMoveNext" property="enabled"/>
</bindings>
<click>
<invokeMethod target="detailsView" method="moveNext" />
</click>
</button>
下面是命令部分的脚本。这里我们能够在客户端添加/删除记录,并将改变提交给服务器或者放弃提交。
<bindings>
<binding dataContext="dataSource" dataPath="isReady" property="enabled"/>
</bindings>
<click>
<invokeMethod target="detailsView" method="addItem" />
</click>
</button>
<button id="delButton">
<bindings>
<binding dataContext="dataSource" dataPath="isReady" property="enabled"/>
</bindings>
<click>
<invokeMethod target="detailsView" method="deleteCurrentItem" />
</click>
</button>
<button id="saveButton">
<bindings>
<binding dataContext="dataSource" dataPath="isDirtyAndReady" property="enabled"/>
</bindings>
<click>
<invokeMethod target="dataSource" method="save" />
</click>
</button>
<button id="refreshButton">
<bindings>
<binding dataContext="dataSource" dataPath="isReady" property="enabled"/>
</bindings>
<click>
<invokeMethod target="dataSource" method="load" />
</click>
</button>
大功告成,可以在浏览器中测试了。
装载中:
装载完成:
记录间导航:
修改并保存:
上述示例代码可以在此处下载:http://files.cnblogs.com/dflying/AtlasItemViewDemo.zip
使用ASP.NET Atlas ItemView控件显示集合中的单个数据相关推荐
- ASP.NET Atlas简单控件介绍——Sys.Component基类与Sys.UI.Control基类
作者:Dflying Chen (http://dflying.cnblogs.com/) 本系列有三篇文章: ASP.NET Atlas简单控件介绍--Sys.Component基类与Sys.UI. ...
- ASP.NET Atlas简单控件介绍——InputControl,TextBox,Button和CheckBox
作者:Dflying Chen (http://dflying.cnblogs.com/) 注:本系列文章比较基础,基本为Atlas官方文档的翻译,熟悉Atlas的朋友可以跳过. 本系列有三篇文章: ...
- asp.net findcontrol html控件,findcontrol-在ASP.NET中查找控件的更好方法
findcontrol-在ASP.NET中查找控件的更好方法 我有一个复杂的asp.net表单,在一个表单中甚至有50到60个字段,例如FindControl(),在MultiView中我有GridV ...
- asp.net image控件显示Bitmap
可以借助base64直接显示图片,避免image.imageUrl="xxx.aspx". 代码如下: Bitmap bmp = new Bitmap(200, 200);usin ...
- 构建安全的 ASP.NET 网页和控件
本页内容 本模块内容 目标 适用范围 如何使用本模块 威胁和对策 设计注意事项 输入验证 跨站点脚本 身份验证 授权 模拟 敏感数据 会话管理 参数处理 异常管理 审核和日志记录 小结 其他资源 本模 ...
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.3 【增加了使用说明】
================================ 欢迎转载,但是请注明出处.本文出自博客园 .谢谢合作! ================================ 最新版本:V ...
- 用JS验证asp.net服务端控件
可以用javascript来验证asp.net服务端的控件,不过目前只局限于验证textbox(输入框)不能为空的情况.还有一个前提条件是,提交按钮必须是html的控件,再加上一个runat=serv ...
- 创建用于 ASP.NET 的分页程序控件
Dino Esposito Wintellect 2003 年 10 月 适用于: Microsoft® ASP.NET 摘要:解决向任何 ASP.NET 控件添加分页功能的问题.还为开发复合 ...
- ASP.Net2.0 数据绑定控件的优越性在哪里?
尽管有丰富.功能强大的编程接口,ASP.NET 1.x DataGrid 控件仍需要编写大量自定义代码来处理普通操作,如分页.排序.编辑和删除数据.例如,当用户单击以保存或取消更改时,DataGrid ...
- 演练GridView控件显示目录图片
本博文,将带你学习使用GridView控件显示站点目录的图片.如果你已经学会怎样做图片缩略图:怎样应用接口来实现统一的属性,方法或函数:怎样动态加载用户控件,等等.就不必往下看了.因为此篇博文就是演练 ...
最新文章
- Cookie的生命周期
- 基于NPOI的Excel数据导入
- 怎样才算熟悉python-怎样才算python入门
- 原生JS实现图片滚动
- swing和MySQL登录注册_JavaSwing+Mysql实现简单的登录界面+用户是否存在验证
- ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(下)
- Spring JSF集成
- flink中akka的使用 以jobClient提交任务为例子
- 数据科学 IPython 笔记本 9.3 理解 Python 中的数据类型
- 使用计算机控制台方法,故障控制台使用方法
- iPhone 13或有8款配色;vivo百万年薪招工程师;特斯拉新增行车记录视频紧急情况自动保存功能|极客头条...
- SVN 使用hooks 自动更新到远程的web目录下
- PaintCode如何使用标签和画布?
- java启动脚本_java启动脚本
- CAD导出pdf的正确方法(包括导出黑白pdf)
- 黑客攻击手段揭秘(转)
- java maven 读写pdf_Java向PDF模板写入数据
- 2020年3月—— ES6
- php 前后端分离之rsa与des加密之旅
- 微端游戏启动器launcher的制作(序篇)
热门文章
- 【数字信号】基于GUI数字波束算法库【含Matlab源码 313期】
- 【手写数字识别】基于matlab知识库手写体数字识别【含Matlab源码 311期】
- 【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】
- openai-gpt_GPT-3是“人类”吗?
- 游戏行业数据类丛书_理论丛书:高维数据101
- 合并重叠数据combine_first
- linux桌面cpu,ubuntu14.04设置桌面显示网速、cpu信息等
- java-练习2:MobilePhone
- 可视化排班管理_呼叫中心外包之管理要点与数据分析对策
- python导入第三方数据库