1. 程式人生 > >ASP.NET資料繫結控制元件

ASP.NET資料繫結控制元件

資料繫結控制元件簡介

資料繫結分為:資料來源 和 資料繫結控制元件 兩部分,資料繫結控制元件通過資料來源來獲得資料,通過資料來源來
隔離資料提供者和資料使用者,資料來源有:
SqlDataSource,AccessDataSource,ObjectDataSource,LinqDataSource,XmlDataSource 等
大部分不會直連線資料庫,所以SqlDataSource,AccessDataSource不會使用
ObjectDataSource 是WEB開發中應用最廣的資料來源,也能很容易的進行資料庫切換
資料繫結控制元件有:列表資料繫結控制元件(DropDownList,RadioButtonList,ListBox,CheckBoxList等)
與 複雜控制元件(ListView,Repeater,GridView,DetailsView,FormView,DataList,DataGrid等)
Repeater是最輕量級的元件,在前臺用的最多,ListView是.NET3.5中新增的控制元件,
它是 GridView,DetailsView,FormView,Repeater等這些控制元件的大統一者,那些控制元件的優點它都有

ObjectDataSource

ObjectDataSource 用來將一個類做為資料來源,TypeName屬性為資料來源類的全名,
有DeleteMethod,InsertMethod,SelectMethod,UpdateMethod等幾個屬性,分別為類中刪除,插入,查詢,更新資料的方法名
這些方法可能有引數,引數的值是通過DeleteParameters,UpdateParameters,InserParameters等巢狀設定

手工編寫ObjectDataSource太麻煩,使用介面來完成,將ObjectDataSource拖放到介面上,在右上角選擇
"配置資料來源"即可進行配置,資料來源類一般用 資料集 就可以,生成完後,在“配置資料來源”中就能看到了

GridView控制元件

選擇
DataKeyNames屬性
DataKeys屬性
取選中行的資料
取DataKey
單一Key
複合Key
取非Key列
預設方法:Cells[0].Text
使用模板裡的控制元件(複雜列)---在”模板裡講”

---- 處理事件

RowCommand 
在 GridView 控制元件中單擊某個按鈕時發生。此事件通常用於在該控制元件中單擊某個按鈕時執行某項任務。

RowDataBound 
在 GridView 控制元件中的某個行被繫結到一個數據記錄時發生。此事件通常用於在某個行被繫結到資料時修改該行的內容。

RowCreated 
在 GridView 控制元件中建立新行時發生。此事件通常用於在建立某個行時修改該行的佈局或外觀。

DataBound 
此事件繼承自 BaseDataBoundControl 控制元件,在 GridView 控制元件完成到資料來源的繫結後發生。

------上面是常用的

PageIndexChanging 
在單擊頁導航按鈕時發生,但在 GridView 控制元件執行分頁操作之前。此事件通常用於取消分頁操作。

PageIndexChanged 
在單擊頁導航按鈕時發生,但在 GridView 控制元件執行分頁操作之後。此事件通常用於在使用者定位到該控制元件中不同的頁之後需要執行某項任務時。

SelectedIndexChanging 
在單擊 GridView 控制元件內某一行的 Select 按鈕(其 CommandName 屬性設定為“Select”的按鈕)時發生,但在 GridView 控制元件執行選擇操作之前。此事件通常用於取消選擇操作。

SelectedIndexChanged 
在單擊 GridView 控制元件內某一行的 Select 按鈕時發生,但在 GridView 控制元件執行選擇操作之後。此事件通常用於在選擇了該控制元件中的某行後執行某項任務。

Sorting 
在單擊某個用於對列進行排序的超連結時發生,但在 GridView 控制元件執行排序操作之前。此事件通常用於取消排序操作或執行自定義的排序例程。

Sorted 
在單擊某個用於對列進行排序的超連結時發生,但在 GridView 控制元件執行排序操作之後。此事件通常用於在使用者單擊對列進行排序的超連結之後執行某項任務。

