數據綁定分爲:數據源 和 數據綁定控件 兩部分,數據綁定控件經過數據源來得到數據,經過數據源來
隔離數據提供者和數據使用者,數據源有:
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等這些控件的大統一者,那些控件的優勢它都有css
ObjectDataSource 用來將一個類作爲數據源,TypeName屬性爲數據源類的全名,
有DeleteMethod,InsertMethod,SelectMethod,UpdateMethod等幾個屬性,分別爲類中刪除,插入,查詢,更新數據的方法名
這些方法可能有參數,參數的值是經過DeleteParameters,UpdateParameters,InserParameters等嵌套設置數據庫
手工編寫ObjectDataSource太麻煩,使用界面來完成,將ObjectDataSource拖放到界面上,在右上角選擇
"配置數據源"便可進行配置,數據源類通常用 數據集 就能夠,生成完後,在「配置數據源」中就能看到了編程
選擇
DataKeyNames屬性
DataKeys屬性
取選中行的數據
取DataKey
單一Key
複合Key
取非Key列
默認方法:Cells[0].Text
使用模板裏的控件(複雜列)---在」模板裏講」服務器
---- 處理事件編輯器
RowCommand
在 GridView 控件中單擊某個按鈕時發生。此事件一般用於在該控件中單擊某個按鈕時執行某項任務。函數
RowDataBound
在 GridView 控件中的某個行被綁定到一個數據記錄時發生。此事件一般用於在某個行被綁定到數據時修改該行的內容。佈局
RowCreated
在 GridView 控件中建立新行時發生。此事件一般用於在建立某個行時修改該行的佈局或外觀。ui
DataBound
此事件繼承自 BaseDataBoundControl 控件,在 GridView 控件完成到數據源的綁定後發生。this
------上面是經常使用的url
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(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')%> 的前面不能加任何東西,否則會將<符編譯成<
若是要解決能夠這樣:建一個轉換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來取得控件
//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"; //設定定義好的樣式 }
在 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 id=@id //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(); }
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 id=@id
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(); //數據綁定 }
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[] 更新數據後賦值操做
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頁面中的編輯放一個編輯的超連接,向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); //更改模式爲 編輯模式 } }