5).Pagelet控件
自己做控件最簡單的方法就是Pagelet控件,後綴為.ASPc,用Register指令包含到WebForm中:
<%@ Register TagPRefix="Acme" TagName="Message" Src="pagelet1.ASPc" %>
TagPrefix是Pagelet的名稱空間定義,TagName是給Pagelet取的名字。Src屬性是虛擬目錄。
Pagelet的使用:
<Acme:Message runat="Server"/>
。暴露Pagelet的方法,像一個類一樣定義屬性,例:
<script language="c#" runat="server">
public String Address{
get{
return TxtAddress.Value;
}
set{
TxtAddress.Value=value;
}
}
</script>
<input id="TxtAddress" runat="server">
。封裝事件
略
可以看出,Pagelet可以取代include文件的作用。
。編程創建Pagelet對象
可以用程序生成Pagelet控件的實例,如:
Control cl=LoadControl("pagelet2.ASPc");
((Pagelet2_ASPc)cl).Category="business";
Page.Controls.Add(cl);
注意,因為LoadControl函數返回一個System.Web.UI.Control對象,因此需要造型。Pagelet
的類型為文件名,點號換成下劃線。
6).數據幫定控件
ASP+中,不僅可以幫定到數據庫,還可以幫定到簡單的屬性集合,甚至方法調用的結果,如:
CustomerID: <%# custID %>
<ASP:ListBox id="List1" datasource='<%# myArray %>' runat="server">
<%# (Customer.FirstName + Customer.LastName)%>
<%# GetBalance(CustID) %>
看起來跟asp中的<%=%>一樣,但是ASP是用Response.Write來替換的,而ASP+則是在DataBind()
方法調用後才幫定的。數據幫定控件和Page對象都有DataBind()方法。
注意,ASP+是強類型的,所以:
<%# count.ToString() %>才對。
。DataBinder.Eval()
一個靜態方法,由ASP+支持,允許後幫定的數據幫定表達式,而且還可選地轉化為串,可以
用於模板。如不用Eval,則像:
<%# String.Format("{0:c}",((DataRowVIEw)Container.DataItem)["SomeInteger"]) %>
可以用Eval:
<%# DataBinder.Eval(Container.DataItem,"someinteger","{0:c}") %>
7).服務器方數據訪問
。連接、命令和數據集(DataSets)
NGWS提供了一系列受管數據訪問API,引入名稱空間:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
a).生成SQLConnection
b).構造SQLDatasetCommand
c).FillDataSet
如果是插入等操作,則用SQLCommand替換SQLDataSetCommand.
記住:始終在用完連接後關閉連接!否則要等到頁面被釋放時才會被垃圾回收機制釋放資源。
。幫定數據到DataGrid,例:
....
DataSet ds = new DataSet();
myCommand.FillDataSet(ds,"Authors");
MyDataGrid.DataSource = ds.Tables["Authors"].DefaultVIEw;
MyDataGrid.DataBind();
。參數化查詢
SQLDataSetCommand支持參數,"@"作為參數前綴,例:
myCommand.SelectCommand.Parameters.Add(new SQLParameter("@state",SQLDataType.VarChar,2));
myCommand.SelectCommand.Parameters["@state"].Value=newValue;
注意,如果DataGrid要在客戶與服務器間輪轉的話,一定要把MaintainState屬性設置為false,
否則,性能受到影響,如:
<ASP:DataGrid id="myDataGrid" runat="server"
MaintainState="false"/>
。插入數據
應當保證不為null,可以使用try/catch塊。
例:
String insertcmd = "insert into Authors values(@id,@lname)"
SQLCommand myc = new SQLCommand(insertcmd,myConn);
myc.Parameters["@id"].Value=cu_id.Value;
myc.Parameters["@lname"].Value=au_lname.Value;
myc.ActiveConnection.Open();
try{
myc.Execute();
}catch(SQLException e){
if (e.Number==2627)
......//主鍵重復
}
myc.ActiveConnection.Close();
。更新記錄
DataGrid提供了一些內在支持,有一個整型屬性,EditItemIndex,表示哪一行可以編輯,一但設置,
該行的文本輸入框顯示,而不是卻省的靜態文本,如為-1則表示沒有行可以編輯。
DataGrid可以包含一個控件,EditCommandColumn,它將為DataGrid引發三個事件,EditCommand,
UpdateCommand,和CancelCommand。EditCommandColumn在屬性中用Columns定義,如:
<ASP:DataGrid id="MyDataGrid" runat="server"
......
onEditCommand="MyDataGrid_Edit"
onCancelCommand="MyDataGrid_Cancel"
onUpdateCommand="MyDataGrid_Update"
DataKeyFIEld="au_id"
>
<property name="Columns">
<ASP:EditCommandColumns EditText="編輯" CancelText="取消" UpdateText="更新"/>
</property>
</ASP:DataGrid>
Edit事件中參數DataGridCommandEventArgs參數包含了用戶選擇的行,然後我們可以重新幫定,
以刷新顯示。例:
public void MyDataGrid_Edit(Object sender,DataGridCommandEventArgs E){
MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;
BindGrid();//調用另外的函數實現重新幫定
}
在Cancel事件中,我們只需要把EditItemIndex設為-1就可以了。
在Update事件中,我們需要更新數據。要知道當前行的主鍵值,這可以用剛才設的DataKeyFIEld
來獲得,我們可以獲得行的主鍵值,如:
myCommand.Parameters["@id"].Value=MyDataGrid.DataKeys[(int)E.Item.ItemIndex];
最後將EditItemIndex設為-1。
為了防止用戶修改主鍵,可以單獨定義一行中各列的表現,將其改為只讀,如:
<ASP:DataGrid id="MyDataGrid" runat="server"
......
DataKeyFIEld="au_id"
AutoGenerateColumns="false"
>
<property name="Columns">
<ASP:EditCommandColumn EditText="編輯" CancleText="取消" UpdateText="更新"/>
<ASP:BoundColumn HeaderText="au_id" SortField="au_id" ReadOnly="True" DataFIEld="au_id"/>
<ASP:BoundColumn HeaderText="電話" SortField="phone" DataFIEld="phone"/>
......
</property>
</ASP:DataGrid>
。刪除記錄
加一個ButtonColumn控件,Command設為"Delete",將引發DeleteCommand事件。
。排序
當用戶點一列的Header時,如果DataGrid的AllowSorting屬性為True,則一個OnSortCommand
事件產生,參數DataGridSortCommandEventArgs的SortFIEld傳回來的是哪一個列被選中,如:
protected void MyDataGrid_Sort(Object src,DataGridSortCommandEventArgs E){
DataView source=ds.Tables["Authors"].DefautlVIEw;
Source.Sort=E.SortFIEld;
MyDataGrid.DataBind();
}
。表間關系
用一列做個連接,跳轉到另一頁去查看對應的詳細資料,用控件HyperLinkColumn,如:
<property name="Columns">
<ASP:HyperLinkColunn
DataNavigateUrlFIEld="au_id"
DataNavigateUrlFormatString="a.ASPx?id={0}"
Text="詳細情況"
/>
</property>
。訪問基於XML的數據
DataSet有一個方法叫ReadXml,用FileStream作為參數,XML文件的格式為:
<DocumentElement>
<TableName>
<ColumnName1>Comumn Value</ColunName1>
......
</TableName>
</DocumentElement>
每一個<TableName>段代表一行數據。
例:
DataSet ds = new DataSet();
FileStream fs = new FileStream(Server.Mappath("a.XML"),FileMode.Open,FileAccess.Read);
StreamReader reader = new StreamReader(fs);
ds.ReadXML(reader);
DataView source = new DataVIEw(ds.Tables[0]);
MySpan.InnerHtml = source.Table.TableName;
MyDataGrid.DataSource = source;
MyDataGrid.DataBind();
還可以分別調用ReadXmlSchema和ReadXMLData分開讀取模式和數據。