RowDeleting 
在單擊 GridView 控制元件內某一行的 Delete 按鈕(其 CommandName 屬性設定為“Delete”的按鈕)時發生,但在GridView 控制元件從資料來源刪除記錄之前。此事件通常用於取消刪除操作。

RowDeleted 
在單擊 GridView 控制元件內某一行的 Delete 按鈕時發生,但在 GridView 控制元件從資料來源刪除記錄之後。此事件通常用於檢查刪除操作的結果。

RowEditing 
在單擊 GridView 控制元件內某一行的 Edit 按鈕(其 CommandName 屬性設定為“Edit”的按鈕)時發生,但在 GridView 控制元件進入編輯模式之前。此事件通常用於取消編輯操作。

RowCancelingEdit 
在單擊 GridView 控制元件內某一行的 Cancel 按鈕(其 CommandName 屬性設定為“Cancel”的按鈕)時發生,但在GridView 控制元件退出編輯模式之前。此事件通常用於停止取消操作。

RowUpdating 
在單擊 GridView 控制元件內某一行的 Update 按鈕(其 CommandName 屬性設定為“Update”的按鈕)時發生,但在GridView 控制元件更新記錄之前。此事件通常用於取消更新操作。

RowUpdated 
在單擊 GridView 控制元件內某一行的 Update 按鈕時發生,但在 GridView 控制元件更新記錄之後。此事件通常用來檢查更新操作的結果。

------- 批量更新 -------
資料操作用的是 強型別DataSet

複製程式碼
protected void btnUp_Click(object sender, EventArgs e)
    {
        var da = new NewsDataSetTableAdapters.categoryTableAdapter();
        foreach (GridViewRow row in this.GridView1.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                CheckBox ck = row.FindControl("ckSel") as CheckBox;
                if (ck.Checked)
                {
                    var cateID = this.GridView1.DataKeys[row.RowIndex].Value;
                    var cateName = (row.FindControl("txtName") as TextBox).Text;

                    da.Update(cateName, int.Parse(cateID.ToString()));
                }
            }
        }
    }
複製程式碼

------- 批量刪除 -------
和上面的一樣

    var cateID = this.GridView1.DataKeys[row.RowIndex].Value;
    da.Delete(int.Parse(cateID.ToString()));
Repeate控制元件

Repeate(foreach)用於對繫結資料來源中的資料進行遍歷顯示,每條資料以什麼格式是
由Repeate的<ItemTemplate>來決定,需手動編寫
<%#Eval("Name")%>表示在這個位置顯示當前行的Name屬性,注意 呼叫Eval,Bind資料繫結方法時要用#
因為Eval就是將屬性顯示到指定的位置,因此可以顯示到文字框中
<ItemTemplate>姓名:<input type="text" value='<%#Eval("Name")%>'/></ItempTemplate>
注意 不要寫成 value="<%#Eval('Name')%>" 因為<%%>中的是C#程式碼,"是字元,而不是字串
還可以用在伺服器控制元件中<asp:TextBox Text='<%#Eval("Name")%>' runat="server"></asp:TextBox>
注意!:如果是服務端控制元件那麼在 <%#Eval('PicPath')%> 的前面不能加任何東西,不然會將<符編譯成&lt;
如果要解決可以這樣:建一個轉換URL的方法,然後在aspx裡面呼叫,如下:

複製程式碼
//新建方法
protected string FormatImgURL(object url)    //因為Eval()返回值是 object,所以用此型別
{
    return ResolveClientUrl("~/images/+url");
}
//呼叫
<%#FormatImgURL(Eval("PicPath"))%>
複製程式碼

Repeate 其它模板

1.<AlternatingItemTemplate> 設定隔行的不同顯示風格,設定後,奇數行用<ItemTemplate>模板,偶數行用<AlternatingItemTemplate>模板

<AlternatingItemTemplate>

  <asp:TextBox BackColor="Red" ID="TextBox2" Text='<%#Eval("Name")%>' runat = "server" />

</AlternatingItemTemplate>

設定隔行變色是為了防止資料太多看序列


