• 数据绑定分为数据源和数据绑定控件两部分(①数据绑定控件通过数据源获取和修改数据②数据绑定控件通过数据源隔离数据提供者和数据使用者) 数据绑定控件→数据源→数据库 • 数据源: 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); }
|
请发表评论