1. 程式人生 > >ASP.NET數據綁定控件

ASP.NET數據綁定控件

語句 刷新 ted 生成 應用 ces 個數 只讀 隔行變色

數據綁定控件簡介

數據綁定分為:數據源 和 數據綁定控件 兩部分,數據綁定控件通過數據源來獲得數據,通過數據源來
隔離數據提供者和數據使用者,數據源有:
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="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="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<[email protected][email protected]

由於數據集編輯器不支持(不會自動生成一些東西)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頁面中的編輯放一個編輯的超鏈接,向edit.aspx傳遞
?id=1&action=edit 頁面頂端增加一個edit.aspx?action=addnew 的超鏈接
使用FormView控件進行單條數據的編輯,在Page_Load中判斷action,然後使用FormView1.ChangeMode
方法切換FormView的模式
在強類型DataSet中增加一個GetDataByid方法,在ObjectDataSource中選擇這個方法為Select參數
參數源為QueryString,QueryStringField為id
在元素插入,修改完成(Inserted,Updated事件)後重定向到列表頁面

在edit.aspx中做如下判斷:

技術分享
if (!IsPostBack)
 {
      string action = Request["action"];
       if (action == "edit")                //是否為 edit 模式
       {
           FormView1.ChangeMode(FormViewMode.Edit);    //更改模式為 編輯模式
       }
       else if (action == "new")            //是否為 new 模式
       {
           FormView1.ChangeMode(FormViewMode.Insert);    //更改模式為 編輯模式
       }    
       else if (action == "view")            //是否為 view 模式
       {
           FormView1.ChangeMode(FormViewMode.ReadOnly);    //更改模式為 編輯模式
       }
}
技術分享

ASP.NET數據綁定控件