2.HeaderTemplate,FotterTemplate: 頭部,尾部的模板,分別顯示在所有資料的前面和後面


3.SeparatorTemplate: 兩項資料之間的分隔符,比如換行符

如下:

複製程式碼
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1">
     <HeaderTemplate><div style="background-color:Aqua;width:200px;">會員管理系統<br /></div></HeaderTemplate>
     <ItemTemplate>主鍵:<%#Eval("Id") %>姓名:<%#Eval("username") %> <br /></ItemTemplate>
     <AlternatingItemTemplate><div style="color:Red">主鍵:<%#Eval("Id") %>姓名:<%#Eval("username") %> <br /></div></AlternatingItemTemplate>
     <FooterTemplate><div style="background-color:Aqua;width:200px;">作者:小高</div></FooterTemplate>
     <SeparatorTemplate><hr width="200" align="left"/></SeparatorTemplate>
</asp:Repeater>
複製程式碼

ItemDataBound 事件
在項被資料繫結後激發,繫結某行資料後激發
對於每行資料顯示的時候都會呼叫ItemDataBound 事件,在這個事件中可以對當前行進行處理,主要成員:
1. e.Item.ItemType 為當前行的型別,Item為ItemTemplate行,AlternatingItem為AlternatingItemTemplate行,還有Header,Footer等取值
2. e.Item.ItemIndex 當前行的序號
3. e.Item.DataItem 當前行繫結的物件

如果要在ItemDataBound 事件中對ItemTemplate模板中的控制元件做處理,則必須使用runat=server的控制元件
為控制元件設定ID,然後用 FindControl根據ID來取得控制元件

案例:將年齡大於30的行的顏色變成紅色,大於40更改背景顏色 複製程式碼
//ItemDataBound事件
DataRowView rowView = (DataRowView)e.Item.DataItem;        //得到這行的值
var userRow = (TestObject.DataSetUser.T_User)rowView.Row;    //轉換成強型別DataSet
if (userRow.Age > 30)        //當年齡大於 30
{
    TextBox txtAge = (TextBox)e.Item.FindControl("txtAge"); //獲得模板中的控制元件
    txtAge.BackColor = Color.Red;                //設定背景顏色
}

if (userRow.Age > 40)        //當年齡大於40
{
    HtmlGenericControl spnRow = (HtmlGenericControl)e.Item.FindControl("spanRow"); //獲得整行Span的ID
    spanRow.Attributes["class"] = "warning";        //設定定義好的樣式
}
複製程式碼 ItemCommand(行處理命令)

在 DataList 中生成事件時激發,當用戶點選按鈕後激發
可以在模板中放置Button控制元件,模板中的按鈕一般不寫OnClick事件,而是響應Repeater的ItemDataBound事件
為Button控制元件設定CommandName,CommandArgument屬性,然後在ItemDataBound事件讀取e的CommandName,
CommandArgument屬性就可以獲得發生事件的命令和引數了,如果對資料進行操作,則需要 Repeater1.DataBind()
來重新繫結,從資料庫中重新整理最新的資料

案例: 漲一歲,給被點選的行的年齡增加1

//Repeater控制元件設定
 <ItemTemplate>姓名:<%#Eval("username") %> 年齡:'<%#Eval("age") %>'
 <asp:Button runat="server" Text="加一歲" CommandName="inc"
 CommandArgument='<%#Eval("id") %>' /><br /></ItemTemplate>
複製程式碼
//增加一個SQL更新語句,名為 IncAgeById()
 // update T_Person set age=age+1 where [email protected]

//ItemCommand事件設定
   protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "inc")
        {
            int id = int.Parse(e.CommandArgument.ToString());           //獲得當前行的ID值
            T_personTableAdapter adapter = new T_personTableAdapter(); //建立 adapter
            adapter.IncAgeById(id);    //使用自定義SQL進行更新,按當前ID來加一
            this.Repeater1.DataBind();    //資料再次繫結,實現網頁與資料庫同步
        }
    }
複製程式碼

