ASP.NET 2.0 資料繫結
一、 目標
1. ASP.NET 資料繫結標準控制項
2.GridView控制項實現資料繫結操作
– GridView 資料格式化輸出
– GirdView 資料分頁與排序
– GirdView 顯示圖片
– GridView 模板列
– GridView 添加、修改、刪除資料
二、ASP.NET 中的資料繫結
.資料繫結的工作就是從資料來源中把資料傳到控制項上
.支援資料繫結的控制項都具有以下特性
具有一個名為DataSource的屬性
具有一個名為DataBind的方法
.要綁定一個控制項,首先需要初始化一個資料來源,然後對控制項使用DataBind方法
資料繫結流程
1.資料來源
• ASP.NET 1.1使用DataSet作為資料來源,建立一個資料來源需要使用DataAdapter串連資料庫,並通過一個DataCommand來取得查詢結果,儲存到資料來源中。
• ASP.NET 2.0提供直接拖拽的控制項來實現對資料庫的串連與資料來源配置。
在大多數情況下,我們需要對資料庫頻繁進行以下操作
.從資料庫中查詢一些資料
.從使用者那裡擷取某些輸入,更新至資料庫
.從資料庫找到某些記錄,刪除他們。
這些代碼大部分十分相似,通常我們使用粘貼複製來完成。但是這也經常導致一個問題,就是我們會忘記修改資料表或者列的名稱,或者對是否是空資料表進行判定。為了避免這樣的錯誤,使用一個封裝的資料庫連接對象應該是一個非常好的方案。
• 主要的資料來源對象有以下三個
用於訪問XML文檔XmlDataSource
用於訪問程式員自己編寫的類資料來源對象。ObjectDataSource
用於訪問所有支援Sql語句的資料庫物件,例如SqlServer.ORACLE,ACCESS等,SqlDataSource
2.支援資料繫結的標準控制項
• DropDownList
• ListBox
• CheckBoxList
• RadioButtonList
• BulletedList
三、GridView控制項
• 在ASP.NET 1.0時代,DataGrid控制項是被廣泛使用的顯示資料庫內容的控制項,只需要拖放DataGrid控制項到頁面上,設定少量的屬性,就可以對顯示資料,並進行排序,甚至可以對資料進行編輯。
• 但是即便如此,DataGrid依然有它的局限性。
• 雖然DataGird控制項有如此多的屬性,但是其中有些功能,例如資料排序,記錄分頁,修改或者刪除記錄功能依然需要編寫一些代碼,而且這些代碼出錯的可能性很大。
1.DataSource:
• DataSource控制項用於把資料從資料庫中提取出來,顯示DataSource控制項的內容,我們可以使用GridView控制項,該控制項的一個重要屬性是DataSource id,通過指定該屬性,我們來決定GridView控制項顯示那個DataSource控制項的內容
串連Sql SOURCE樣本
2.格式化輸出
• 在顯示資料之後,我們還希望資料在被輸出的時候配合某種格式。
• GridView控制項專門提供了用以調整顯示輸出模式的屬性,如果你是一個很有藝術天賦的人,你可以通過修改Back Color,Font,Fore Color等屬性修改顯示模式,或者通過Head Sytle,Row
Style,AlternatingRowStyle,FootSytle屬性來修改儲存格格式。如果你和我一樣沒有太多美
感,也沒有關係,你可以通過使用auto format屬性設定顯示模式格式化輸出
• 還可以通過Edit Columns屬性添加或刪除顯示元素,也可以修改顯示元素的顯示模式。格式化輸出
• 在元素輸出模式屬性中,可以通過使用FormatString屬性來根據顯示元素的資料類型設定顯示模式,設定方式如{0:c},c表示顯示的是金額。
• 使用SKIN格式化輸出
• 在資料繫結事件發生時,根據使用者的要求自行處理,顯示特殊的輸出效果。
Demo
• 標準的auto format
• 使用skin
• 根據使用者的要求格式化輸出(比如對庫存為0的商品突顯)
3.顯示master/detail資料
• 在資料庫中經常存在一對多的資料關係。所以使用者經常會需要根據某一個條件顯示多條資料記錄。在這個時候,就需要GridView控制項能夠和選擇控制項相結合,方便的完成任務。
• GridView控制項只需要設定屬性就可完成與選擇控制項的綁定。
Demo
• GridView與DropDownList綁定
4.分頁與排序
• 當顯示的資料量過大的時候,一頁也許顯示不下,這個時候我們需要使用一項技術。把龐大的資料分成若干資料頁面,每個頁面只顯示一定數量的資料。這種技術被稱為分頁
• 在查看資料的時候,使用者也許希望按照某列的數值對資料顯示進行排序,例如從高到低顯示考試成績,或者從低到高顯示價格。所以排序技術在資料顯示中也非常重要。
• 分頁與排序技術在ASP.NET 1.x的datagird中也可以實現,只是需要編寫一些代碼。在GridView中不用寫任何一行代碼,就可以方便的實現分頁和排序技術。
• 分頁可以通過設定Enable Paging和屬性中的paging屬性來進行配置
• 排序可以通過使用Enable Sorting和單元屬性中的sortexpression屬性來設定。
• 分頁Demo
• 排序Demo
• 分頁並排序Demo
5.顯示圖片
• 在GridView中可以很方便的在某一列顯示圖片。
• 首先添加一個ImageField屬性列,並指定該屬性列為的資料繫結對象,就可以方便的顯示圖片
• 顯示圖片列樣本
6.使用TemplateFields
• GridView允許各種不同類型的儲存格,比如我們已經示範過的BoundFileds,ImageFields。我們還可以在儲存格中輸出自己需要的HTML或者使用ASP.NET Server端的控制項
• 例如我我們希望對NorthWind中的HireDate列進行判斷,日期超過一定天數的員工,我們顯示不同的內容。
• 針對上面的需求,我們可以編寫如下函數來完成該功能。
string ComputeSeniorityLevel(TimeSpan ts)
{
int numberOfDaysOnTheJob = ts.Days;
if( numberOfDaysOnTheJob >= 0 && numberOfDaysOnTheJob <= 1000)
return "Newbie";
else if(numberOfDaysOnTheJob > 1000 && numberOfDaysOnTheJob <=4000)
return "Associate";
else if(numberOfDaysOnTheJob >= 4000 && numberOfDaysOnTheJob <=8000)
return "One of the Regulars";
else
return "An Ol' Fogey";
}
• 同時,使用<%#ComputeSeniorityLevel(DateTime.Now - CType(Eval(“HireDate”),
DateTime))%>做資料繫結
使用TemplateFields---2
• TemplateField不但可以作為HTML輸出的容器,也可以作為一個ASP.NET Server控
件的容器。
• 例如在顯示一個資料庫內容的時候需要顯示一個一對多的關係,我們希望在同一列
中顯示多列內容,就需要使用BulletedList控制項
• 在TemplateFields中使用BulletedList樣本
DataView territoryData; // this DataView will hold all of the Territories, loaded at Page_Load
protected void Page_Load(object sender, EventArgs e)
{
//Load all of the territories into a DataView from the SqlDataSource
territoryData = (DataView)territoriesDataSource.Select(DataSourceSelectArguments.Empty);
}
void employeesGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
// For each DataRow in the GridView, programmatically access the BulletedList, filter
//the DataView based on the GridView row's EmployeeID value and bind the filtered DataView
//to the BulletedList
if (e.Row.RowType = DataControlRowType.DataRow)
{
BulletedList bl = (BulletedList)e.Row.FindControl("bltTerritories");
territoryData.RowFilter = "EmployeeID = " + ((DataRowView)e.Row.DataItem)["EmployeeID"].ToString();
bl.DataSource = territoryData;
bl.DataBind();
}
}
7.顯示細節資料
• 在一對多的表關係中,我們會希望能夠通過單擊一條記錄顯示更多的資訊。或者是有表中太多列,我們之希望顯示一些基本資料和我們選擇列的全部資訊,這個時候我們需要一個Drilling-down的關聯表格。
• 例如Northwind資料庫中包括一個Order和一個Order Details表,其中Order包含
Demo
• 顯示Order和Order Details
• 在上面的例子中,如果左側的資料表格翻頁,右側的細節表格並不會改變。這樣可能會看起來有點不舒服。通過
void OrderGridView_PageIndexChanged(object sender, EventArgs e)
{
OrderGridView.SelectedIndex = -1;
}
• 對頁面變更進行如下追蹤,可以解決以上問題。
Demo
• 使用Pageindexchanged事件
8.對頁面資料求和
• 如同剛才的例子中所顯示的,我們還可能對頁面的顯示的資料進行計算,例如我們希望對所有訂單的總價進行求和,並顯示在最下面。• 通過DataBinder.Eval方法我們可以獲得DataRow中的資料,並對其求和即可。
Demo
• 頁面資料求和樣本
decimal priceTotal = 0;
int quantityTotal = 0;
void detailsGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// add the UnitPrice and QuantityTotal to the running total variables
priceTotal += Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "UnitPrice"));
quantityTotal += Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Quantity"));
}
else if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.Cells(0).Text = "Totals:";
//for the Footer, display the running totals
e.Row.Cells(1).Text = priceTotal.ToString("c");
e.Row.Cells(2).Text = quantityTotal.ToString("d");
e.Row.Cells(1).HorizontalAlign = HorizontalAlign.Right;
e.Row.Cells(2).HorizontalAlign = HorizontalAlign.Right;
e.Row.Font.Bold = True;
}
}
9.編輯、刪除資料的方法
• 通過在Sql DataSource中設定屬性,可以完成編輯、刪除操作的資料繫結
編輯、刪除資料的方法
• 嚮導第一個CheckBox被選中之後就會自動產生添加、修改、刪除資料記錄的代碼,第二
個資料CheckBox一旦被選中,就需要確保資料庫自資料庫中取出之後都沒有被更改
過。
• 同時需要注意,一旦你希望通過GridView編輯、刪除資料,那麼在Sql DataSource查詢的資料列中必須要有主鍵存在
• 在資料來源配置好只有,只需要選擇好Enable Update,Enable Deleting,即可編輯、刪除資料