一. 單向資料繫結:
簡單來說就是ASP.NET在運行時完成了頁面的動態編譯,並解析頁面的各種伺服器端代碼,包括資料繫結文法。而資料繫結的文法雖是一些<%# %>代碼塊,在產生的程式碼中,仍然使用了伺服器端控制項以及在DataBinding事件調用DataBinder.Eval方法來完成資料的綁定工作。所有的資料繫結模板控制項都使用了這樣的機制來進行資料的單向綁定. 這種情況下我們得到的資料不能回傳給伺服器, 即無法自動完成資料的更新和提交工作.
一般單向資料繫結有下列幾種情況(以執行個體說明):
1. 綁定變數
(1) xhtml
...
<asp:Label ID="Label1" runat="server" Text="<%# Name %>" Font-Names="隸書" ForeColor="Red"></asp:Label></td>
<asp:Label ID="Label2" runat="server" Text="<%# LoginTime %>" Font-Names="隸書" ForeColor="Red"></asp:Label></td>
...
(2) .cs
public partial class _Default : System.Web.UI.Page
{
//此處申明並賦值
public string Name="admin";
public DateTime LoginTime = DateTime.Now;
protected void Page_Load(object sender, EventArgs e)
{
//必須聲明整頁綁定
Page.DataBind();
}
}
2.綁定集合
(1) xhtml
...
<td align =center >
<asp:DropDownList ID="DropDownList1" runat="server" DataSource =<%# ItemList %> >
</asp:DropDownList></td>
...
(2) .cs
public partial class _Default : System.Web.UI.Page
{
protected ArrayList ItemList = new ArrayList();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ItemList.Add("星期一:Monday");
ItemList.Add("星期二:Tuesday");
ItemList.Add("星期三:Wednesday");
ItemList.Add("星期四:Thursday");
ItemList.Add("星期五:Friday");
ItemList.Add("星期六:Saturday");
ItemList.Add("星期日:Sunday");
this.DropDownList1.DataBind();
}
}
}
3.綁定運算式
(1) xhtml
...
<td>求整數1—10的總和及平均數</td>
<td style="width: 203px"> 總和=<%# sum %></td>
<td>平均數=<%# sum/10 %> </td>
</tr>
...
(2) .cs
public partial class _Default : System.Web.UI.Page
{
protected int sum = 0;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
sum = GetSum();
Page.DataBind();
}
protected int GetSum()
{
for (int i = 0; i <= 10; i++)
{
sum += i;
}
return sum;
}
}
4.Binder 方法
(1) xhtml
...
<asp:DataList ID="DataList1" runat="server" CellPadding="4" >
<HeaderTemplate >
Binder 方法結果
</HeaderTemplate>
<ItemTemplate >
數字:<%# Container.DataItem%>
絕對值為:<%# AbsoluteValue((int)Container.DataItem) %>
</ItemTemplate>
</asp:DataList>
...
(2) .cs
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ArrayList numbers = new ArrayList();
numbers.Add(8);
numbers.Add(-8);
DataList1.DataSource = numbers;
DataList1.DataBind();
}
}
public int AbsoluteValue(int number)
{
if (number > 0)
return number;
else if (number < 0)
return -number;
else
return 0;
}
}
5. .Eval() 方法進行單向(唯讀)資料繫結
(1) xhtml
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate >
顯示商品資訊
<td width ="110" align =center >商品編號</td>
<td width ="110" align =center >商品名稱</td>
<td width ="110" align =center >商品說明</td>
<td width ="110" align =center >商品價格</td>
</HeaderTemplate>
<ItemTemplate >
<asp:Label ID ="GoodsID" Text ='<%# Eval("GoodsID") %>' runat =server></asp:Label>
<asp:Label ID ="GoodsName" Text ='<%# Eval("GoodsName") %>' runat =server></asp:Label>
<asp:Label ID ="GoodsIntroduce" Text ='<%#DataBinder.Eval(Container.DataItem,"GoodsIntroduce") %>' runat =server></asp:Label>
<asp:Label ID ="GoodsPrice" Text ='<%#Eval("GoodsPrice","${0}") %>' runat =server></asp:Label>
<asp:Image id="GoodsPhoto"
ImageUrl='<%# Eval("GoodsPhoto") %>' runat="server"/>
</ItemTemplate>
</asp:Repeater>
(2) .cs
public partial class Repeater : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//獲得資料庫連接
SqlConnection myConn = DBClass.GetConnection();
myConn.Open();
string SqlStr = "select * from tb_GoodsInfo";
SqlDataAdapter da = new SqlDataAdapter(SqlStr, myConn);
//產生DataSet對象並填充資料
DataSet ds = new DataSet();
da.Fill(ds, "GoodsInfo");
//將Repeater控制項進行資料繫結
Repeater1.DataSource = ds.Tables["GoodsInfo"].DefaultView;
Repeater1.DataBind();
}
}
public SqlConnection GetConnection()
{
string myStr = ConfigurationManager.AppSettings["ConnectionString"].ToString();
SqlConnection myConn = new SqlConnection(myStr);
return myConn;
}
}
6.將 DropDownList 控制項綁定到GridView 控制項中
(1) xhtml
asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4"
Font-Size="9pt" ForeColor="#333333" GridLines="None">
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<Columns>
<asp:BoundField DataField="BookID" HeaderText="圖書編號ID" />
<asp:BoundField DataField="BookName" HeaderText="圖書名" />
<asp:TemplateField HeaderText="銷售情況">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSource='<%# ddlbind()%>' DataValueField="SellState"
DataTextField="SellState" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="True">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
<PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
(2) .cs
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DropDownList ddl;
if (!IsPostBack)
{
string sqlstr = "select * from tb_SellBook";
SqlConnection myConn = GetConnection();
SqlDataAdapter da = new SqlDataAdapter(sqlstr, myConn);
DataSet ds = new DataSet();
myConn.Open();
da.Fill(ds,"tb_SellBook");
GridView1.DataSource = ds.Tables["tb_SellBook"].DefaultView;
GridView1.DataBind();
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
DataRowView mydrv = ds.Tables["tb_SellBook"].DefaultView[i];
if (Convert.ToString(mydrv["SellState"]).Trim() == "暢銷")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["SellState"]).Trim() == "一般")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
if (Convert.ToString(mydrv["SellState"]).Trim() == "滯銷")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 2;
}
}
myConn.Close();
}
}
public SqlConnection GetConnection()
{
string myStr = ConfigurationManager.AppSettings["ConnectionString"].ToString();
SqlConnection myConn = new SqlConnection(myStr);
return myConn;
}
public SqlDataReader ddlbind()
{
string sqlstr = "select distinct SellState from tb_SellBook";
SqlConnection myConn = GetConnection();
SqlCommand myCmd = new SqlCommand(sqlstr, myConn);
myConn.Open();
return myCmd.ExecuteReader();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
DropDownList ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
Response.Write("<Li>" + GridView1.Rows[i].Cells[1].Text + ":" + ddl.SelectedItem.Text + "<br>");
}
}
}
二. 雙向資料繫結(可寫)
在.NET 2.0中新增了雙向的資料繫結方式,主要用在GridView,DetailsView,FormView等資料容器控制項中,結合DataSourceControl就可以非常輕鬆的完成資料的更新和提交工作,而不需要我們手工去遍曆輸入控制項的值。尤其DataSource控制項的使用在很大程度上讓開發人員工作量大大減少. 雖然有很多時候它促使程式吊不願意(不用)去瞭解資料的更新和提交操作內部工作原理, 致使很多 "有志青年" 十分抵觸它. 但是我需要說的是, 如果你瞭解了它的工作原理, 運行機制, 然後再使用它是不是會大大提高我們的開發效率呢?
ASP.NET在模板中雙向繫結欄位,是通過<%# Bind() %>這樣的文法實現.如下:
<asp:DetailsDataSouce ID="DetailsDataSouce1" runat="server"> </asp:DetailsDataSouce>
<asp:DetailsView ID="detailsView" runat="server" DefaultMode="Edit" DataSourceID="DetailsDataSouce1">
<Fields>
<asp:TemplateField>
<HeaderTemplate>
姓名:
</HeaderTemplate>
<EditItemTemplate>
<asp:TextBox ID="textBox1" runat="server" Text='<%# Bind("name") %>'></asp:TextBox>
</EditItemTemplate>
<HeaderTemplate>
性別:
</HeaderTemplate>
<EditItemTemplate>
<asp:TextBox ID="textBox1" runat="server" Text='<%# Bind("gender") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>