案例2:人員管理程式,增加[禁用]當前行按鈕,點選[禁用]將狀態設定為 禁用 ,顯示為紅色,禁用後
顯示為[啟用],點選[啟用]後將顏色去除,顯示為[禁用],狀態顯示為啟用

1.先增加兩個SQL語句,用於更改當前使用者的狀態
update T_User set Status = '禁用' where id = @id //方法名為 DisableById
update T_User set Status = '啟用' where id = @id //方法名為 EnableById

2.Repeater配置

複製程式碼
<HeaderTemplate><table><tr class="head"><td>使用者</td><td>狀態</td><td>操作</td></tr></HeaderTemplate>
  <ItemTemplate><tr id="trRow" runat="server">
  <td><%#Eval("UserName") %></td><td><%#Eval("Status") %></td>
  <td><asp:Button runat="server" ID="Enabled" Text="啟用" OnClientClick="return confirm('你確認啟用該使用者?')" 
  CommandName="Enabled" CommandArgument='<%#Eval("Id") %>' /><asp:Button runat="server" ID="Disable" Text="禁用" 
  OnClientClick="return confirm('你確認禁用該使用者?')" CommandName="Disabled" CommandArgument='<%#Eval("Id") %>' />
  </td></tr></ItemTemplate>
  <FooterTemplate></table></FooterTemplate>
複製程式碼

3.增加一個CSS樣式

    <style type="text/css">
        .disableRow{ background-color:Red;}
    </style>

4.ItemDataBound事件

複製程式碼
//對於Header等則不處理,必須要判斷AlternatingItem,因為預設是加入這個的
   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
   {
         DataRowView rowView = (DataRowView)e.Item.DataItem;    //將當前物件轉換成 DataRowView
         var userRow = (人員管理.DAL.DataSetT_User.T_UserRow)rowView.Row; //獲得當前行成員

          if (userRow.Status == "禁用")        //如果狀態是禁用,則設定它的一些樣式
           {
             HtmlTableRow trRow = (HtmlTableRow)e.Item.FindControl("trRow"); //獲得trRow的控制元件
             trRow.Attributes["class"] = "disableRow";        //增加一個calss屬性

             Button btnenable = (Button)e.Item.FindControl("Enabled"); //獲得Enabled控制元件
             Button btndisable = (Button)e.Item.FindControl("Disable"); 

             btnenable.Visible = true;        //將btnenable設定為顯示
             btndisable.Visible = false;    //將btndisable設定為不顯示
          }
           else if(userRow.Status == "啟用")    
            {
             HtmlTableRow trRow = (HtmlTableRow)e.Item.FindControl("trRow");
             trRow.Attributes["class"] = "";    //設定無樣式

             Button btnenable = (Button)e.Item.FindControl("Enabled");  
             Button btndisable = (Button)e.Item.FindControl("Disable");

             btnenable.Visible = false;        //與上面相反
             btndisable.Visible = true;
            }
            else                //為了程式的嚴整性
            {
             throw new Exception("狀態有誤!"); //丟擲異常
            }
    }
複製程式碼

5.ItemCommand事件

複製程式碼
 if (e.CommandName == "Enabled")    //如果CommandName為 Enable
            {
                int id =int.Parse(e.CommandArgument.ToString());    //獲得CommandArgument值
                T_UserTableAdapter adpter = new T_UserTableAdapter();    //new 一個adpter
                adpter.EnableById(id);    //使用自定義SQL方法怎麼資料修改
                Repeater1.DataBind();    //再次繫結資料
            }
            else if(e.CommandName == "Disabled")    //同上相反
            {
                int id = int.Parse(e.CommandArgument.ToString());
                T_UserTableAdapter adapter = new T_UserTableAdapter();
                adapter.DisableById(id);
                Repeater1.DataBind();
            }
複製程式碼 ListView 控制元件

