資料綁定伺服器控件
資料綁定概述和文法
綁定到簡單屬性
綁定到集合和清單
綁定表達式或方法
DataBinder.Eval()
本節小結
資料綁定概述和文法
ASP.NET 引入了新的聲明性資料綁定文法。這種非常靈活的文法允許開發人員不僅可以綁定到資料源,而且可以綁定到簡單屬性、集合、表達式甚至是從方法調用傳回的結果。下表顯示了新文法的一些示例。
簡單屬性 | Customer: <%# custID %> |
集合 | Orders: <asp:ListBox id="List1" datasource='<%# myArray %>' runat="server"> |
表達式 | Contact: <%# ( customer.First Name + " " + customer.LastName ) %> |
方法結果 | Outstanding Balance: <%# GetBalance(custID) %> |
盡管該文法看起來與 ASP 的 Response.Write 快捷方式 <%= %> 相似,但其行為完全不同。ASP Response.Write 快捷方式文法在處理頁時計算,而 ASP.NET 資料綁定文法僅在調用 DataBind 方法時計算。
DataBind 是頁和所有伺服器控件的方法。當在父控件上調用 DataBind 時,它級聯到該控件的所有子控件。例如,
DataList1.DataBind()
将是以對 DataList 模闆中的每一控件調用 DataBind 方法。在頁上調用 DataBind —
Page.DataBind()
或隻是
DataBind()
— 會導緻計算頁上的所有資料綁定表達式。通常從 Page_Load 事件調用 DataBind,如下例所示。
<script language="JavaScript" type="text/javascript"> function doClick(index, numTabs, id) { document.all("tab" + id, index).className = "tab"; for (var i=1; i < numTabs; i++) { document.all("tab" + id, (index + i) % numTabs).className = "backtab"; } document.all("code" + id, index).style.display = ""; for (var j=1; j < numTabs; j++) { document.all("code" + id, (index + j) % numTabs).style.display = "none"; } } </script>
| ||
C# | VB | JScript |
如果綁定表達式在運作時計算為預期的資料類型,則可以在 .aspx 頁的聲明節中的幾乎任何位置使用綁定表達式。上面的簡單屬性、表達式和方法示例在計算時向使用者顯示文本。這些情況下,資料綁定表達式必須計算為 String 類型的值。在集合示例中,資料綁定表達式計算為 ListBox 的 DataSource 屬性的有效類型值。您可能會發現有必要轉換綁定表達式中的類型值以産生所需的結果。例如,如果
count
是整數:
Number of Records: <%# count.ToString() %>
綁定到簡單屬性
ASP.NET 資料綁定文法支援綁定到公共變量、頁的屬性和頁上其他控件的屬性。
下面的示例說明如何綁定到公共變量和頁上的簡單屬性。注意這些值在
DataBind()
調用前初始化。
C# DataBind1.aspx |
[ 運作示例] | [ 檢視源代碼]
源碼
< html >
< head >
< script language ="C#" runat ="server" > ...
void Page_Load(Object sender, EventArgs e) ...{
Page.DataBind();
}
string custID...{
get ...{
return "ALFKI";
}
}
int orderCount...{
get ...{
return 11;
}
}
</ script >
</ head >
< body >
< h3 >< font face ="宋體" > 到頁屬性的資料綁定 </ font ></ h3 >
< form runat =server >
客戶: < b > <% ... # custID %> </ b >< br >
未結的訂單: < b > <% ... # orderCount %> </ b >
</ form >
</ body >
</ html >
下面的示例說明如何綁定到另一控件的屬性。
|
< html >
< head >
< script language = " C# " runat = " server " >
void SubmitBtn_Click(Object sender, EventArgs e) ... {
// 僅調用“Page.DataBind”,而不是從“StateList”
// 中顯式取出變量,然後操作标簽控件。
// 這将計算頁内所有的 <%# %> 表達式
Page.DataBind();
}
</ script >
</ head >
< body >
< h3 >< font face = " 宋體 " > 到另一個伺服器控件的屬性的資料綁定 </ font ></ h3 >
< form runat = server >
< asp:DropDownList id = " StateList " runat = " server " >
< asp:ListItem > CA </ asp:ListItem >
< asp:ListItem > IN </ asp:ListItem >
< asp:ListItem > KS </ asp:ListItem >
< asp:ListItem > MD </ asp:ListItem >
< asp:ListItem > MI </ asp:ListItem >
< asp:ListItem > OR </ asp:ListItem >
< asp:ListItem > TN </ asp:ListItem >
< asp:ListItem > UT </ asp:ListItem >
</ asp:DropDownList >
< asp:button Text = " 送出 " OnClick = " SubmitBtn_Click " runat = server />
< p >
標明的州: < asp:label text = ' <%# StateList.SelectedItem.Text %> ' runat = server />
</ form >
</ body >
</ html >
像 DataGrid、ListBox 和 HTMLSelect 這樣的清單伺服器控件将集合用作資料源。下面的示例說明如何綁定到通常的公共語言運作庫集合類型。這些控件隻能綁定到支援 IEnumerable、ICollection 或 IListSource 接口的集合。最常見的是綁定到 ArrayList、Hashtable、DataView 和 DataReader。
下面的示例說明如何綁定到 ArrayList。
|
< html >
< head >
< script language ="C#" runat ="server" > ...
void Page_Load(Object Sender, EventArgs E) ...{
if (!Page.IsPostBack) ...{
ArrayList values = new ArrayList();
values.Add ("IN");
values.Add ("KS");
values.Add ("MD");
values.Add ("MI");
values.Add ("OR");
values.Add ("TN");
DropDown1.DataSource = values;
DropDown1.DataBind();
}
}
void SubmitBtn_Click(Object sender, EventArgs e) ...{
Label1.Text = "您選擇了:" + DropDown1.SelectedItem.Text;
}
</ script >
</ head >
< body >
< h3 >< font face ="宋體" > 資料綁定 DropDownList </ font ></ h3 >
< form runat =server >
< asp:DropDownList id ="DropDown1" runat ="server" />
< asp:button Text ="送出" OnClick ="SubmitBtn_Click" runat =server />
< p >
< asp:Label id =Label1 font-name ="宋體" font-size ="10.5pt" runat ="server" />
</ form >
</ body >
</ html >
下面的示例說明如何綁定到 DataView。注意 DataView 類在 System.Data 命名空間中定義。
|
<% ... @ Import namespace="System.Data" %>
< html >
< head >
< script language ="C#" runat ="server" > ...
void Page_Load(Object sender, EventArgs e ) ...{
if (!Page.IsPostBack) ...{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("整數值", typeof(Int32)));
dt.Columns.Add(new DataColumn("字元串值", typeof(string)));
dt.Columns.Add(new DataColumn("日期時間值", typeof(DateTime)));
dt.Columns.Add(new DataColumn("布爾值", typeof(bool)));
for (int i = 1; i <= 9; i++) ...{
dr = dt.NewRow();
dr[0] = i;
dr[1] = "項 " + i.ToString();
dr[2] = DateTime.Now;
dr[3] = (i % 2 != 0) ? true : false;
dt.Rows.Add(dr);
}
dataGrid1.DataSource = new DataView(dt);
dataGrid1.DataBind();
}
}
</ script >
</ head >
< body >
< h3 >< font face ="宋體" > 到 DataView 的資料綁定 </ font ></ h3 >
< form runat =server >
< asp:DataGrid id ="dataGrid1" runat ="server"
BorderColor ="black"
BorderWidth ="1"
GridLines ="Both"
CellPadding ="3"
CellSpacing ="0"
HeaderStyle-BackColor ="#aaaadd"
/>
</ form >
</ body >
</ html >
下面的示例說明如何綁定到 Hashtable。
|
< html >
< head >
< script language ="C#" runat ="server" > ...
void Page_Load(Object sender, EventArgs e) ...{
if (!Page.IsPostBack) ...{
Hashtable h = new Hashtable();
h.Add ("鍵 1", "值 1");
h.Add ("鍵 2", "值 2");
h.Add ("鍵 3", "值 3");
MyDataList.DataSource = h;
MyDataList.DataBind();
}
}
</ script >
</ head >
< body >
< h3 >< font face ="宋體" > 到哈希表的資料綁定 </ font ></ h3 >
< form runat =server >
< asp:DataList id ="MyDataList" runat ="server"
BorderColor ="black"
BorderWidth ="1"
GridLines ="Both"
CellPadding ="4"
CellSpacing ="0"
>
< ItemTemplate >
<% ... # ((DictionaryEntry)Container.DataItem).Key %> :
<% ... # ((DictionaryEntry)Container.DataItem).Value %>
</ ItemTemplate >
</ asp:DataList >
</ form >
</ body >
</ html >
通常需要在綁定到頁或控件之前操作資料。下面的示例說明如何綁定到表達式和方法的傳回值。
|
< html >
< head >
< script language = " C# " runat = " server " >
void Page_Load(Object Src, EventArgs E) ... {
if (!Page.IsPostBack) ...{
ArrayList values = new ArrayList();
values.Add (0);
values.Add (1);
values.Add (2);
values.Add (3);
values.Add (4);
values.Add (5);
values.Add (6);
DataList1.DataSource = values;
DataList1.DataBind();
}
}
String EvenOrOdd( int number) ... {
if ((number % 2) == 0)
return "偶數";
else
return "奇數";
}
</ script >
</ head >
< body >
< h3 >< font face = " 宋體 " > 到方法和表達式的資料綁定 </ font ></ h3 >
< form runat = server >
< asp:DataList id = " DataList1 " runat = " server "
BorderColor = " black "
BorderWidth = " 1 "
GridLines = " Both "
CellPadding = " 3 "
CellSpacing = " 0 "
>
< ItemTemplate >
數字值: <% # Container.DataItem %>
偶 / 奇: <% # EvenOrOdd(( int ) Container.DataItem) %>
</ ItemTemplate >
</ asp:datalist >
</ form >
</ body >
</ html >
DataBinder.Eval
ASP.NET 架構提供了一種靜态方法,計算後期綁定的資料綁定表達式并且可選擇将結果格式化為字元串。DataBinder.Eval 很友善,因為它消除了開發人員為強迫将值轉換為所需的資料類型而必須做的許多顯式轉換。這在資料綁定模闆清單内的控件時尤其有用,因為通常資料行和資料字段的類型都必須轉換。
請看下面的示例,本例中整數将顯示為貨币字元串。使用标準的 ASP.NET 資料綁定文法,必須首先轉換資料行的類型以便檢索資料字段
IntegerValue
。下一步,将此作為參數傳遞給 String.Format 方法。
| ||
C# | VB | JScript |
該文法可能比較複雜,難以記憶。相反,DataBinder.Eval 隻是一個具有三個參數的方法:資料項的命名容器、資料字段名和格式字元串。在像 DataList、DataGrid 或 Repeater 這樣的模闆清單中,命名容器始終是
Container.DataItem
。Page 是另一個可與 DataBinder.Eval 一起使用的命名容器。
| ||
C# | VB | JScript |
格式字元串參數是可選的。如果省略它,則 DataBinder.Eval 傳回對象類型的值,如下例所示。
| ||
C# | VB | JScript |
DataBinder.Eval 會對标準資料綁定文法帶來很明顯的性能損失,因為它使用後期綁定反射,注意這一點很重要。使用 DataBinder.Eval 時需謹慎,尤其是在不需要字元串格式化時。
|
本節小結
- ASP.NET 聲明性資料綁定文法使用 <%# %> 表示法。
- 可以綁定到資料源、頁或其他控件的屬性、集合、表達式以及從方法調用傳回的結果。
- 清單控件可以綁定到支援 ICollection、IEnumerable 或 IListSource 接口的集合,如 ArrayList、Hashtable、DataView 和 DataReader。
- DataBinder.Eval 是用于晚期綁定的靜态方法。它的文法可能比标準資料綁定文法簡單,但性能較低。
綁定到集合和清單
綁定表達式或方法