數(shù)據(jù)綁定的使用
2024-07-21 02:23:13
供稿:網(wǎng)友
如果要在運行時將數(shù)據(jù)值分配給一個控件屬性,則可以響應(yīng)由該控件引發(fā)的數(shù)據(jù)綁定事件。在事件代碼中,可以執(zhí)行任何邏輯,無論是否要求該邏輯來分配屬性值。
注意 在設(shè)計時,可以創(chuàng)建在運行時計算的數(shù)據(jù)綁定表達式,以將值分配給控件屬性。有關(guān)詳細(xì)信息,請參閱在設(shè)計時數(shù)據(jù)綁定單值 web 服務(wù)器控件。
在運行時數(shù)據(jù)綁定單值控件
1. 確保您的 web 窗體頁中的代碼或者調(diào)用您正使用的控件的 databind 方法,或者調(diào)用此頁的該方法。將引發(fā)數(shù)據(jù)綁定事件以響應(yīng)此方法調(diào)用。
注意 通常不需要在每個往返行程中都調(diào)用 databind 方法(即在頁初始化階段不需要檢查回發(fā)),因為這樣做會替換控件中的值。
2. 為控件的 databinding 事件創(chuàng)建事件處理程序。
3. 在事件處理程序中,根據(jù)需要添加代碼以將值分配給控件的屬性。
下面的示例說明如何在運行時執(zhí)行簡單的數(shù)據(jù)綁定。web 窗體頁包含兩個 textbox web 服務(wù)器控件,顯示來自 sql server pubs 數(shù)據(jù)庫中標(biāo)題表的信息。“上一個”和“下一個”按鈕設(shè)置在會話狀態(tài)中存儲的“記錄位置”變量。只要用戶單擊這些按鈕以更改記錄位置,就調(diào)用該頁的 databind 方法,這將引發(fā)用于填充文本框的事件。
' visual basic
private sub page_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
sqldataadapter1.fill(dstitles1)
session("recordpos") = 0
me.databind()
end sub
private sub btnnext_click(byval sender as system.object, byval e as system.eventargs) handles btnnext.click
dim recordpos as integer = ctype(session("recordpos"), integer)
recordpos += 1
if recordpos > dstitles1.titles.count then
recordpos -= 1
end if
session("recordpos") = recordpos
me.databind()
end sub
private sub btnprevious_click(byval sender as system.object, byval e as system.eventargs) handles btnprevious.click
dim recordpos as integer = ctype(session("recordpos"), integer)
if recordpos > 0 then
recordpos -= 1
end if
session("recordpos") = recordpos
me.databind()
end sub
private sub textbox1_databinding(byval sender as object, byval e as system.eventargs) handles textbox1.databinding
dim recordpos as integer = ctype(session("recordpos"), integer)
textbox1.text = dstitles1.titles(recordpos).title_id
textbox2.text = dstitles1.titles(recordpos).title
end sub
// c#
private void page_load(object sender, system.eventargs e)
{
sqldataadapter1.fill(dstitles1);
session["recordpos"] = 0;
this.databind();
}
private void btnnext_click(object sender, system.eventargs e)
{
int recordpos = (int) session["recordpos"];
recordpos++;
if (recordpos > dstitles1.titles.count)
{
recordpos--;
}
session["recordpos"] = recordpos;
this.databind();
}
private void btnprevious_click(object sender, system.eventargs e)
{
int recordpos = (int) session["recordpos"];
if (recordpos > 0)
{
recordpos--;
}
session["recordpos"] = recordpos;
this.databind();
}
private void textbox1_databinding(object sender, system.eventargs e)
{
int recordpos = (int) session["recordpos"];
textbox1.text = dstitles1.titles[recordpos].title_id;
textbox2.text = dstitles1.titles[recordpos].title;
}
下面的示例將 label 控件綁定到通過執(zhí)行 sql 命令返回的值。該命令對象(對于 sql server 是顯式的,由已命名的參數(shù)指示)以前已通過名為 @empid 的單個參數(shù)定義。
用戶輸入雇員 id 并單擊按鈕。該按鈕調(diào)用 label 控件的 databind 方法,這將引發(fā) databinding 事件。在事件處理程序中,代碼獲取雇員 id,將其設(shè)置為 sqlcommand 對象的參數(shù),并運行該命令的 sql 語句。該命令返回一個數(shù)據(jù)閱讀器對象,其中具有一個記錄,代碼讀取它并顯示在標(biāo)簽中。
' visual basic
private sub btnlogin_click(byval sender as system.object, byval e as system.eventargs) handles btnlogin.click
label1.databind()
end sub
private sub label1_databinding(byval sender as object, byval e as system.eventargs) handles label1.databinding
sqlcommand1.parameters("@empid").value = loginid.text
sqlcommand1.commandtext = _
"select id, fname, lname from employee where (id = @empid)"
sqlcommand1.commandtype = commandtype.text
dim dr as system.data.sqlclient.sqldatareader
sqlconnection1.open()
dr = sqlcommand1.executereader()
if dr.read() then
label1.text = "welcome, " & ctype(dr(1), string) & " " & ctype(dr(2), string)
else
label1.text = "no employee found with id of " & loginid.text
end if
sqlconnection1.close()
end sub
// c#
private void btnlogin_click(object sender, system.eventargs e)
{
label1.databind();
}
private void label1_databinding(object sender, system.eventargs e)
{
sqlcommand1.parameters["@empid"].value = loginid.text;
sqlcommand1.commandtext =
"select id, fname, lname from employee where (id = @empid)";
sqlcommand1.commandtype = commandtype.text;
system.data.sqlclient.sqldatareader dr;
sqlconnection1.open();
dr = sqlcommand1.executereader();
if (dr.read())
{
label1.text = "welcome, " + dr[1] + " " + dr[2];
}
else
{
label1.text = "no employee found with id of " + loginid.text;
}
sqlconnection1.close();
}