Repeater一般只用來展示資料,如果要增刪改查則用ListView更方便,使用嚮導(強型別資料)
LayoutTemplate為佈局模板,其中必須有一個ID為 itemPlaceholder 的服務端控制元件,什麼型別無所謂
不會被顯示,itemPlaceholder前面就是根相當於Repeater中的HeaderTemplate,itemPlaceholder後
面就是相當於Repeater中的FooterTemplate,因此ListView中沒有這兩個模板itemTemplate是每一項的模板,
AlternatingltemTemplate是隔行顯示的模板,和Repeater一樣
EmptyDataTemplate為資料來源沒有資料的時候顯示的內容,可實現"沒有查詢到結果","對不起,找不到你要的資料"等,
InsertItemTemplate為插入資料介面的模板,
EditltemTemplate為編輯資料的模板,
SelectedltemTemplate為標記為Selected的行的模板

在ListView中有些是用 <%#bind() %> 進行資料雙向繫結的,更新就是這樣實現的

在ListView中使用ItemDataBound為每行資料進行處理
注意:
1.判斷資料行的型別e.Item.ItemType ListViewItemType.DataItem
2.取得行對應的DataRowView

 ListViewDataItem lvDataItem = (ListViewDataItem)e.Item;
 DataRowView rowView = (DataRowView)lvDataItem.DataItem;

3.在FindControl的時候注意AlternatingItemTemplate的問題,將它的id與ItemTemplate的ID一樣

案例:將狀態為"禁用"的資料背景改色

先將 ItemTemplate 與 AlternatingItemTemplate 的<tr>的ID設定為一樣,否則會有問題

複製程式碼
if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            ListViewDataItem lvDataItem = (ListViewDataItem)e.Item; //必須先轉換,除錯可得
            DataRowView rowView = (DataRowView)lvDataItem.DataItem; 
            var userRow = (TEST.DAL.DataSetTEST.T_UserRow)rowView.Row;
            if (userRow.Status == "禁用")            //檢測狀態是否為 "禁用"
             {
                HtmlTableRow trRow = (HtmlTableRow)e.Item.FindControl("trRow"); //取得控制元件ID
                trRow.Attributes["class"] = "disabled";        //設定樣式
             }
        }
複製程式碼

在ListView中可以使用Validator 驗證控制元件,只要將Validator放入相應的模板中,將Validator手動
設定要驗證的控制元件ID,然後設定相應按鈕,控制元件,Validator為同樣的ValidationGroup,防止不兩隻模板
中的Validator互相干擾,將Cancel按鈕(取消)的CausesValidation="false" 達到一取消就返回

新增資料行的預設值:響應ListView的ItemCreated事件(第一行在頁面上的建立都會觸發該事件)
當e.Item.ItemType為InsertItem的時候通過FindControl找到控制元件然後初始化

如:給年齡設預設值:ItemCreated事件

    if (e.Item.ItemType == ListViewItemType.InsertItem)//判斷是否為InsertItem型別
     {
           TextBox AgeBox = (TextBox)e.Item.FindControl("AgeTextBox"); //獲取年齡控制元件
           AgeBox.Text = "20"; //設定插入的預設值
     }

插入資料的初始化: 注意和"新增資料行"不同,插入資料的初始化是在使用者點選"插入"之後執行,如果
主鍵為Guid,則需要在資料插入資料庫之前為主鍵賦值,響應ListView的Itemlnserting事件
該事件是將一些插入資料庫之前的對資料進行調整的程式碼
e.Values為所有欄位的鍵值對,可以讀取插入的值,也可以向欄位中寫值,這樣就可以為ID賦值
e.Values["id"]=Guid.NewGuid() ,在這個事件中對資料進行校驗,可以通過e.Cancel = true 來取消
非法資料插入,注意:ObjectDataSource繫結ID為Guid型別的時候會生成一個"DataObjectTypeName="System.Guid""的東西,有問題的話,刪掉就行

如:用程式給ID值設定Guid,如果使用者名稱為xgao,將不給插入

     e.Values["id"]=Guid.NewGuid();            //新建一個 Guid 傳給當前id欄位
     if (e.Values["UserName"].ToString() == "xgao")    //判斷使用者名稱
     {
         e.Cancel = true;                //取消資料插入
     }

