.Net ASP.NET 数据绑定
事实上,将数据集绑定到 .NET 控件,就是将数据库的表或表中某个字段读到内存的某个结构里,比如 DataTable,然后把这个结构绑定到 .NET 控件。
如果你以前使用过 C++ Builder 或是 Delphi,那么你一定记得,绑定数据库控件与一般控件是分开的,这两种控件在不同的包中。而 .NET 控件就非常灵活,它既可以作为一般的控件使用,供用户选择或输入,比如,DropDownList控件、TextBox控件等,也可以作为数据库绑定控件。一般情况,只要设置控件相应的属性就行,如,DataSource 属性、DataBind() 方法等,你自己可以试一下,所有控件的使用方法基本都是一样的,并且,无论是 BS 程序,还是 CS 程序。
另外,将数据绑定到 .NET 控件时,这个数据的形式也是相当的灵活,它可以是 SqlDataSource 控件,ObjectDataSource 控件,DataTable 数据集,这个 DataTable 数据集既可以是从数据库中获得的,也可以是自定义的。
多参考 MSDN,里边有现成的代码,多思考,仔细体会人家的设计思路。
用数据集DataTable绑定
<%@ Page Language="C#" %> <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.OracleClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script runat="server"> protected void BindFromDataTable() { DataTable dt = new DataTable("TBL"); dt.Columns.Add("ID01"); dt.Columns.Add("ID02"); dt.Columns.Add("ID03"); dt.Columns.Add("ID04"); dt.Columns.Add("STATUS"); dt.Rows.Add(new object[] { 100, "AAA", 100, "20081114", "1" }); dt.Rows.Add(new object[] { 101, "BBB", 101, "20081113", "0" }); dt.AcceptChanges(); GridView1.DataSource = dt; GridView1.DataBind(); } protected DataTable GetDataFromGridView() { DataTable dt = new DataTable("TBL"); dt.Columns.Add("ID01"); dt.Columns.Add("ID02"); dt.Columns.Add("ID03"); dt.Columns.Add("ID04"); dt.Columns.Add("STATUS"); for (int i = 0; i < GridView1.Rows.Count; i++) { GridViewRow gdv = GridView1.Rows[i]; DataRow row = dt.NewRow(); row["ID01"] = ((TextBox)gdv.FindControl("TextBox1")).Text.Trim().ToString(); row["ID02"] = ((TextBox)gdv.FindControl("TextBox2")).Text.Trim().ToString(); row["ID03"] = ((TextBox)gdv.FindControl("TextBox3")).Text.Trim().ToString(); row["ID04"] = ((TextBox)gdv.FindControl("TextBox4")).Text.Trim().ToString(); row["STATUS"] = ((DropDownList)gdv.FindControl("DropDownList1")).SelectedValue; dt.Rows.Add(row); } return dt; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindFromDataTable(); } } protected void Button1_Click(object sender, EventArgs e) { DataTable dt = GetDataFromGridView(); DataRow row = dt.NewRow(); row["STATUS"] = "1"; dt.Rows.Add(row); GridView1.DataSource = dt; GridView1.DataBind(); } protected void Button2_Click(object sender, EventArgs e) { string connStr = "Data Source=ora9; uid=scott; pwd=tiger; unicode=true"; string SqlStr = @"SELECT id01, id02, id03, id04, STATUS FROM TBL"; System.Data.OracleClient.OracleConnection conn = new System.Data.OracleClient.OracleConnection(connStr); System.Data.OracleClient.OracleDataAdapter da = new System.Data.OracleClient.OracleDataAdapter(); da.SelectCommand = new System.Data.OracleClient.OracleCommand(SqlStr, conn); System.Data.OracleClient.OracleCommandBuilder bld = new System.Data.OracleClient.OracleCommandBuilder(da); conn.Open(); DataTable dt = new DataTable(); da.Fill(dt); dt.Clear(); dt = GetDataFromGridView(); da.Update(dt); conn.Close(); } </script> </head> <body> <form id="form1" runat="server"> <asp:Button ID="Button1" runat="server" Text="添加空行" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="保存所有" OnClick="Button2_Click" /> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width="403px"> <Columns> <asp:TemplateField HeaderText="ID01"> <ItemTemplate> <asp:TextBox ID="TextBox1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ID01")%>'> </asp:TextBox> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="ID02"> <ItemTemplate> <asp:TextBox ID="TextBox2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ID02")%>'> </asp:TextBox> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="ID03"> <ItemTemplate> <asp:TextBox ID="TextBox3" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ID03")%>'> </asp:TextBox> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="ID04"> <ItemTemplate> <asp:TextBox ID="TextBox4" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ID04")%>'> </asp:TextBox> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="STATUS"> <ItemTemplate> <asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# DataBinder.Eval(Container.DataItem, "STATUS")%>'> <asp:ListItem Value="1">有效</asp:ListItem> <asp:ListItem Value="0">无效</asp:ListItem> </asp:DropDownList> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </form> </body> </html>
说明
(1) 数据集绑定控件后,每次数据集发生变化,都要重新绑定,以便把变化反应出来;
(2) 用DataTable或DataSet绑定本质上是一样的;
(3) BindFromDataTable()函数是生成一个五列的表TBL,并添加两条记录,绑定数据到GridView控件;
(4) GetDataFromGridView()函数是从GridView控件获得数据,并生成一个表。
用ObjectDataSource控件绑定
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" AutoGenerateColumns="true" DataKeyNames="EMPNO"> </asp:GridView> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetEmp" TypeName="OraEmp"></asp:ObjectDataSource> </form> </body> </html>
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.OracleClient; using System.ComponentModel; public class OraEmp { public OraEmp() { } [DataObjectMethod(DataObjectMethodType.Select, true)] public DataTable GetEmp() { string connStr = "Data Source=ora9; uid=scott; pwd=tiger; unicode=true"; string sqlStr = "SELECT * FROM EMP"; OracleDataAdapter da = new OracleDataAdapter(sqlStr, connStr); DataTable dt = new DataTable(); da.Fill(dt); return dt; } }
说明
(1) 本例使用ObjectDataSource控件进行绑定,这个控件比SqlDataSource控件更加抽象;
(2) 首先自定义一个类OraEmp,添加public DataTable GetEmp()方法,注意返回类型为DataTable;
(3) 另外在类OraEmp中,为了使用ObjectDataSource,需要添加[DataObjectMethod(DataObjectMethodType.Select, true)]语句,此语句需要System.ComponentModel命名控件;
(4) 最后设置ObjectDataSource控件的SelectMethod="GetEmp"和TypeName="OraEmp"属性。
用SqlDataSource控件绑定
例一
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="username" DataSourceID="SqlDataSource1" PageSize="3"> <Columns> <asp:BoundField DataField="username" HeaderText="用户名" SortExpression="username" ReadOnly="true" /> <asp:BoundField DataField="userpwd" HeaderText="密码" SortExpression="userpwd" /> <asp:CommandField ShowEditButton="True" /> <asp:CommandField ShowDeleteButton="True" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=ora9;User ID=scott;Password=tiger;Persist Security Info=True" ProviderName="System.Data.OracleClient" SelectCommand="SELECT USERNAME, USERPWD FROM USERS" UpdateCommand="UPDATE USERS SET USERPWD =:userpwd where USERNAME = :username" DeleteCommand="DELETE FROM USERS where USERNAME =:username"> <UpdateParameters> <asp:ControlParameter ControlID="GridView1" DefaultValue="username" Name="username" PropertyName="SelectedValue" /> <asp:ControlParameter ControlID="GridView1" DefaultValue="userpwd" Name="userpwd" PropertyName="SelectedValue" /> </UpdateParameters> <DeleteParameters> <asp:ControlParameter ControlID="GridView1" DefaultValue="" Name="username" PropertyName="SelectedValue" /> </DeleteParameters> </asp:SqlDataSource> </form> </body> </html>
说明
(1) 数据集绑定到控件有多种方式;
(2) 一是用像SqlDataSource控件、AccessDataSource控件的方式绑定;
(3) 二是用更抽象的控件,如ObjectDataSource控件绑定;
(4) 三是用DataTable或DataSet数据集绑定;
(5) 这几种方式的区别是,第一种不太灵活,所以常用在小型项目中,第二种方式本人在使用第三方控件时看到过,如SmartGridView控件,第三种方式比较灵活,很常用;
(6) 本例使用的是第一种方式,所有代码都在前台页面,后台无代码,实现数据库的编辑、更新、删除。
例二
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" PageSize="3" AutoGenerateColumns="true" DataKeyNames="username" DataSourceID="SqlDataSource1" AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" AutoGenerateSelectButton="True"> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=ora9;User ID=scott;Password=tiger;Persist Security Info=True" ProviderName="System.Data.OracleClient" SelectCommand="SELECT USERNAME, USERPWD FROM USERS" UpdateCommand="UPDATE USERS SET USERPWD =:userpwd where USERNAME = :username" DeleteCommand="DELETE FROM USERS where USERNAME =:username"> <UpdateParameters> <asp:ControlParameter ControlID="GridView1" DefaultValue="username" Name="username" PropertyName="SelectedValue" /> <asp:ControlParameter ControlID="GridView1" DefaultValue="userpwd" Name="userpwd" PropertyName="SelectedValue" /> </UpdateParameters> <DeleteParameters> <asp:ControlParameter ControlID="GridView1" DefaultValue="" Name="username" PropertyName="SelectedValue" /> </DeleteParameters> </asp:SqlDataSource> </form> </body> </html>
说明
(1) 数据集绑定到控件有多种方式;
(2) 一是用像SqlDataSource控件、AccessDataSource控件进行绑定;
(3) 二是用更抽象的控件,如ObjectDataSource控件绑定;
(4) 三是用DataTable或DataSet绑定;
(5) 这几种方式的区别是,第一种不太灵活,所以常用在小型项目中,第二种方式本人在使用第三方控件时见过,如SmartGridView控件,第三种方式比较灵活,很常用;
(6) 本例使用的也是第一种方式,与前一篇的区别是,数据列是自动生成的。