事实上,将数据集绑定到 .NET 控件,就是将数据库的表或表中某个字段读到内存的某个结构里,比如 DataTable,然后把这个结构绑定到 .NET 控件。
如果你以前使用过 C++ Builder 或是 Delphi,那么你一定记得,绑定数据库控件与一般控件是分开的,这两种控件在不同的包中。而 .NET 控件就非常灵活,它既可以作为一般的控件使用,供用户选择或输入,比如,DropDownList控件、TextBox控件等,也可以作为数据库绑定控件。一般情况,只要设置控件相应的属性就行,如,DataSource 属性、DataBind() 方法等,你自己可以试一下,所有控件的使用方法基本都是一样的,并且,无论是 BS 程序,还是 CS 程序。
另外,将数据绑定到 .NET 控件时,这个数据的形式也是相当的灵活,它可以是 SqlDataSource 控件,ObjectDataSource 控件,DataTable 数据集,这个 DataTable 数据集既可以是从数据库中获得的,也可以是自定义的。
多参考 MSDN,里边有现成的代码,多思考,仔细体会人家的设计思路。
用数据集DataTable绑定
页面代码如下
<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>
后台代码如下
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();
}
说明
(1) 数据集绑定控件后,每次数据集发生变化,都要重新绑定,以便把变化反应出来;(2) 用DataTable或DataSet绑定本质上是一样的;
(3) BindFromDataTable()函数是生成一个五列的表TBL,并添加两条记录,绑定数据到GridView控件;
(4) GetDataFromGridView()函数是从GridView控件获得数据,并生成一个表。
用ObjectDataSource控件绑定
页面代码如下
<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>
后台代码如下
// 自定义类
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控件绑定
例一
页面代码如下
<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>
后台代码如下
(无)
说明
(1) 数据集绑定到控件有多种方式;(2) 一是用像SqlDataSource控件、AccessDataSource控件的方式绑定;
(3) 二是用更抽象的控件,如ObjectDataSource控件绑定;
(4) 三是用DataTable或DataSet数据集绑定;
(5) 这几种方式的区别是,第一种不太灵活,所以常用在小型项目中,第二种方式本人在使用第三方控件时看到过,如SmartGridView控件,第三种方式比较灵活,很常用;
(6) 本例使用的是第一种方式,所有代码都在前台页面,后台无代码,实现数据库的编辑、更新、删除。
例二
页面代码如下
<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>
后台代码如下
(无)
说明
(1) 数据集绑定到控件有多种方式;(2) 一是用像SqlDataSource控件、AccessDataSource控件进行绑定;
(3) 二是用更抽象的控件,如ObjectDataSource控件绑定;
(4) 三是用DataTable或DataSet绑定;
(5) 这几种方式的区别是,第一种不太灵活,所以常用在小型项目中,第二种方式本人在使用第三方控件时见过,如SmartGridView控件,第三种方式比较灵活,很常用;
(6) 本例使用的也是第一种方式,与前一篇的区别是,数据列是自动生成的。