更新之前的處理:就像資料插入前可以在ItemInserting事件中處理一樣,可以在ItemUpdating事件中
對更新過程進行處理
e.ItemIndex可以取到當前更新行的行號
e.OldValues可以取到更新前的值
e.NewValues可以取到更新後的值
e.Cancel = true來取消非法資料插入

如:更新的使用者名稱長度不能為 9 個以上

 if (Convert.ToInt32(e.NewValues["UserName"].ToString().Length) > 9) //當長度大於9時
      {
          Response.Write("<script>alert('使用者長度不能大於9!')</script>");
          e.Cancel = true;        //取消資料插入
       }

ListView 行命令按鈕

ListView的行按鈕和Repeater一樣,不同的是取當前行資料的方式,
int num = ((ListViewDataItem)e.Item).DisplayIndex 取出操作行的行號
ListView1.DataKeys[num].Value 取也主鍵的值,如果對資料進行了操作,最後對ListView執行DataBind繫結
可以多個主鍵(和資料庫主鍵沒直接關係),所有有Values,是由ListView的 DataKeyNames="id" 值來決定

排序:將LayouTemplate中的表頭用
<asp:LinkButton runat="server" CommandName="Sort" Text="id" CommandArgument="id" />控制元件代替,
其中CommandArgument的值為排序欄位只要是CommandName,CommanArgument對就行,展現成什麼,顯示在哪兒都可以

案例:漲一歲 按鈕

1.自定義SQL方法(年齡加1的方法)
update T_person SET age = age+1 where [email protected]

2.在ItemTemplate 最後加入

<asp:Button runat="server" ID="INC" CommandName="IncAge" Text="加一歲" />

3.在ListView1的 ItemCommand 事件寫如下程式碼

複製程式碼
  int num = ((ListViewDataItem)e.Item).DisplayIndex;    //取得前行號
  int id = (int)ListView1.DataKeys[num].Value;        //取當前操作行的主鍵值
  if (e.CommandName == "IncAge")        //判斷當前控制元件的CommandName是否為IncAge
   {
       T_personTableAdapter adpater = new T_personTableAdapter();
       adpater.IncAgeById(id);    //利用自定義SQL語句進行 年齡加1
       ListView1.DataBind();    //資料繫結
   }
      
複製程式碼 DropDownList控制元件

ListView中是無法像TextBox等控制元件那樣將DropDownList的選中值繫結到資料的欄位,必須程式設計處理
如果要實現 "----請選擇-----" 每次都有的話,得先在Items增加這個值,再設定AppendDataBoundItems為True就行了

如:人員的性別(男,女,保密),三個值固定定在DropDownList中

1. 在顯示資料的時候DropDownList顯示資料的值,在ItemTemplate中加入DropDownList,設定Enabled="false"
這樣就是隻讀的,在ItemDataBound事件中e.Item.FindControl()來找到DropDownList控制元件,然後
ListViewDataItem lvData = (ListViewDataItem)e.item;
DataRowView rowView=(DataRowView)lvDataItem.DataItem; //取到DataRowView進而取到DataRow
讀取資料的值,然後賦值給DropDownList的SelectedValue屬性
2. 在插入資料的時候設定DropDownList對應的欄位的值,響應ItemInserting事件,通過e.Item.FindControl
找到DropDownList控制元件,然後通過e.Values設定值
3. 在資料更新的時候設定DropDornList對應的欄位的值,響應ItemUpdating事件,通過ListViewDataItem DataItem

