•
数据绑定分为数据源和数据绑定控件两部分(①数据绑定控件通过数据源获取和修改数据②数据绑定控件通过数据源隔离数据提供者和数据使用者)
数据绑定控件→数据源→数据库
•
数据源:
SqlDataSource(连接SQL数据库): 页面禁止直连数据库
AccessDataSource(连接Access数据库): 页面禁止直连数据库
ObjectDataSource(连接类): Web开发中应用最广/易于数据库切换
LinqDataSource(连接Linq): 很少
EntityDataSource: 很少
XmlDataSource(连接XML): 处理XML数据时
SiteMapDataSource: SiteMap专用数据源
•
数据绑定控件(重要:ListView(大一统者/推荐) & Repeater):
列表数据绑定控件(DropDownList RadioButtonList CheckBoxList ListBox BulletedList)
复杂绑定控件(DataGrid GridView DetailsView FormView ListView Repeater DataList)
ObjectDataSource
ObjectDataSource: 用于将一个类(主要为强类型DataSet)作为数据源
.TypeName: 数据源类名
.DeleteMethod/.InsertM/.SelectM/.UpdateM: 删除/插入/查询/更新
.DeleteParameters/.InsertP/.SelectP/.UpdateP: 相应参数
生成ObjectDataSource: 通过界面自动生成(手写太麻烦)
Bug: ①绑定Id为Guid类型时会生成下列代码 删除即可
DataObjectTypeName=“System.Guid”
DropDownList
DropDownList控件: 显示来自于数据源的数据/两种方法
界面生成(推荐)
代码绑定(可绑定任何实现IEnumerable接口的数据)
BulletedList2.DataSource = new int[] { 1,3,5,7,9 };
BulletedList2.DataBind();
.AppendDataBoundItems(bool值): 附加选项(设置”请选择人员”项)
在数据绑定之后附加“--Please Select--” eg:
DropdownList1.DataBind();
DropdownList1.Items.Insert(0,new ListItem("--Please Select--",0));//insert能插在任何地方
DropdownList1.Items.Insert(0,"--Please Selcet--");//一种重载方式,注意必须写在刷新数据(DataBind()之后才有效)
DropdownList1.Items.Add("--please selcet--");//add只能加在末尾
DropdownList1.Items.Add(new ListItem("--please select--","All");//Add的重载,第二个参数是 string value.
DadioButtonList CheckBoxList ListBox BulletedList等雷同
Repeater
Repeater控件: 用于对绑定数据源中的数据进行遍历显示(foreach)
<ItemTemplate>模板
<ItemTemplate>主键:<%#Eval(“Id”) %>姓名: <%#Eval(“UserName”) %> 年龄: <%#Eval(“Age”) %><br /></ItemTemplate>
Repeater模板:
<ItemTemplate>
<AlternatingItemTemplate> 隔行不同显示风格
<HeaderTemplate> 头部模板
<FooterTemplate> 尾部模板
<SeparatorTemplate> 分割模板
DataBinder类: 提供对应用程序快速开发(RAD)设计器的支持以生成和分析数据绑定表达式语法
①无法继承
②在Web窗体页数据绑定语法中可以使用此类的重载静态Eval方法(返回值object/该方法提供自动类型转换/服务器响应时间较长)
.ItemDataBound事件(e.Item(RepeaterItem类的实例)): 某一项被数据绑定后但尚未呈现在页面上之前发生
获取绑定数据
DataRowView rowView = (DataRowView)e.Item.DataItem;
var personRow = (ASP.NET入门.objectDataSource..DAL.DataSetPersons.T_PersonsRow)rowView.Row;
RepeaterItem.FindControl() 获取模板中控件(模板中控件无法通过Id直接获取)
DataTable & DataView & DataSet三者关系:
DataTable 表示内存中数据的一个表
DataView 表示用于排序 筛选 搜索 编辑 导航的DataTable的可绑定数据的自定义视图(一个主要功能是允许在Windows窗体和Web窗体上进行数据绑定)
DataSet ADO.NET核心成员之一(各种数据源在内存中的映射)
.ItemCommand事件: 当单击Repeater控件中的按钮时发生
e.CommandName 命令名称(对应Button.CommandName)
e.CommandArgument 命令参数(对应Button.CommandArgument)
e.CommandSource
Template中的Button按钮: 通过传递<Button>的CommandName CommandArgument属性值获得当前绑定数据信息并进行处理(此处Button按钮响应Repeater控件的ItemCommand事件)
ListView
ListView控件: Repeater控件一般只用于展示数据 如果要增删改查则使用ListView更方便
ListView模板:
<ItemTemplate> 奇数行模板
<AlternatingTemplate> 偶数行模板
<EmptyDataTemplate>
<InsertItemTemplate> 插入行模板/<%#Bind() %>双向绑定
<EditItemTemplate> 编辑模板行/<%#Bind() %>双向绑定
<LayoutTemplate> ItemPlaceHolder
生成ListView: 一般利用界面自动生成
调整ListView: ①表头汉化②style样式③简化数据展示④
ListView中的数据校验: <Template>模板内编组
.ItemDataBound事件(e.Item(ListViewDataItem类的实例)): 某一项被数据绑定后但尚未呈现在页面上之前发生
获取绑定数据
ListViewDataItem lvDataItem = (ListViewDataItem)e.Item;
DataRowView rowView = (DataRowView)lvDataItem.DataItem;
var row = (ASP.NET入门.objectDataSource..DAL.DataSetPersons.T_PersonsRow)rowView.Row;
.ItemCreated事件: 在ListView控件中创建项时发生
①ListView新增数据行的默认值设置: 响应ListView的ItemCreated事件 当e.Item.ItemType为InsertItem的时候通过e.Item.FindControl()方法找到控件并初始化(如年龄)
.ItemInserting事件: 在请求插入操作之后 ListView控件执行插入之前发生
①插入数据初始化(Guid): 响应ListView的ItemInserting事件 e.Values为所有字段的键值对(可读可写) e.Values[“Id”]=Guid.NewGuid();
②该事件也可进行数据校验 通过e.Cancel=true来取消非法数据插入
.ItemUpdating事件: 在请求更新操作且ListView控件更新项之后发生
e.OldValues—更新前的值 e.NewValues—更新后的值
e.ItemIndex—当前更新行行号
ListView控件中的DropDownList绑定问题: 值的编程处理
①显示数据时(响应ItemCreated事件)
②插入数据时(响应ItemInserting事件)
③更新数据时(响应ItemUpdating事件)
ListView控件中的行命令按钮: ①ListView.DataKeyNames属性(主键字段/可以设置多个/与数据库”主键”无直接关系)
①长一岁
int index = ((ListViewDataItem)e.Item).DisplayIndex;
Guid id = ListView1.DataKeys[index];
if(e.CommandName == “IncAge”)
{
T_PersonsTableAdapter adapter = new T_PersonsDataAdapter();
adapter.IncAge(id);
ListView1.DataBind();
}
②ListView内置排序机制(效率低/在<LayoutTemplate>中表头放置一个”CommandArgument=排序字段” “CommandName=sort”的服务器端按钮控件即可
DataPager控件: 实现分页
①两种方式: 声明在ListView中/设置DataPager的PagedControlId为要分页的ListView(二者无嵌套关系)
②实现IPageableItemContainer接口的控件都可以使用DataPager进行分页(ASP.NET内置控件目前只有ListView实现了这个接口)
③.PageSize属性: 每页条目数
④.QueryStringField属性: DataPager默认PostBack机制 显示不到地址中因此不利于分享 设置该属性就可以实现超链接形式的分页链接
⑤<Fields>: 按钮显示风格/实现<< < …4 5 6… > >>效果
<asp:NextPreviousPagerField>
<asp:NumericPagerField>
<asp:TemplatePagerField>
ListView控件中的高效分页:
①ListView内置分页机制先从数据源取得所有数据再截取当前部分(低效率)
②SQL分页编程
步骤一: 增加强类型DataSet中两个方法: ①数据条目数 ②取N到M条数据
①QueryCount
select count(*) from T_Persons //由于数据集编辑器不支持开窗函数 第二种方法中需自行添加参数startRowIndex maximumRows(必须是这两个参数名(回调函数) 由ObjectDataSource的//startRowIndexParameterName maximumRowsParameterName确定)
②GetPagedData
select * from (select Id, Name, Age, row_number() over(order by Id) RowNum from T_Persons)t where t.RowNum>@startRowIndex and t.RowNum<=@startRowIndex + @maximumRows
步骤二: 配置ObjectDataSource
步骤三: 配置ListView
步骤四: 配置ObjectDataSource
①删除<SelectParameters>
②增加SelectMethod=“GetPagedData” SelectCountMethod=“QueryCount”
③设置EnablePaging=“true”
ListView控件中的单独页面编辑: ListView的在位编辑只适合少量字段 对于复杂数据的ListView只展示关键字符按 其他字段的编辑 插入 查看等要在单独页面中进行
FormView控件: 使用用户定义的模板显示数据源中单个记录的值
①模板: <EditItemTemplate><ItemTemplate><InsertItemTemplate>
②获取模板中控件
//响应ListView1的ItemCreated事件
If(FormView1.CurrentMode == FormViewMode.Insert)
{
ListView1.FindControl(“”);
}
③.ChangeMode(FormViewMode newMode): 模式切换
单独页面编辑步骤:
步骤一:
创建一个单独页面***.aspx 其中创建ObjectDataSource FormView类的实例
步骤二:
设置ListView的InsertPosition属性为”none” 并创建导向***.aspx的新增 编辑 查看超链接(?Id=<%#Eval(“Id”) %>&action=…)
步骤三:
强类型DataSet中增加GetDataById()方法 然后配置ObjectDataSource的select方法使用GetDataById()方法 参数传递Id参数的值 参数源”QueryString” QueryStringField:Id
步骤四:
***.aspx中根据action参数值切换FormView状态 并进行相关设置(编辑:完成后导向回ListView界面 插入:完成后导向回ListView列表界面 查看:删除操作超链接)
步骤五:
细化单独页面编辑: ①删除Id 并且Inserting中为Id赋值Guid ②插入完成 更新完成后重定向到ListUI ③DropDownList绑定 ④JQuery日期控件的绑定(服务器端绑定 浏览器端绑定两种)
问题
src=‘<%#Eval(“Path”) %>’: 对于服务器端控件 <%...%>只能单独存在(无法拼接字符串如’images/<%#Eval(“Path”) %>’)
解决方法
protected string FormatImgUrl(object url)
{
return ResolveClientUrl(“~/objectdatasource/images/” + url);
}