ASP.NET 数据绑定

事实上,将数据集绑定到 .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) 本例使用的也是第一种方式,与前一篇的区别是,数据列是自动生成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值