在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
数据绑定控件简介
数据绑定分为:数据源 和 数据绑定控件 两部分,数据绑定控件通过数据源来获得数据,通过数据源来
ObjectDataSource
ObjectDataSource 用来将一个类做为数据源,TypeName属性为数据源类的全名, 手工编写ObjectDataSource太麻烦,使用界面来完成,将ObjectDataSource拖放到界面上,在右上角选择
GridView控件
选择 ---- 处理事件 RowCommand RowDataBound RowCreated DataBound ------上面是常用的 PageIndexChanging PageIndexChanged SelectedIndexChanging SelectedIndexChanged Sorting Sorted RowDeleting RowDeleted RowEditing RowCancelingEdit RowUpdating RowUpdated ------- 批量更新 ------- protected void btnUp_Click(object sender, EventArgs e) { var da = new NewsDataSetTableAdapters.categoryTableAdapter(); foreach (GridViewRow row in this.GridView1.Rows) { if (row.RowType == DataControlRowType.DataRow) { CheckBox ck = row.FindControl("ckSel") as CheckBox; if (ck.Checked) { var cateID = this.GridView1.DataKeys[row.RowIndex].Value; var cateName = (row.FindControl("txtName") as TextBox).Text; da.Update(cateName, int.Parse(cateID.ToString())); } } } } ------- 批量删除 ------- var cateID = this.GridView1.DataKeys[row.RowIndex].Value; da.Delete(int.Parse(cateID.ToString()));
Repeate控件
Repeate(foreach)用于对绑定数据源中的数据进行遍历显示,每条数据以什么格式是 //新建方法 protected string FormatImgURL(object url) //因为Eval()返回值是 object,所以用此类型 { return ResolveClientUrl("~/images/+url"); } //调用 <%#FormatImgURL(Eval("PicPath"))%> Repeate 其它模板 1.<AlternatingItemTemplate> 设置隔行的不同显示风格,设置后,奇数行用<ItemTemplate>模板,偶数行用<AlternatingItemTemplate>模板 <AlternatingItemTemplate> <asp:TextBox BackColor="Red" ID="TextBox2" Text='<%#Eval("Name")%>' runat = "server" /> </AlternatingItemTemplate> 设置隔行变色是为了防止数据太多看串行
如下: <asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1"> <HeaderTemplate><div style="width:200px;">会员管理系统<br /></div></HeaderTemplate> <ItemTemplate>主键:<%#Eval("Id") %>姓名:<%#Eval("username") %> <br /></ItemTemplate> <AlternatingItemTemplate><div style="color:Red">主键:<%#Eval("Id") %>姓名:<%#Eval("username") %> <br /></div></AlternatingItemTemplate> <FooterTemplate><div style="width:200px;">作者:小高</div></FooterTemplate> <SeparatorTemplate><hr width="200" align="left"/></SeparatorTemplate> </asp:Repeater> ItemDataBound 事件 如果要在ItemDataBound 事件中对ItemTemplate模板中的控件做处理,则必须使用runat=server的控件
案例:将年龄大于30的行的颜色变成红色,大于40更改背景颜色
//ItemDataBound事件 DataRowView rowView = (DataRowView)e.Item.DataItem; //得到这行的值 var userRow = (TestObject.DataSetUser.T_User)rowView.Row; //转换成强类型DataSet if (userRow.Age > 30) //当年龄大于 30 { TextBox txtAge = (TextBox)e.Item.FindControl("txtAge"); //获得模板中的控件 txtAge.BackColor = Color.Red; //设置背景颜色 } if (userRow.Age > 40) //当年龄大于40 { HtmlGenericControl spnRow = (HtmlGenericControl)e.Item.FindControl("spanRow"); //获得整行Span的ID spanRow.Attributes["class"] = "warning"; //设定定义好的样式 }
ItemCommand(行处理命令)
在 DataList 中生成事件时激发,当用户点击按钮后激发 案例: 涨一岁,给被点击的行的年龄增加1
//Repeater控件设置 <ItemTemplate>姓名:<%#Eval("username") %> 年龄:'<%#Eval("age") %>' <asp:Button runat="server" Text="加一岁" CommandName="inc" CommandArgument='<%#Eval("id") %>' /><br /></ItemTemplate> //增加一个SQL更新语句,名为 IncAgeById() // update T_Person set age=age+1 where id=@id //ItemCommand事件设置 protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "inc") { int id = int.Parse(e.CommandArgument.ToString()); //获得当前行的ID值 T_personTableAdapter adapter = new T_personTableAdapter(); //创建 adapter adapter.IncAgeById(id); //使用自定义SQL进行更新,按当前ID来加一 this.Repeater1.DataBind(); //数据再次绑定,实现网页与数据库同步 } } 案例2:人员管理程序,增加[禁用]当前行按钮,点击[禁用]将状态设置为 禁用 ,显示为红色,禁用后 1.先增加两个SQL语句,用于更改当前用户的状态 2.Repeater配置 <HeaderTemplate><table><tr class="head"><td>用户</td><td>状态</td><td>操作</td></tr></HeaderTemplate> <ItemTemplate><tr > <td><%#Eval("UserName") %></td><td><%#Eval("Status") %></td> <td><asp:Button runat="server" ID="Enabled" Text="启用" OnClientClick="return confirm('你确认启用该用户?')" CommandName="Enabled" CommandArgument='<%#Eval("Id") %>' /><asp:Button runat="server" ID="Disable" Text="禁用" OnClientClick="return confirm('你确认禁用该用户?')" CommandName="Disabled" CommandArgument='<%#Eval("Id") %>' /> </td></tr></ItemTemplate> <FooterTemplate></table></FooterTemplate> 3.增加一个CSS样式 <style type="text/css"> .disableRow{ background-color:Red;} </style> 4.ItemDataBound事件 //对于Header等则不处理,必须要判断AlternatingItem,因为默认是加入这个的 if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { DataRowView rowView = (DataRowView)e.Item.DataItem; //将当前对象转换成 DataRowView var userRow = (人员管理.DAL.DataSetT_User.T_UserRow)rowView.Row; //获得当前行成员 if (userRow.Status == "禁用") //如果状态是禁用,则设置它的一些样式 { HtmlTableRow trRow = (HtmlTableRow)e.Item.FindControl("trRow"); //获得trRow的控件 trRow.Attributes["class"] = "disableRow"; //增加一个calss属性 Button btnenable = (Button)e.Item.FindControl("Enabled"); //获得Enabled控件 Button btndisable = (Button)e.Item.FindControl("Disable"); btnenable.Visible = true; //将btnenable设置为显示 btndisable.Visible = false; //将btndisable设置为不显示 } else if(userRow.Status == "启用") { HtmlTableRow trRow = (HtmlTableRow)e.Item.FindControl("trRow"); trRow.Attributes["class"] = ""; //设置无样式 Button btnenable = (Button)e.Item.FindControl("Enabled"); Button btndisable = (Button)e.Item.FindControl("Disable"); btnenable.Visible = false; //与上面相反 btndisable.Visible = true; } else //为了程序的严整性 { throw new Exception("状态有误!"); //抛出异常 } 5.ItemCommand事件 if (e.CommandName == "Enabled") //如果CommandName为 Enable { int id =int.Parse(e.CommandArgument.ToString()); //获得CommandArgument值 T_UserTableAdapter adpter = new T_UserTableAdapter(); //new 一个adpter adpter.EnableById(id); //使用自定义SQL方法怎么数据修改 Repeater1.DataBind(); //再次绑定数据 } else if(e.CommandName == "Disabled") //同上相反 { int id = int.Parse(e.CommandArgument.ToString()); T_UserTableAdapter adapter = new T_UserTableAdapter(); adapter.DisableById(id); Repeater1.DataBind(); }
ListView 控件
Repeater一般只用来展示数据,如果要增删改查则用ListView更方便,使用向导(强类型数据) 在ListView中有些是用 <%#bind() %> 进行数据双向绑定的,更新就是这样实现的 在ListView中使用ItemDataBound为每行数据进行处理 ListViewDataItem lvDataItem = (ListViewDataItem)e.Item; DataRowView rowView = (DataRowView)lvDataItem.DataItem; 3.在FindControl的时候注意AlternatingItemTemplate的问题,将它的id与ItemTemplate的ID一样 案例:将状态为"禁用"的数据背景改色 先将 ItemTemplate 与 AlternatingItemTemplate 的<tr>的ID设置为一样,否则会有问题 if (e.Item.ItemType == ListViewItemType.DataItem) { ListViewDataItem lvDataItem = (ListViewDataItem)e.Item; //必须先转换,调试可得 DataRowView rowView = (DataRowView)lvDataItem.DataItem; var userRow = (TEST.DAL.DataSetTEST.T_UserRow)rowView.Row; if (userRow.Status == "禁用") //检测状态是否为 "禁用" { HtmlTableRow trRow = (HtmlTableRow)e.Item.FindControl("trRow"); //取得控件ID trRow.Attributes["class"] = "disabled"; //设置样式 } } 在ListView中可以使用Validator 验证控件,只要将Validator放入相应的模板中,将Validator手动 新增数据行的默认值:响应ListView的ItemCreated事件(第一行在页面上的创建都会触发该事件) 如:给年龄设默认值:ItemCreated事件 if (e.Item.ItemType == ListViewItemType.InsertItem)//判断是否为InsertItem类型 { TextBox AgeBox = (TextBox)e.Item.FindControl("AgeTextBox"); //获取年龄控件 AgeBox.Text = "20"; //设置插入的默认值 } 插入数据的初始化: 注意和"新增数据行"不同,插入数据的初始化是在用户点击"插入"之后执行,如果 如:用程序给ID值设置Guid,如果用户名为xgao,将不给插入 e.Values["id"]=Guid.NewGuid(); //新建一个 Guid 传给当前id字段 if (e.Values["UserName"].ToString() == "xgao") //判断用户名 { e.Cancel = true; //取消数据插入 } 更新之前的处理:就像数据插入前可以在ItemInserting事件中处理一样,可以在ItemUpdating事件中 如:更新的用户名长度不能为 9 个以上
if (Convert.ToInt32(e.NewValues["UserName"].ToString().Length) > 9) //当长度大于9时 { Response.Write("<script>alert('用户长度不能大于9!')</script>"); e.Cancel = true; //取消数据插入 } ListView 行命令按钮 ListView的行按钮和Repeater一样,不同的是取当前行数据的方式, 排序:将LayouTemplate中的表头用 案例:涨一岁 按钮 1.自定义SQL方法(年龄加1的方法) 2.在ItemTemplate 最后加入 <asp:Button runat="server" ID="INC" CommandName="IncAge" Text="加一岁" /> 3.在ListView1的 ItemCommand 事件写如下代码 int num = ((ListViewDataItem)e.Item).DisplayIndex; //取得前行号 int id = (int)ListView1.DataKeys[num].Value; //取当前操作行的主键值 if (e.CommandName == "IncAge") //判断当前控件的CommandName是否为IncAge { T_personTableAdapter adpater = new T_personTableAdapter(); adpater.IncAgeById(id); //利用自定义SQL语句进行 年龄加1 ListView1.DataBind(); //数据绑定 }
DropDownList控件
ListView中是无法像TextBox等控件那样将DropDownList的选中值绑定到数据的字段,必须编程处理 如:人员的性别(男,女,保密),三个值固定定在DropDownList中 1. 在显示数据的时候DropDownList显示数据的值,在ItemTemplate中加入DropDownList,设定Enabled="false" //DropDownList 显示时用 ItemCreated 事件 DropDownList ddlStatus = (DropDownList)e.Item.FindControl("ddlStatus"); if (ddlStatus != null) //如果没有找到ddlStatus ,就认识不是EditTemplete { ListViewDataItem lvData = (ListViewDataItem)e.Item; DataRowView rowView = (DataRowView)lvData.DataItem; if (rowView != null) //如果取到的话 { var userRow = (TEST.DAL.DataSetTEST2.T_UserRow)rowView.Row; ddlStatus.SelectedValue = } } //DropDownList 插入时用 ItemInserting 事件 DropDownList ddlStatus = (DropDownList)e.Item.FindControl("defalutStatus"); e.Values["Status"] = ddlStatus.SelectedValue; //e.Values[] 赋值操作 //DropDownList 更新时用 ItemUpdating 事件 DropDownList ddlStatus = (DropDownList)ListView1.Items[e.ItemIndex].FindControl("ddlStatus"); e.NewValues["Status"] = ddlStatus.SelectedValue; //e.NewValues[] 更新数据后赋值操作
DataPager 分页控件
ListView搭配DataPager控件实现分页,有两种使用方式,一种是将DataPager声明到ListView中 高效率分页 ListView默认的分页是先从数据源取得所有数据,然后再截取当前页面的部分,在数据量非常大的情况 案例:取得第11到20的数据(条数从0开始)的方法,使用子查询用行号进行两次处理 select * from (SELECT Id, UserName row_number()over(order by id)rownum FROM T_User)t where t.rownum>10 and t.rownum<=20 在强类型DataSet中增加取得所胡数据条数的方法QueryCount,增加取得指定行数范围数据的方法GetPageData select * from (select id,name Row_Number()over(order by id)rownum from T_User)t where t.rownum>@startRowIndex and t.rownum<=@startRowIndex+@maximumRows 由于数据集编辑器不支持(不会自动生成一些东西)Row_Number(),所以创建完成后需要手动在GetPagedData ObjectDataSource中EnablePaging属性设置为true,SelectCountMethod设置为QueryCount,SelectMethod 单独页面编辑 istView的在位编辑只适合字段较少,比较简单的场合,复杂数据的编辑,插入,查看等要在单独页面中 在edit.aspx中做如下判断: if (!IsPostBack) { string action = Request["action"]; if (action == "edit") //是否为 edit 模式 { FormView1.ChangeMode(FormViewMode.Edit); //更改模式为 编辑模式 } else if (action == "new") //是否为 new 模式 { FormView1.ChangeMode(FormViewMode.Insert); //更改模式为 编辑模式 } else if (action == "view") //是否为 view 模式 { FormView1.ChangeMode(FormViewMode.ReadOnly); //更改模式为 编辑模式 } }
|
请发表评论