複製程式碼
//DropDownList 顯示時用 ItemCreated 事件
 DropDownList ddlStatus = (DropDownList)e.Item.FindControl("ddlStatus");
 if (ddlStatus != null)        //如果沒有找到ddlStatus ,就認識不是EditTemplete
   {
          ListViewDataItem lvData = (ListViewDataItem)e.Item;
          DataRowView rowView = (DataRowView)lvData.DataItem;
          if (rowView != null) //如果取到的話
           {
               var userRow = (TEST.DAL.DataSetTEST2.T_UserRow)rowView.Row;
               ddlStatus.SelectedValue =    
           }
   }

 //DropDownList 插入時用 ItemInserting 事件
 DropDownList ddlStatus = (DropDownList)e.Item.FindControl("defalutStatus");
 e.Values["Status"] = ddlStatus.SelectedValue;    //e.Values[]  賦值操作

 //DropDownList 更新時用 ItemUpdating 事件

 DropDownList ddlStatus = (DropDownList)ListView1.Items[e.ItemIndex].FindControl("ddlStatus");
 e.NewValues["Status"] = ddlStatus.SelectedValue;  //e.NewValues[] 更新資料後賦值操作
複製程式碼 DataPager 分頁控制元件

ListView搭配DataPager控制元件實現分頁,有兩種使用方式,一種是將DataPager宣告到ListView中
別一種是DataPager,ListView沒有巢狀關係,然後將DataPager的PagedControllD設定為要分頁
的ListView,沒什麼區別,一般用"配置ListView"自動生成的方式即可,DataPager的PageSize屬性
為一頁的條數
(*)實現 IPagebleItemContainer介面的控制元件都可以使用DataPager,但是目前只有ListView實現該介面
DataPager中按鈕顯示風格由Fields中的欄位設定,可以放置多個欄位,分為"NextPreviousPagerField"
(下一頁,下一頁,首頁,末頁),"NumericPagerField"(數字頁號),"TemplatePagerField"使用者模板自定義
程式碼中選擇相應的Field,在屬性檢視中就可以快速修改它們的屬性

 高效率分頁

ListView預設的分頁是先從資料來源取得所有資料,然後再擷取當前頁面的部分,在資料量非常大的情況
下效率非常代,因此預設分頁基本不用,應該是隻從資料來源取得要顯示的資料
複習:SQL中語句中取得分頁資料 ,SQL語句中獲得每一行序號的方法:
select Id, UserName row_number()over(order by id) from T_User
其中row_number()函式是SQL2005之後提供的一個計算結果集行號的函式(不是表的行號),
over()是指定排序規則

案例:取得第11到20的資料(條數從0開始)的方法,使用子查詢用行號進行兩次處理

select * from (SELECT Id, UserName row_number()over(order by id)rownum 
FROM T_User)t
where t.rownum>10 and t.rownum<=20

在強型別DataSet中增加取得所胡資料條數的方法QueryCount,增加取得指定行數範圍資料的方法GetPageData

select * from
(select id,name Row_Number()over(order by id)rownum from T_User)t
where t.rownum>@startRowIndex and t.rownum<=@startRowIndex+@maximumRows

由於資料集編輯器不支援(不會自動生成一些東西)Row_Number(),所以建立完成後需要手動在GetPagedData
屬性的Parameters中增加兩個引數:
startRowIndex 與 maximumRows(引數名必須是這兩個,這是由ObjectDataSource的StartRowIndexParamterName,
MaximumRowsParamterName確定的,一般不需要改),都是 Int32型別

ObjectDataSource中EnablePaging屬性設定為true,SelectCountMethod設定為QueryCount,SelectMethod
設定為GetPagedData,都是自定義的SQL方法
如果出錯的話看看是不是沒有放置內建的DataPager或者外接的DataPager的PagedControllD沒有指向ListView
先按照正常的流程配置ObjectDataSource,讓它自動生成Template,
再修改ObjectDataSource的EnablePaging="True",SelectCountMethod設定為取得行數的方法
DataPager預設是用PostBack機制,顯示不到地址中,不利於網友共享,只要指定QureyStringField屬性
就可以實現超連結形式的分佈連結

單獨頁面編輯

istView的在位編輯只適合欄位較少,比較簡單的場合,複雜資料的編輯,插入,檢視等要在單獨頁面中
建立一個單獨的頁面edit.aspx,然後在ListView頁面中的編輯放一個編輯的