Server Control使用Client 端指令碼
伺服器控制項好用,大家都知道,但常常我們需要做的事是在伺服器控制項上實現用戶端指令碼。一般來說,用戶端指令碼結合伺服器控制項可以直接在伺服器控制項的。標籤內寫即可。
如:<asp: button id="button1" text="test"
onmouseover="this.style.backgroundColor='green'"
runat="server"/>但此時問題出來了,他屏蔽了onclick事件,未了達到目的,使用下面的方式可以解決:
..........1
<asp: button id="button1" text="test"
onclick="mytest" runat="server"/>
..........2
private void Page_Load(object sender,system,EventArgs e)
{
Button1.Attributes["onclick"]="javascript:return confirm('Are you sure?')"
}
............3
private void Button1_Click(object sender,system,EventArgs e)
{
Response.Write("your click button");
}
這樣在網頁載入時給按鈕加上OnclicK事件及用戶端指令碼;如果有時候用戶端指令碼代碼比較多,可以採用函數調用的方式了。
.........1
<script languge=javascript>
<!--
function test()
{
alter("test");
return false
}
-->
</script>
..........2
private void Page_Load(object sender,system,EventArgs e)
{
Button1.Attributes.add("onclick"),"javascript:return test();");
}
............3
private void Button1_Click(object sender,system,EventArgs e)
{
Response.Write("your click button");
}
另外一種方式更好:不用寫伺服器端代碼:
<script for="Button1" event="onclick()" language="javascript">
{
<!--
return confirm("test");
-->
}
DataGrid剖析
DataGrid
優點:
靈活性強,內直事件豐富
提供分頁、編輯、排序等特性
強大的DataGrid編輯器以及模板列
快速開發、容易部署
對於表格的操作非常方便
內直多種布局風格
缺點:
效能不高/每次操作都要postback回伺服器,資料量多大viewState就多大
個人化輸出資料有現(只能輸出HTML表格)
DataList
優點:
強大的模板特性,靈活性高
支援資料的編輯狀態
效能優於DataGrid缺點:
開發週期略比DataGrid高
沒有DataGrid那樣的編輯器
不容易實現分頁和排序功能
Repeater完全以HTML方式呈現,更加個人化
缺點:不支援編輯,分頁,排序
開發週期最長
不提供預設的風格,需手工編寫
效能最好,但特性少
三者的使用範圍:
DataGrid:主要用於含有資料的表格,一般資料爰為DATASET,多列顯示
DataList;主要用於單列的資料列表
Repeater:用於一些靈活性,高效能的資料展示
總的來說DataGrid包括
每一行就代表一個DataGridItem:ListItemType:
Header,Footer,Item,AlternatingItem,SelectedItem,EditItem,Separastor,Pager
每一列就代表一個DataGridColumn:BoundColumn,BttonColumn,HyperLinkColumn,TemplateColumn,EditCommandColumn
DataGrid使用時要注意的問題:
建議不使用自動產生列
不要僅僅使用控制項ID來引用DataGrid中的控制項,需要通過FindControl來指明。
DataGrid從開始載入資料到呈現資料完畢所需要經曆的事件順序:
在進行DATABIND方法時執行DATABINDING(目的:載入DataSet中列並建立ItemCreated事件)->ItemCreated事件->ItemDataBind事件->PreRender事件
ItemCreated,ItemDataBind都可以轉換成一個DataRowView,這樣我們就可以輕易的擷取DataGrid裡那一行的那一個欄位,但是ItemCreated時轉換的話沒多大意義,此時行還未真正獲得值為空白(null),一般是在ItemDataBind這個事件下進行轉換。
DataGrid綁定事件常見問題:
1。引用e.item.DataItem時報錯
原因:沒有在ItemCreated,ItemDataBind下判斷類型:
(DataRowView)(e.Item,DataItem)只有在item,AlternatingItem,Selecteditem,edititem行時才有值。
2。資料繫結完後如何訪問某行的資料?
不能使用DataGridItem來直接存取,他只是在綁定的過程中才有值,綁定完後就為空白了,需要通過迴圈來訪問:
for each(DataGridItem dgi in DataGrid1.items)
{.....}
3.使用ItemCreated事件時要注意
當載入、修改行屬性或者行內的控制項屬性時應該判斷類型
private void DataGrid1_ItemCreated(....)
{
if(e.Item.ItemType==ListItemType.item)
{
............
}
}
如添加刪除確認筐:
private void DataGrid1_ItemDataCreated(....)
{
if(e.Item.ItemType==ListItemType.item ||e.Item.ItemType==ListItemType.AlternatingItem )
{
LinkButton l=(LinkButton)e.Item.cells[11].Controls[0];
DataRowView drv=(DataRowView)e.Item.DataItem;
L.Atrributes.Add("onclick","javascript:return Confirm("你確認要刪除"+drv.Row.ItemArray[0]+"?");");
Label lb=(Label)e.Item.FindControl("lbID");
lb.Text=Convert.tostring(e.item.itemindex+1);
}
}
資料繫結:
簡單屬性:<%# custID%>
集合:<asp:ListBox id="list1" datasource='<%# myArray%>' runat="server">
運算式:<%#(customer.First Name+""+customer.LastName)%>
方法結果:<%#GetBalance(custID)%>
m模板列的綁定:
DataBidner,Eval