???Repeater控件,共有五個模板,編輯該控件的模板只能在ASP源碼中進行
??????1.ItemTemplate,正常顯示項,如果定義了交替項模板,則僅代表奇數Item(從1開始算)
??????2.AlternatingItemTemplate,交替項,代表偶數Item
??????3.HeaderTemplate,頁眉,在控件的最前
??????4.FooterTemplate,頁腳,在控件的最后
??????5.SeparatorTemplate,分隔項,位于各Item之間,如使用<br/>實現各項換行
???適用于:
??????替代只讀顯示容器內容的循環,如將一個ResultSet顯示成一張表。
??????HeaderTemplate中使用<table><tr>,ItemTemplate/AlternatingItemTemplate中使用<td></td>,SeparatorTemplate中使用</tr><tr>,FooterTemplate中使用</tr></table>可以實現一個 <table> 元素效果。
???DataList控件,共有七個模板
??????6.SelectedItemTemplate,選擇項
??????7.EditItemTemplate,編輯項
???適用于:
??????可編輯數據的顯示,因此在普通的DataSource指定后2006年8月24日,需要綁定數據源的主鍵列(指定控件的DataKeyField屬性)。
??????該控件提供了多種事件,由放在Item中的Button控件激發。
??????Button控件將會激發ItemCommand事件,可通過傳入的事件參數來引發其它事件,例如使用SelectedItem模板:
???????? if ?(e.CommandName? == ? " Select " )?{????????????????????????? // 判斷激發事件的Button.CommandName
???????????? this .DataList1.SelectedIndex? = ?e.Item.ItemIndex;?? // 讓激發事件的行被選中
????????????myDataBind();??????????????????????????????????????????????? // 這里需要進行重新綁定
????????}
????}
??????使用EditItemTemplate模板,將Button.CommandName指定成"edit"即可。
???????? this .DataList1.SelectedIndex? = ? - 1 ;?????????????????????? // 放棄選擇
???????? this .DataList1.EditItemIndex? = ?e.Item.ItemIndex;???? // 讓當前行進入編輯狀態
????????myDataBind();
????}
??????在EditItemTemplate模板中可以將允許修改的列綁定到子控件上,并放入兩個Button,CommandName分別指定為"update","cancel"與DataList的事件相對應,再在對應的數據更新/放棄事件中編程即可。


???? protected ? void ?DataList1_CancelCommand( object ?source,?DataListCommandEventArgs?e)?{
???????? this .DataList1.EditItemIndex? = ? - 1 ;?? // 放棄編輯狀態
????????myDataBind();
????}


???? protected ? void ?DataList1_UpdateCommand( object ?source,?DataListCommandEventArgs?e)?{
???????? string ?id? = ? this .DataList1.DataKeys[e.Item.ItemIndex].ToString();??????? // 獲取編輯行所對應的主鍵
????????SqlConnection?con? = ?Db.getConnection();
???????? // 根據主鍵更新數據庫
????????SqlCommand?cmd? = ? new ?SqlCommand( " update?vote?set?topic=@topic?where?vID=@vID " ,?con);
????????SqlParameter?p1? = ? new ?SqlParameter( " @topic " ,?SqlDbType.VarChar,? 20 );
????????p1.Value? = ?((TextBox)e.Item.FindControl( " txtTopic " )).Text.Trim();
????????cmd.Parameters.Add(p1);
????????SqlParameter?p2? = ? new ?SqlParameter( " @vID " ,?SqlDbType.Int);
????????p2.Value? = ?id;
????????cmd.Parameters.Add(p2);
????????con.Open();
????????cmd.ExecuteNonQuery();
????????con.Close();
???????? this .DataList1.EditItemIndex? = ? - 1 ;?? // 放棄編輯狀態
????????myDataBind();
????}
??????將Button控件的CommandName指定為"delete",可激發數據刪除事件:


???? protected ? void ?DataList1_DeleteCommand( object ?source,?DataListCommandEventArgs?e)?{
???????? string ?id? = ? this .DataList1.DataKeys[e.Item.ItemIndex].ToString();??????? // 獲取編輯行所對應的主鍵
????????SqlConnection?con? = ?Db.getConnection();
???????? // 根據主鍵更新數據庫
????????SqlCommand?cmd? = ? new ?SqlCommand( " delete?vote?where?vID=@vID " ,?con);
????????SqlParameter?p1? = ? new ?SqlParameter( " @vID " ,?SqlDbType.Int);
????????p1.Value? = ?id;
????????cmd.Parameters.Add(p1);
????????con.Open();
????????cmd.ExecuteNonQuery();
????????con.Close();
????????myDataBind();
????}
??????通常需要在Update/Delete按鈕上加入確認,如果是靜態提示可以直接在Button的屬性中加入:


????protected?void?DataList1_ItemCreated(object?sender,?DataListItemEventArgs?e)?{
????????//此事件表示的是Item的建立,而在不同的模板中是會有不同的呈現形式的,因此需要對當前的狀態進行判斷
????????//該delete按鈕是在正常瀏覽狀態下的,在select/edit狀態下并不存在
????????if?(e.Item.ItemType?==?ListItemType.Item?||?e.Item.ItemType?==?ListItemType.AlternatingItem)?{
????????????string?s1?=?"return?confirm('你確認要刪除ID=";
????????????s1?=?s1?+?DataBinder.Eval(e.Item.DataItem,?"vID");
????????????s1?=?s1?+?"的投票嗎?');";
????????????((Button)e.Item.FindControl("btnDelete")).Attributes.Add("onClick",?s1);
????????}
????}
??????這樣一來就可以在Button激發DataList的事件之前進行簡單的確認了,不過需要注意的是:
?????????.用這種方式時,在運行時如果有錯誤是不會有什么提示消息的,而且流程直接向下進行;
?????????.如果同時使用了兩種,那么Button上的OnClientClick屬性優先。
??????該控件的顯示方式也與Repeater控件大不相同,它的顯示方式分為"表"和"流"兩種,默認使用表布局。
?????????使用表布局時控件會自動生成一個<table>元素,樣式則由各模板對應的<style>指定,在該控件的運用中不應該再使用如Repeater那種自構造<table>元素的方法,因為該控件中經常需要用到FindControls方法,自行加入元素會影響到該方法。
??????可以看到模板還具有自己所對應的Style,這個樣式與當前Item所使用的模塊對應,例如選中第1項,如果沒有配置<SelectedItemStyle>才會使用<ItemStyle>所定義的樣式。
???手工分頁:
??????如上面提到的Repeater、DataList控件都沒有提供分頁的功能,此時可以對數據源進行分頁再配合自定義的導航條來實現分頁效果。
??????手工分頁,需要用到 System.Web.UI.WebControls.PagedDataSource 對象。
??????例如:在頁面中加入lblPageNo控件以保存當前頁號(text="0"),btnPrevious表示上一頁,btnNext表示下一頁。



















































???排序:
??????利用數據視圖DataView的Sort屬性來實現排序,將其屬性指定為一個字段名 + 排序規則。
??????在GridView中列上可以設置SortExpression排序表達式,并在Sorting事件中指定DataView的Sort為該事件的SortExpression即可。
???GridView:
??????就是一個數據表格,在以前的版本中叫DataGrid。它的功能比DataList更為強大,支持數據表格顯示、按列的控制(DataList按名字就只支持一列)、列的排序、分頁、空頁控制等多種功能,可以將DataList看做是一個輕量級的控件,不過從這兩種控件的屬性及使用方式來看,風格完全不同,這可能也是兩控件命名不一的原因吧。
?