1. 程式人生 > >JQUERY和AJAX學習

JQUERY和AJAX學習

1、ADO.net中加一段神奇的程式碼: string dataDir = AppDomain.CurrentDomain.BaseDirectory; if (dataDir.EndsWith(@"\bin\Debug\")||dataDir.EndsWith(@"\bin\Release\")) { dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; AppDomain.CurrentDomain.SetData("DataDirectory",dataDir); }

2、專案內嵌mdf檔案的連線字串: @"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|Database1.mdf;Integrated Security=True;User Instance=True"

3、window.event.keyCode ascii碼說明: 8:退格鍵 46:delete 37-40:方向鍵 48-57:小鍵盤區的數字 96-105:主鍵盤區的數字 110、190:小鍵盤區和主鍵盤區的小數點 189、109:小鍵盤和主鍵盤區的負號 13:回車 9:tab 就是那個把焦點移到下一個文字框的東東 例子:

 

JQUERY

 

1、$(document).ready(function(){alert(“載入完畢!”);});//註冊事件的函式,和普通的dom不一樣,不需要在元素上標記on**這樣的事件。

    當頁面Dom元素載入完畢時執行程式碼,可以簡寫為:

    $(function(){alert(“載入完畢!”);})

    和onload類似,但是onload只能註冊一次(沒有C#中的+=機制),後註冊的取代先註冊的,而 ready則可以多次註冊都會被執行。

    JQUERY的ready和Dom的onload的區別:onload是所有Dom元素建立完畢、圖片、Css等都載入完畢後才被觸發,而ready則是Dom元素建立完畢後就被觸發,這樣可以提高網頁的相應速度。在JQUERY中也可以用$(window).load()  來實現onload那種事件呼叫的時機。

也可以直接載入匿名函式: $(function(){alert(“載入完畢”);});

2、JQUERY提供的函式

$.map(array,fn)對陣列array中每個元素呼叫fn函式逐個進行處理,fn函式將處理返回,最後得到一個新陣列。例子:得到一個元素值是原陣列二倍的新陣列:var arr=[3,5,9];

       Var arr2=$.map(arr,function(item)(return item*2));

$.map不能處理.Dictionary風格陣列。

$.each(array,fn)  對陣列array每個元素呼叫fn函式進行處理,沒有返回值:var arr={“tom”:”湯姆”,”jerry”:”傑瑞”,”lily”:”莉莉”};

     $.each(arr,function(key,value){alert(key+”=”+value);});

如果是普通風格的陣列,則key的值是序號。

    還可以省略function的引數,這時候用this可以得到遍歷的當前元素:

Var arr=[3,6,9];

$.each(arr,function(){alert(this);});

 

3、jQuery物件、Dom物件

jQuery物件就是通過jQuery包裝Dom物件後產生的物件:

如:alert($(‘#div1’).html());

$(‘#div1’).html()等價於:document.getElementById(“div1”).innerHTML;

$(‘#div1’)得到的就是jQuery物件,jQuery物件只能呼叫jQuery物件封裝的方法,不能呼叫Dom物件的方法,Dom物件也不能呼叫jQuery物件的方法,所以alert($(‘#div1’).innerHTML是錯的,因為innerHTML是Dom物件的屬性。

將Dom物件轉換為jQuery物件的方法:$(Dom物件);當呼叫jQuery沒有封裝的方法的時候必須用Dom物件,轉換方法:

Var domobj=jqobj[0]  或者  var domobj=jqobj.get(0)

jQuery修改樣式:$(‘#div1’).css(“background”,”red”);

獲得樣式:$(‘#div1’).css(“background”);

修改value:$(“#un”).val(“abc”),

獲得value: $(“#un”).val(),

類似的獲得、設定innerText、innerHTML用text()和html().

4、jQuery選擇器1

jQuery選擇器用於查詢滿足條件的元素,比如可以用$(“#控制元件Id”)來根據控制元件id獲得控制元件的jQuery物件,相當於getElementById:

    $(“#div1”).html(“<font color=red>hello</font>”)

    $(“TagName”)來獲取所有指定標籤名的jQuery物件,相當於ggetElementsByTagName:

    $(function(){$(“#btnClick”).click(function(){$(“p”).html(“我們都是P”)});});

5、jQuery選擇器2

    Css選擇器,同時選擇擁有樣式的多個元素:

        <style type=”text/css”>

            .test{/style>
        <script type=”text/javascript”>

$(function()){$(“.test”).click(function(){alert($(this).text());});});

</script>

<p class=”test”>test1</p>

<p class=”test”>test2</p>

<p class=”test”>test3</p>

6、jQuery選擇器3

多條件選擇器:$(“p,div,span.menuitem”),同時選擇p標、div標籤和擁有menuitem樣式的span標籤元素。

注意選擇器表示式中的空格不能多不能少。

層次選擇器:

    (1)$(“div li”)獲取div下的所有li元素(後代,子、子的子…)

(2)$(“div>li”)獲取div下的直接li子元素

(3)$(“.menuitem + div”)獲取樣式名為menuitem之後的第一個div元素(不常用)

(4)$(“.menuitem~div”)獲取樣式名為menuitem之後所有的div元素(不常用)

7、jQuery的迭代

    如何判斷物件是否存在,jQuery選擇器返回的是一個物件陣列,呼叫text()、html()、click()之類的方法的時候其實是對陣列中每個元素迭代呼叫每個方法,因此即使通過id選擇的元素不存在也不會報錯,如果需要判斷指定的id是否存在,應該寫:

    If($(“#btn1”).length<=0){

        Alert(“id為btn1的元素不存在!”);

    }

8、節點遍歷

    Next()方法用於獲取節點之後的第一個同輩元素,$(“.menuitem”).next(“div”)、nextAll()方法用於獲取節點之後的所有同輩元素,$(“.menuitem”).nextAll(“div”)

    Siblings()方法用於獲取所有同輩元素,$(“.menuitem”).siblings(“li”)

案例:選中的p變色

案例:評分控制元件

$(function(){

    $(“#ratings td”).html(“<img src=’images/starEnpty.jpg’>”)

    .mouseover(function(){$(this).html(“<img src=’images/starEnpty.jpg’/>”);$(this).siblings().html(“<img src=’images/starFill.jpg’/>”);$(this).nextAll().html(“<img src=’images/starEmpty.jpg’/>”)

})

})

9、鏈式程式設計

高亮選中項:給所有有meuitem這個樣式的元素新增click監聽事件,當click的時候,向被點選的元素新增highlight這個樣式,然後從其兄弟節點(siblings)中移除highlight風格。

    <style type=”text/css”>

        .menuitem{}

        .highlight{background-color:Red;}

    </style>

    $(function(){

    $(“.menuitem”).click(function(){

    $(this).addClass(“highlight”).siblings().removeClass(“highlight”);

})

})

<p class=”menuitem”>111111<p/><br/>

<p class=”menuitem”>111111<p/><br/>

<p class=”menuitem”>111111<p/><br/>

10、基本過濾選擇器

    :first選取第一個元素。$(“div:first”)選取第一個<div>

    :last選取最後一個元素。$(“div:last”)選取最後一個<div>

    :not(選擇器)選取不滿足“選擇器”條件的元素,$(“input:not(.myClass)”)選取樣式名不是myClass的<input>.

    :even、:odd,選取索引是奇數、偶數的元素:$(“input:even”)選取索引是奇數的<input>

    :eq(索引序號)、:gt(索引序號)、:lt(索引序號)選取索引等於、大於、小於索引序號的元素,比如$(“input:lt(1)”)選取索引小於1的<input>.

    $(“:header”)選取所有的h1……h6元素。

    $(“div:animated”)選取正在執行動畫的<div>元素。

11、過濾器

屬性過濾選擇器:

    $(“div[id]”)選取有id屬性的<div>

    $(“div[title=test]”)選取title屬性為test的<div>

    $(“div[title!=test]”)選取title屬性不為test的<div>

表單物件選擇器:

    $(“form1:enabled”)選取id為form1的表單內所有啟用的元素

    $(“form1:disabled”)選取id為form1的表單內所有禁用的元素

    $(“input:checked”)選取所有選中的元素(Radio、CheckBox)

    $(“select:selected”)選取所有選中的選項元素(下拉列表)

12、元素的each

jQuery元素也可以呼叫each方法,只是對$.each的簡化呼叫。

顯示選中的複選框資訊:

    $(function(){

        $(“inut[name=names]”).click(function(){

    Var names=$(“input[name=names]:checked”);

    Var arr=new Array();

    Names.each(function(key,value){arr[key]=$(value).val();});

    $(“#msgNames”).text(“共選中”+names.length+”條:”+arr.join(“.”))

})

})

<input type=”checkbox” name=”names” value=”tom”/>tom

<input type=”checkbox” name=”names” value=”jim”/>jim

<input type=”checkbox” name=”names” value=”lily”/>lily

<p id=”msgNames”></p>

13、jQuery的Dom操作

(1)、使用html()方法讀取或者設定元素的innerHTML:

    Alert($(“a:first”).html());

    $(“a:first”).html(“hello”);

(2)、使用text()方法讀取或者設定元素的innerText:

    alert($(“a:first”).text());

    $(“a:first”).text(“hello”);

(3)、使用attr()方法讀取或者設定元素的屬性:

    Alert($(“a:first”).attr(“href”));

    $(“a:first”).attr(“href”,”http://www.rupeng.com”);

(4)、使用removeAttr刪除屬性。

14、動態建立Dom節點

使用$(html字串)來建立Dom節點,並且返回一個jQuery物件,然後呼叫append等方法將新建立的節點新增到Dom中:

    Var link=$(“<a href=’http://www.baidu.com’>百度</a>”);

    $(“div:first”).append(link);

$()建立的就是一個jQuery物件,可以完全進行操作

    Var link=$(“<a href=’http://www.baidu.com’>百度</a>”);

    Link.text(“百毒”);

    $(“div.first”).append(link);

Append方法用來在元素的末尾追加元素;

Prepend,在元素的開始新增元素;

After,在元素之後新增元素(新增兄弟);

Before,在元素之前新增元素(新增兄弟);

例子:動態載入網址

<script type=”text/javascript”>

$(function(){

    Var data={“百度”:”http://www.baidu.com”,”新浪”:”http://www.sina.com”};

    $.each(data,function(key,value){

    Var tr=$(“<tr><td>”+key+”</td><td><a href=”+value+”>”+key+”</a></td></tr>”);

$(“#tableSites”).append(tr);

})

});

</script>

<table id=”tableSites”>

</table>

15、節點操作

替換節點:$(“br”).replaceWith(“<hr/>”);

將<br/>替換為<hr/>

包裹節點:wrap()方法用來將所有元素逐個用指定標籤包裹;

$(“b”).wrap(“<font color=’red’></font>”)將所有粗體字紅色顯示。

16、樣式操作

獲取樣式:attr(“class”)

設定樣式:attr(“class”,”myclass”)

追加樣式:addClass(“myclass”)

移除樣式:removeClass(“myclass”)

切換樣式:toggleClass(“myclass”),如果沒有樣式則新增樣式,如果存在樣式則去掉樣式。

判斷樣式是否存在:hasClass(“myclass)

17、RadioButton操作

取得RadioButton的選中值:

    $(“input[name=gender]:checked”).val()

        <input id=”Radio2” checked=”checked”name=”gender”type=”radio”value=”男”/>男

<input id=”Radio1” checked=”checked”name=”gender”type=”radio”value=”女”/>女<input id=”Radio3” checked=”checked”name=”gender”type=”radio”value=”未知”/>未知

設定RadioButton的選中值:

    $(“input[name=gender]”).val([“女”]);

或者:$(“:radio[name=gender]”).val([“女”]);

注意:val中的引數[]不能省略。

對RadioButton的選擇技巧對於CheckBoxhe Select列表框也使用。

除了可以使用val批量設定RadioButto、CheckBox等的選中以外,還可以設定checked屬性來單獨設定控制元件的迴圈中狀態。

    $(“#btn1”).attr(“checked”,true)

18、事件

JQuery中的事件繫結:$(“#btn”).bind(“click”,function()),每次都這麼呼叫太麻煩,所以jQuery可以用$(“#btn”).click(function())來進行簡化。

合成事件hover,hover(enterfn,leavefn),當滑鼠放在元素上時呼叫enterfn 方法,當滑鼠離開元素的時候呼叫leavefn方法。

事件冒泡:jQuery中也像javaScript一樣是事件冒泡。

呼叫事件物件的stopPropagation()方法終止冒泡。

$(“tr”).click(function(e){alert(“tr被點選”);e.stopPropagation();});//注意函式的引數是e

阻止預設行為:有的元素有預設行為,比如超連結點選後會轉向新連線、提交按鈕預設會提交表單,如果向阻止預設行為只要呼叫事件物件的preventDefault()方法。

$(“a”).click(function(e){alert(“所有連線暫時全部禁止點選”);e.preventDefault();});

19、事件其他:

屬性:pageX、pageY、target獲得觸發事件的元素、which如果是滑鼠事件獲得按鍵(1左鍵、2中鍵、3右鍵)。AltKey、shiftKey、ctrlKey獲得alt、shift、ctrl是否按下,為bool值。KeyCode、charCode屬性發生時間時的keyCode、charCode。

移除事件繫結:bind()方法即可移除元素上所有繫結的事件,如果bind(“click”)則只移除click事件的繫結。

一次性事件:如果繫結的事件只想執行一次後立即unbind可以使用one()方法進行事件繫結。

20、滑鼠

獲得發生事件時的滑鼠位置:

    $(document).mousemove(function(e){

        Document.title=e.pageX + “,” + e.pageY;

});

    在mousemove、click等事件的匿名相應函式中,如果指定一個引數e,那麼就可以從e讀取發生事件時的一些資訊,比如對mousemove等滑鼠事件來說,就可以讀取e.pageX,e.pageY來獲得發生事件時滑鼠在頁面的座標。

21、動畫

Show(),hide()方法會顯示、隱藏元素。用toggle()在顯示、隱藏之間切換:

$(“:button[value=show]”).click(function(){$(“div”).show();});

$(“:button[value=hide]”).click(function(){$(“div”).hide();});

如果show,hide方法不帶引數則是立即顯示、立即隱藏,如果指定速度引數,則會用指定時間進行動態顯示、隱藏,單位為毫秒,也可以用三個內建速度:

Fast(200毫秒)、normal(400毫秒)、slow(600毫秒),jQuery動畫函式中需要速度的地方一半也可以使用這三個值。

22、jQuery Cookie使用

使用方法:1、新增jQuery.coolie.js

            2、設定值,$.cookie(‘名字’,’值’)。Cookie中儲存的值都是文字。        3、讀取值,var v=$.cookie(‘名字’)

 

設定值的時候還可以指定第三個引數,$.cookie(‘名字’,’值’,{expires:7,path:’/’,domain:’itcast.cn’,secure:true}),expires表示要求瀏覽器保留Cookie幾天,這個值只是給瀏覽器的建議,可能沒到事件就已經被清除了。可以實現“勾選【記錄我的使用者名稱10天】”的功能。

23、Request物件

(1)Request.AppRelativeCurrentExecutionFilePath,獲取當前執行請求相對於應用根目錄的虛擬路徑,以~開頭,比如“~/Handler.ashx”。

(2)Request.PhysicalApplicationPath,獲取當前應用的物理路徑,比如D:\我的文件\Visual Studio 2008\WebSites\WebSite4\

(3)Request.PhysicalPath,獲取當前請求的物理路徑,比如D:\我的文件\Visual Studio 2008\WebSites\WebSite4\Handler.ashx

(4)Request.RawUrl獲得原始請求URL、Request.Url獲得請求的Url,區別涉及到URL重寫問題。

(5)Request.UrlReferrer網頁的來源,可以根據這個判斷從百度搜的那個關鍵詞、防下載盜鏈、防圖片盜鏈,可以偽造。“本圖片僅供如鵬網內部交流使用”,在DZ中測試。全域性防盜鏈用Globals.asax

(6)Request.UserHostAddress獲得訪問者的IP地址

(7)Request.UserLanguages獲得訪問者的瀏覽器支援語言,可以通過這個實現對不同語言的人顯示不同語言頁面。

(8)Request.Cookies獲取瀏覽器發過來的瀏覽器端的Cookie,從它裡面讀取Cookie值,比如context.Request.Cookies[“mysessionid”],使用Request.Cookies的時候一般只是讀取,將Cookie寫會到瀏覽器要用Response.Cookies.

(9)Request.MapPath(virtulPath)將虛擬路徑轉換為磁碟上的物理路徑,Request.MapPath(“~/a/b.aspx”)將會得到D:\2008\WebSites\WebSite4\a\b.aspx

24、Response物件

響應的緩衝輸出:為了提高伺服器的效能,ASP.Net向瀏覽器Write的時候預設並不會每Write一次都會立即輸出到瀏覽器,而是會快取資料,到合適的時機或者響應結束才會將快取區中的資料一起傳送到瀏覽器。

Response物件的主要成員:

(1)   Response.Buffer、Response.BufferOutput:經過Reflector反編譯,發現兩個屬性是一樣的,Buffer內部就是呼叫BufferOutput。這個屬性用來控制是否採用響應快取,預設是True。

(2)   Response.Flush()將快取區中的資料傳送給瀏覽器。這在需要將Write出來的內容立即輸出到瀏覽器的場合非常使用。案例:大批量資料的匯入,顯示正在匯入第*條資料,用Thread.Sleep模擬耗時。

(3)   Response.Clear()清空快取區中的資料,這樣在快取區中的沒有傳送到瀏覽器端的出具被清空,不會被髮送到瀏覽器。

(4)   Response.ContentEncoding輸出流的編碼。

(5)   Response.ContentType輸出流的內容型別,比如是html(text/html)還是普通文字(text/plain)還是JPEG圖片(image/JPEG)。

(6)   Response.Cookies返回給瀏覽器的Cookie的集合,可以通過它設定Cookie

(7)   Response.OutputStream輸出流,在輸出圖片、Excel檔案等非文字內容的時候要用它

(8)   Response.End()終止響應,將之前快取中的資料發給瀏覽器,End()之後的程式碼不會被繼續執行。在終止一些非法請求的時候,比如盜鏈等可以用End()立即終止請求。

(9)   Reaponse.Redirect(url)重丁香瀏覽器到新的網址,即可以重定向到站外網址也可以重丁香到站內網址。Response.redirect(“http://www.rupent.com”)、Reponse.Redirect(“a.htm”)。Redirect是向瀏覽器發回302重定向,是通知瀏覽器“請重新訪問url這個網址”和瀏覽器接到命令訪問新網址的過程。使用HttpWatch檢視整個響應過程的Http報文。用Redirect因為是瀏覽器自己去重新訪問新的網址,所以在位址列中是可以看到網址的變化的。

(10)  Response.SetCookie(HttpCookie cookie),向輸出流中更新寫到瀏覽器中的Cookie,如果Cookie存在就更新不存在就增加。是對Response.cookie的簡化呼叫。

(11)  Response.Write()向瀏覽器輸出內容。

(12)  Response.WriteFile(filename)向瀏覽器輸出檔案。比如Response.Write(“c:/boot.ini”)。

25、Server物件

Server是context的一個屬性,是HttpServerUtility類的一個物件。

Server.HtmlDecode()、Server.HtmlEncode()、Server.UrlEncode()、.UrlDecode()是對HttpUtility類中相應方法的一個代理呼叫。個人推薦總是使用HttpUtility,因為有的地方很難拿到Server物件。

        Server.Transfer(path)內部重定向請求,Server.Transfer(“JieBanRen.aspx”)將使用者的請求重定向給JieBanRen.aspx處理,是伺服器內部的接管,瀏覽器是意識不到這個接管的,不是象Response.Redirect那樣經歷“通知瀏覽器”請重新訪問url這個網址和瀏覽器接到命令訪問新網址的過程“,因此瀏覽器位址列不會變化。因為是內部接管,所以在被重定向到的頁面中是可以訪問到Request、Cookie等這些來源頁面接受的引數的,就像這些引數是傳遞給他的。注意Transfer是內部接管,因此不能像Redirect那樣重定向到外部網站。

    使用Server.Transfer不能直接重定向到ashx,否則會報錯“執行子請求出錯”。

    有的時候不能拿到HttpContext物件,比如在Global.asax中(後面講),可以通過HttpContext.Current拿到當前的HttpContext,進而拿到Response、Request、Server等。

    Server.MapPath.

26、HttpHandler實現檔案下載

如果HttpHandler輸出的是Html、txt、jpeg等型別的資訊,那麼瀏覽器會直接顯示,如果希望彈出半寸對話方塊,則需要新增Header:string encodeFileName=HttpUtility.UrlEncode(“過濾詞.txt”);

                    Response.AdeHeader(“Content-disposition”,string.Format(“attachment;filename=\”{0}\””,encodeFileName));

其中filename後為編碼後的檔名。Filename段為建議的儲存檔名。

    動態輸出用處,不用再把資源儲存到磁碟上再輸出(不會有檔案重名的問題,檔案不生成在伺服器端).案例:點選連線彈出圖片下載對話方塊。

27、page類成員

(1)Request、Response、Server屬性:對context.Request、context.Response、context.Server的簡化呼叫。

(2)AppRelativeVirtualPath屬性:獲得頁面相對於應用根路徑的路徑,比如:~/Default2.aspx。

(3)FindControl(ctrld),根據控制元件的id找到控制元件。一般情況下直接在程式碼中寫控制元件Id應用控制元件就可以了,但是對於有些場合:使用ListView等控制元件的模版、編寫自定義控制元件等則需要使用FindControl來殷虹控制元件,FindControl返回值是Control,一般需要顯示轉換為響應的控制元件:TextBox txtBox=

(TextBox)FindControl(“TextBox1”);

TxtBox.Text=”aaa”;

(4)IsPostBack、Session

(5)ResolveClientUrl(url):將虛擬路徑轉換為客戶端訪問時的路徑,比如ResolveClientUrl(“~/a/b.aspx”) 結果是a/b.aspx,這通常在ListView等控制元件的模版中輸出HTML使用。

(6)ResolveUrl(Url)將虛擬路徑轉換為相對於網站根目錄的路徑,比如ResolveUrl(“~a/b.aspx”)的結果是/WebSite4/a/b.aspx。

28、ASP.Net服務端基本控制元件介紹

ASP.Net服務端控制元件是ASP.Net對HTML的封裝,在C#程式碼中就可以用txt1.Text=’abc’ 這種方式來修改input的值,ASP.Net會將服務端控制元件渲染成HTML程式碼輸出給瀏覽器。服務端控制元件是ASP.Net分廠吸引初學者、非常容易上手的東西,也是最被人詬病的東西。物盡其用,服務端控制元件在內網系統、網際網路系統的後臺部分等訪問頻率不高的地方用的還是很合適的。

    所有的ASP.Net大部分都是從Control、WebControl類繼承的,幾乎都有的成員有:

(1)   ClientID,控制元件在客戶端的Id,控制元件在服務端的Id不一定等於客戶端HTML中的Id,比如說在ListView等控制元件的模版中。因此如果要在客戶端通過JavaScript Dom、JQuery的getElementById、$(“#id”)來操作控制元件的話,最好不要直接寫服務端Id,而是$(“#<%=txt1.ClientID%>”)。用JQuery事件設定滑鼠移到控制元件上和從控制元件移開的不同樣式。

(2)   Visible屬性,控制元件是否可見,如果Visible=False是不會渲染到HTMl中的,這和在HTML中給元素style.display=’none’效果是不一樣的。

(3)   CssClass屬性,控制元件的樣式名,就是HTML中控制元件的class屬性。

(4)   Attrebutes,用來設定獲取控制元件的額外屬性。和Dom中的setAttribute()、getAttribute()是一樣的。

29、ASP.Net服務端基本控制元件1

(1)Label控制元件。Test屬性為顯示文字。AssociatedControlID屬性用來關聯一個控制元件,如果為空的話會展示為一個SPAN,如果指定一個控制元件的id,則會展示為一個HTML中的<Label>,並且將for屬性設定為被關聯空間的ClientId。

(2)Literal控制元件也是展示一段文字,但是Literal控制元件不會渲染任何額外的標籤,就是將Text屬性的值展示出來而已。

(3)TextBox控制元件,文字框控制元件。TextMode屬性取值SingleLine、MultiLine、Password,分別渲染為input(type=text)、textarea和input(type=pssword)。當AutoPostBack屬性為true的時候,使用者焦點離開TextBox就會造成頁面Post,實現原理就是講ASP.Net原理時的AutoPostBack。TextChanged事件 ,文字發生變化的時候時間觸發。ASP.Net中要提交表單的時候最好呼叫__doPostBack方法。

(4)、RadioButton控制元件,渲染為input(type=radio),通過GroupName屬性進行分組。

30、ASP.Net服務端基本控制元件Button

(5)Button控制元件:OnClientClick屬性,當用戶點選按鈕的時候在瀏覽器端執行的程式碼,注意OnClientClick是字串屬性,寫的程式碼是JavaScript程式碼,執行在瀏覽器端。<asp:Button ID=”btnDel” runat=”server” onclientclick=”return confirm(‘真的要刪除嗎?’)” Text=”刪除” />

(6)LinkButton,用法和Button差不多,區別就是Button控制元件渲染為按鈕,而LinkButton渲染為超連結。不要用LinkButton來實現普通的超連結,因為LinkButton的href為一段javascript程式碼,進行的是表單的Post,無法“在新視窗中開啟連線”。和講“行刪除”那個例子中href為javascript的超連結原理一樣。

(7)ImageButton控制元件也和Button差不多,只不過是顯示為圖片,渲染為input(type=image).

(8)Button、LinkButton、ImageButton等控制元件都有CommandName、CommandArgument兩個屬性和Command事件,可以讓多個按鈕控制元件共享一個Command事件處理函式,通過讀取事件物件e的CommandName、CommandArgument兩個屬性讀取被點選按鈕上設定的這兩個引數來執行不同的操作。例子:編輯、刪除多行資料。這種用法在ListView等控制元件中用的最多。

(9)、Panel控制元件用來盛放一些控制元件。如果設定GroupingText屬性,那麼就渲染為<fieldset>標籤,也就是GroupBox效果,否則渲染為<div>.

(10)、HyperLink控制元件,超連結。和LinkButton不一樣,不會向伺服器端Post,就是一個超連結。NavigateURL:連結地址;Text:顯示文字。如果設定ImageUrl屬性則會顯示圖片超連結。

(11)、FileUpload控制元件,檔案上傳控制元件。渲染成input(type=file)。屬性:FileContent以流形式獲得上傳的檔案;FileName上傳檔名;HasFileBool值,表示使用者是否選擇的檔案,SaveAs方法用於將檔案報岑到磁碟的指定位置。漏洞:檔案上傳漏洞(上傳aspx)。只允許上傳指定型別檔案,上傳資料夾不給執行許可權。

練習:使用者註冊(非空檢查、Email合法行檢查、使用者名稱存在行檢查),密碼修改,使用者登入,使用者上傳頭像。

練習:開發一個線上Excel閱讀軟體。使用者上傳一個Excel檔案,服務端讀取檔案,手寫拼table、tr、td標籤,注意input(type=file)要將form的enctype=”multipart/form-data”,支援多sheet,用JQuery來實現Sheet的切換。

    31、正則表示式—簡寫表示式

    注意這些簡寫表示式是不考慮轉義符的,這裡的\就表示字元\,而不是C#字串級別的\,在C#程式碼中需要使用@或者\雙重轉義。\\d或者@”\d”

    \d:代表一個數字,等同於【0-9】

    \D:代表非數字,等同於【^0-9】

    \s:代表換行符、Tab製表符等空白字元

    \S:帶代表非空白字元

    \w:匹配字母或數字或下劃線或漢字。能組成單詞

    \W:非\w,等同於[^\w]

d:digital;s:space;w:word。大寫就是“非“;

32、JS中的正則表示式

複習C#正則表示式。

JavaScript中建立正則表示式類的方法:

    Var regex = new RegExp(“\\d{5}”) 或者 var regex = /\d{5}/

    /表示式/是JavaScript中專門為簡化正則表示式編寫而提供的語法,寫在//中的正則表示式就不用管轉義符了。

RegExp物件的方法:

(1)   test(str)判斷字串str是否匹配正則表示式,相當於IsMatch

var regex = /[email protected]+/;

alert(regex.test(“[email protected]”));

alert(regex.test(“ab.com”));

(2)   exec(str)進行搜尋匹配,返回值為匹配結果(*)

(3)   compile編譯表示式,提高執行速度。(*)

33、元字元3

^:匹配一行的開始。例如正則表示式”^AJAX”能夠匹配字串“AJAX我會用“的開始,但是不能匹配”我會用AJAX“、

^另外一種意思:非!(暫時不用理解)

$:匹配行結束符。例如正則表示式“曾哥$“ 能夠匹配字串”我愛曾哥“的末尾,但是不能匹配字串”曾哥純爺們“。

34、服務端HTML三種控制元件

HTML控制元件:ASP.Net把HTML控制元件當成普通字串渲染到瀏覽器,不去檢查正確性、無法在伺服器端進行處理。

ASP.Net服務端控制元件:經過ASP.Net高度封裝的控制元件,使用簡單,執行在伺服器端,可以在伺服器端使用C#程式碼進行操作,會渲染到客戶端為HTML控制元件。

runat=server的HTML控制元件:在HTML控制元件的基礎上新增runat=”server”,也是執行在伺服器端的,也可以服務端使用C#程式碼進行操作,也會渲染到客戶端,不像ASP.Net服務端控制元件那樣高度封裝,暴露的屬性大部分是普通HTML屬性。和ASP.Net服務端控制元件相比的好處是:當需要在伺服器端要對控制元件進行操作的時候,如果控制元件沒有被ASP.Net服務端控制元件封裝的時候,用runat=server的HTML控制元件很方便,runat=server的HTML控制元件也會對虛擬路徑、id->ClientID進行處理,所以在使用虛擬路徑、UserControl中也可能會用到,實驗在WebUserControl中使用id。

35、服務端HTML控制元件的型別

    a->HtmlAnchor;form->HtmlForm;head->HtmlHead;

    input->HtmlInputButton、HtmlInputCheckBox、HtmlInputText等;meta->HtmlMeta;table->HtmlTable;tr->HtmlTableRow;

    td->HtmlTalbeCell;title->HtmlTitle。未單獨封裝的標籤(比如div)對應的型別為HtmlGenericControl。使用Attributes屬性操作未封裝的屬性。

    不用單獨記憶,忘了的話,在aspx中弄一個標籤實驗一下就行。

    服務端HTML控制元件不像ASP.Net控制元件那樣封裝的高階,比如ASP.Net控制元件的BgColor屬性為Color型別,而HTML控制元件的BgColor屬性則為字串型別,需要開發人員設定合法的值。

36、驗證控制元件

必須要對使用者輸入的資料進行可髮型校驗,這些校驗邏輯很多事重複的,比如欄位不能為空、必須為日期格式、數字不能大於100等,而且要同時在客戶端和伺服器端校驗,客戶端校驗提高可用性,服務端校驗防止惡意攻擊。ASP.Net校驗控制元件就是為了簡化這些問題而提供的。

    ASP.Net提供瞭如下的控制元件:

    RequiredFieldValidator:欄位必填;

    RangeValidator:值在給定的最大、最小值之間;

    CompareValidator:用於比較兩個值的關係是否滿足要求或者是否是指定型別的資料;

    RegularExpressionValidator:校驗資料滿足正則表示式;

    CustomValidator:自定義驗證。

37、RequiredFieldValidator

    ControlToValidate設定要驗證的控制元件,Text屬性為當被驗證的控制元件屬性為空的時候顯示的錯誤資訊,Text不僅可以寫普通文字,可以寫任何HTML內容。

    有時候控制元件如果是預設值也認為是空值,比如下啦列表的選中值為“—選擇性別--”、文字框的值為“填入搜尋關鍵詞”,只要將RequiredFieldValidator的InitialValue屬性設定為“—選擇性別--”、“填入搜尋關鍵詞”就可以了。

38、Validator共性

    頁面中的IsValid屬性用來判斷頁面中的所有Validator是否都校驗通過,只有校驗通過才為True,及時頁面中的Validator

服務端校驗報錯,在服務端方法中的業務程式碼(比btn1_Clicik)也會被執行,因此如果程式碼在資料校驗不通過的不能執行則需要判斷IsValid的值。

    所有驗證控制元件都有Display屬性,用來決定如何顯示錯誤資訊。三個值:

Static:沒有錯誤資訊的時候控制元件的visiblity樣式為hidden來實現隱藏;

Dynamic:沒有錯誤資訊的時候控制元件的display樣式為none來實現隱藏。

    這兩者的區別是display:none和visiblity:hidden隱藏的區別是:

    Visibility:hidden隱藏控制元件仍然會佔據控制元件,而display:none隱藏則不會佔空間。Display屬性還可以設定None(用來配合後面講的ValidationSummary)。

    幾乎所有控制元件都有ControlToValidat、Text屬性,不再額外說。所有控制元件都幾乎在客戶端和伺服器端都要進行校驗。

    如果在同一頁面中同時放置註冊和登入表單,那麼他們的驗證就會同時進行,這樣雖然只是登入,但是註冊的驗證也會出發,可以使用驗證組來解決這個問題,將同一組的控制元件(表單、提交按鈕等)的ValidationGroup設為相同的值就可以。

    如果將按鈕控制元件(Button、ImageButton、LinkButton)的CausesValidation屬性設定為false,則這個按鈕的點選不觸發校驗。

39、RangeValidator(範圍驗證器)

RangeValidator:MinimumValue、MaximumValue為最小、最大值,Type屬性為資料型別(String、Integer、Double、Date、Currency等)。例子:年齡、畢業日期在合理範圍內。

    RangeValidator、CompareValidator、RegularExpressionValidator等都不會對非空值進行校驗,所以如果欄位不允許為空則需要再使用RequiredFieldValidator控制元件。

40、CompareValidator(比較校驗)

    CompareValidator:Type屬性同RangeValidator。Operator屬性,比較操作符,可選值DataTypeCheck、Equal、GreaterThan、GreaterThanEqul、LessThan、LessThanEqual、NotEqual。

    ValueToCompare,所比較的運算子右邊的值。

    ControlToCompare,設定與另外一個控制元件進行比較。

例子:校驗工資必須為整數,轉正日期必須不能早於入職日期。

41、高階Validator

    RegularExpressionValidator:ValidationExpression屬性為正則表示式,VS的視覺化編輯提供了幾個內建的正則表示式,也可以自己寫。案例,校驗Email地址、身份證號、QQ號碼(5位至10位的數字)、個人說明必須在10到50字之間。

    CustomValidator,自定義驗證控制元件。當ASP.Net內建的驗證控制元件無法滿足要求的時候可以使用CustomValidator。

    ServerValidate事件為服務端的校驗程式碼,在事件處理函式中讀取args.Value來獲得待校驗的值,如果值合法則將args.IsValid設定為true,否則設定為false。如果為ClientValidationFunction設定的一個函式名,那麼會首先在客戶端呼叫指定的JavaScript函式進行客戶端校驗,否則將製作服務端校驗。客戶端校驗函式的簽名為“函式名(src,args)”,args的屬性以及意義和服務端的一樣。

    案例:校驗日期中日的數值在合法範圍內,{1,3,5,7,8,10,12}是31天,{4,6,9,11}是30天,2月假設最大固定是29天不考慮閏年平年。程式碼見備註。

42、彙總錯誤訊息

    使用Validator錯誤訊息會顯示在放置的位置,這樣有兩個可能的問題:如果表單非常大,使用者看不到全部錯誤訊息,希望把錯誤訊息集中顯示在提交按鈕旁邊;如果錯誤資訊非常多,錯誤資訊會散落各地,希望能集中顯示。

    ValidationSummary控制元件用來集中顯示錯誤訊息。每個驗證控制元件都有ErrorMessage、Text兩個屬性,ErrorMessage是用來顯示到ValidationSummary中的值,Text是用來顯示到Validator位置的值,如果Text為空,則ErrorMessage會同時顯示到ValidationSummary和空間的位置。一般Text的值要簡短(比如“必填”、“*”),因為直接顯示到空間的位置,能知道指的是哪個空間;ErrorMessage要詳細一些(比如“使用者名稱不能為空”,不能是“這裡不能為空”等),這樣才能從ValidationSummary每條錯誤訊息中讀取值出來。

    ValidationSummary的屬性:DisplayMode,顯示模式,ShowMessageBox使用者同時顯示警告對話方塊。

43、母版(MasterPage)

    網站的佈局通常是統一的,上面是Logo、選單條,下面是公司地址、版權宣告等。如果每個頁面都重複做這些功能的話:重複性勞動、一旦修改那麼每個頁面都要修改。可以使用FrameSet(框架集)技術來解決,但是FrameSet技術不靈活,而且很難進行SEO,所以只有部分內網系統還在用FrameSet,.Net中一般用母版(MasyterPage)技術來解決這個問題。

    MasterPage是這樣一種技術,把頁面佈局畫好,在變化的內容部分“留空”,留空的部分由子頁面填充內容,這樣子頁面只要天空就行,不用重複設計頁面結構,一旦要修改頁面結構修改母版頁就可以,這樣所有頁面都會變化。母版頁“挖坑”,具體頁面“填坑”。母版頁、具體頁面中幾乎可以使用所有的普通WebForm頁面

能夠使用的技術。

44、母版2

    新增一個“母版頁”,使用<asp:ContentPlaceHolder>挖坑,新建的母版頁已經自動設定了兩個ContentPlaceHolder,還可以新增更多的ContentPlaceHolder。在id=“head”前面後面都可以加入一些script,在id=“ContentPlaceHolder1”前後也加入一些內容。

    建立使用母版頁的具體頁面,WebSite是新建“Web窗體”的時候勾選“選擇模板頁”,WebApplication是新建“Web內容窗體”,然後選擇頁面使用的母版頁(一個專案內可以建立多個母版頁,比如新聞頻道用一個母版頁,視訊頻道用另外一個母版頁)。

    使用母版的具體頁面和普通aspx頁面的不同是:@Page區域用MasterPageFile屬性表示頁面使用哪個母版頁,頁面不包含html等內容,只定義了<asp: Content>這些填坑的內容。<asp:Content>就是用來在具體頁面中對母版頁進行填坑的,ContentPlaceHolderID為這個Content要填母版頁中的哪個坑,對應母版頁中ContentPlaceHolder的Id。

45、母版3

    具體頁面可以對母版頁填坑頁可以不填坑,如果不填坑則顯示<asp:ContentPlaceHolder>中定義的預設內容。

    在母版頁中使用超連結、圖片地址等的時候需要注意路徑問題,在母版頁中的runat=server控制元件的連線地址、圖片地址等會被解析為相對於母版頁的地址,而客戶端HTML控制元件ASP.Net引擎是直接輸出的,因此是解析為相對於頁面的地址。建議使用服務端控制元件,如果不能使用伺服器控制元件,那麼可以在aspx頁面中呼叫ResolveUrl進行虛擬路徑的轉換。

    每個具體頁設定不同的標題,只要在具體頁面的@page中設定Title屬性即可。可以在具體頁中通過Master.FindControl來定位母版頁中的控制元件,然後對母版頁中的控制元件進行操作,比如在一個具體頁面中將母版頁中的一個空間隱藏。

46、網頁寬度一般都是950左右。

47、資料繫結控制元件

    從資料繫結開始,用WebApplication,否則會有很多麻煩。

    資料繫結分為資料來源和資料繫結控制元件兩部分,資料繫結控制元件通過資料來源來獲得資料,通過資料來源來隔離資料提供者和資料使用者,資料繫結控制元件通過資料來源來對資料進行修改,資料來源有SqlDataSource、AccessDataSource、ObjectDataSource、LinqDataSource、EntityDataSource、XmlDataSource等(SiteMapDataSource是SiteMap專用資料來源),由於大部分專案都不會頁面直連資料庫(因為違法最基本的分層原則),所以SqlDataSource、AccessDataSource不會使用,LinqDataSource、EntityDataSource也是隻有在很極端的採用Linq、EF的專案中才會用,XmlDataSource是處理XML資料時才可能會用。ObjectDataSource是Web開發中應用最廣的資料來源。

    資料繫結控制元件有列表資料繫結控制元件(DropDownList、RadioButtonList、ListBox、CheckBoxList、BulletedList等)和複雜控制元件(DataGrid、GridView、DetailsView、FormView、ListView、Repeater、DataList、等)。複雜控制元件中DataGrid已經不推薦使用,Repeater是最輕量級的元件,在網際網路的前臺用的最多,ListView是ASP.Net3.5中新增的控制元件,ListView是GridView、DetailView、FormView、Repeater、DataList等這些控制元件的大一統者,那些控制元件的優點ListView全都有,會了ListView那些控制元件也就會用了,因此資料繫結控制元件主要講列表資料繫結控制元件、Repeater和ListView,專案中會用到FormView、GridView。

48、ObjectDataSource

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

    手工編寫ObjectDataSource太麻煩,使用視覺化介面來完成。將ObjectDataSource拖放到介面上,在右上角的只能標誌上選擇“配置資料來源”即可進行配置。資料來源類一般用資料集就可以,新建一個數據集,將表拖進來生成DataTable、Adapter等,生成完成後,在ObjectDataSource的“配置資料來源”中就可以看到Adapter類,選中類,選擇【下一步】,分別選擇對應的獲得、刪除、更新、插入資料的方法。

49、列表繫結控制元件

DropDownList顯示來自於ObjectDataSource的資料,選擇資料來源(DataSourceID屬性)為剛才的ObjectDataSource,並且設定顯示欄位(DataTextField)和值欄位(DataValueField)即可。RadiobuttonList、ListBox、CheckBoxList、BulletedList等也都是這麼用。

    手工設定繫結,除了可以給控制元件的DataSourceID屬性設定一個數據源的方式進行資料繫結(推薦),還可以在程式碼中通過程式碼設定繫結(舊版本的ASP.Net只能這樣繫結,新版本中不推薦)。

    用程式碼繫結可以將任何實現了IEnumerable介面的物件繫結到資料繫結控制元件。ListBox2.DataSource=new object[]{3,5,6};

                ListBox2.DataBind();

    由於資料繫結控制元件預設會將資料儲存在ViewState中,因此不會每次重新整理頁面都會重新載入資料,只有第一次需要載入(!IsPostBack).

    由於程式碼繫結在禁用ViewState的情況下有很多麻煩事,因此推薦用DataSourceID的方式,控制元件會自己來判斷是否應該重新取得資料。

    DropDownLIst原有“請選擇性別”和資料繫結項的共存:AppengDataBoundItems=”true”.

50、複雜資料繫結控制元件

    除了顯示Text、Value這樣簡單的列表資料繫結控制元件之外,還有更復雜的資料繫結控制元件的要求,比如要將人員資訊顯示在介面上,包含姓名、年齡、照片等。這時候要使用Repeater、ListView等控制元件。

    學HTML的時候是手寫表格,但是專案中很多資料不是固定的,而是動態的。可以用Dom動態增加表格行,但是資料仍然是固定的,我們要求從資料庫等地方取得動態的資料來顯示。比如網站的友情連結列表就不是固定的,而是從資料庫中動態讀取動態生成的。

51、Repeater

    Repeater用於對繫結資料來源中的資料進行遍歷顯示,每條資料以什麼格式顯示是由Repeater的<ItemTemplate>來決定的,模板會多次顯示<ItemTemplate>姓名:<%#Eval(“Name”)%><b>年齡:<%#Eval(“Age”)%></b><br/></ItemTemplate>

    <%#Eval(“Name”)%>表示在這個位置顯示當前的Name屬性,注意呼叫Eval、Bind這些資料繫結方法的時候要用#。

    因為Eval就是將屬性顯示到指定的位置,因此也可以顯示到文字框中<ItemTemplate>姓名:<input type=”text” value=’<%#Eval(“Name”)%>’/></ItemTemplate>

    注意不要寫成value=”<%#Eval(‘Name’)%>”因為<%%>中是C#程式碼,“是字元,而不是字串。

    還可以用在伺服器控制元件中<asp:TextBox Text=’<%#Eval(”Name”)%>’ runat=”server”></asp:TextBox>

52、Repeater其他模板

    1、<AlternatingItemTemplate>,設定隔行的不同顯示風格,如果設定<AlternatingItemTemplate>,則奇數行用<ItemTemplate>模板,偶數行用<AlternatingItemTemplate>模板。

    <AlternatingItemTemplate> <asp:TextBox BackColor=”Red” ID=”TextBox2” Text=’<%#Eval(“Name”)%>’ runat=”server”/> </AlternatingItemTemplate>。設定隔行變色是為了防止資料太多看序列。

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

    3、SeparatorTemplate:兩項資料之間的分割符,比如汗行符。

53、ItemDataBound事件

    對於每行資料顯示的時候都會呼叫ItemDataBound事件,在這個事件中可以對當前行進行處理,事件物件主要成員:

    1、e.Item.ItemType為當前行的型別,Item為ItemTemplate行、AlternationgItem為AlternatiingTemplate行,還有Header、Footer等取值。

    2、ItemIndex當前行的序號

    3、DataItem當前行繫結的物件。

    如果要在ItemDataBound事件中對ItemTemplate模板中的控制元件做處理,則必須使用runat=server中的ASP.Net控制元件或者HTML控制元件,為空間設定Id,然後用FindControl根據Id來取得控制元件。注意在ASP.Net的模板中不能直接通過空間的Id來操作空間,必須用FindControl找到控制元件才能操作。

54、ItemCommand事件

    可以在模板中放置Button控制元件(Button、LinkButton、ImageButton),模板中的按鈕一般不寫OnClick事件響應,而是響應Repeater的ItemDataBound事件。

    為Button控制元件設定CommandName、CommandArgument屬性,然後在ItemDataBound事件讀取e的CommandName、CommandArgument屬性就可以獲得發生事件的命令和行引數了。如果對資料進行了操作,則需要Repeater1.DataBind()來重新繫結,從資料庫中重新整理最新的資料。

55、LIstView

    Repeater一般只用展示資料,如果要增刪該查則用ListView更方便。使用嚮導(強型別資料)來使用ListView會自動生成很多模板,免去手寫模板程式碼的麻煩,在進行手工調整即可。

    首先設定資料來源,然後點選只能提示中的“配置LIstView”,選擇一種佈局和樣式,然後根據需要勾選“啟用編輯”、“啟用刪除”、“啟用插入”、“啟用分頁”,就會自動生成常用的模板。注意這只是提高開發效率的一個快捷方式,不是唯一的途徑。

    LayoutTemplate為佈局模板,佈局模板中必須有一個ID為itemPlaceholder的服務端控制元件(4.0以後不需要),什麼型別無所謂,不會被顯示,itemPlaceholder前面就是相當於Repeater中的HeaderTemplate,itemPlaceholder後面就是相當於Repeater中的FooterTemplate,因此ListView中沒有這兩個模板。

    ItemTemplate是每一項的模板,AlternatingItemTemplate是隔行顯示的模板,和Repeater一樣。EmptyDataTemplate為資料來源沒有資料得時候顯示的內容,這樣的話可以實現“沒有查詢結果”、“對不起,找不到您要找的資料”等,InsertItemTemplate為插入資料介面的模板,EditItemTemplate為編輯資料的模板,InsertItemTemplate,為插入資料的模板,SelectedItemTemplate為標記為Selected的行的模板。

56、LIstView中幾個特殊問題處理

    EditItemTemplate、InsertItemTemplate中控制元件的繫結表示式為Text=‘<%#Bind(“Age”)%>’,因為Eval只是計算表示式的值輸出,而Bind不僅可以計算表示式的值輸出,還可以將使用者填入的值更新到資料中,因此Eval是單向繫結,Bind是雙向繫結。

    通過每行的Insert、Delete、Edit、Cancel等Command進行增刪改,這幾個CommandName被ListView內部處理,不需要開發人員處理,因此自定義的CommandName不要和他們重複。ListView中可以像Repeater那樣為行增加Command按鈕,處理方法和Repeater一樣,LIstView也支援Repeater那樣的ItemDataBound事件。和Repeater的不同點:(1)判斷資料行的型別e.Item.ItemType==ListViewType.DataItem;

      (2)取得行對應的DataRowView:ListViewDataItem lvDataItem =(LIstViewDataItem)e.Item;

        DataRowView rowView=(DataRowView)lvDataItem.DataItem;

      (3)在FindControl的時候注意AlternatingItemTemplate的問題。

    LIstView中可以使用Validator,只要將Validator放入響應的模板中將Validator手動設為要驗證的控制元件Id,然後設定響應按鈕、控制元件、Validator為同樣的ValidationGroup,防止不同模板中的Validator互相干擾。將Cancel按鈕的CauseValidation=”false”  .      

57、ListView的幾個其他功能

    新增資料行的預設值,響應ListView的ItemCreated事件,當e.Item.ItemType為InsertItem的時候通過FindControl找到控制元件然後初始化。比如給年齡預設值。

    插入資料的初始化:注意和“新增資料行“不同,”插入資料初始化“是在使用者點選“插入按鈕”之後執行。比如如果主鍵為Guid,則需要在資料插入資料庫之前為主鍵賦值。響應ListView的ItemInserting事件,e.Values為所有欄位的鍵值對,可以讀取插入的值,也可以向欄位中寫值,這樣就可以為Id賦值e.Values[“Id”]=Guid.NewGuid ()。在這個事件中對資料進行校驗,可以通過e.Cancel=true來取消非法資料插入。

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

    ObjectDataSource繫結Id為Guid型別的表的時候會生成一個“DataObjectTypeName”=”System.Guid”,刪掉就行。

58、DropDownList的繫結

    ListView中是無法像TextBox等控制元件那樣將DropDownList的選中值繫結到資料的欄位的,必須程式設計處理。例子,人員的性別(男、女、保密),三個值固定寫在DropDownList中。

(1)   在顯示資料的時候DropDownList顯示資料的值。在ItemTemplate中加入DropDownList,設定DropDownList Enabled=”false”,這樣就是隻讀的。在ItemDataBound事件中e.Item.FindControl()來找到DropDownList控制元件,然後ListViewDataItem lvDataItem=(ListViewDataItem)e.Item;

DataRowView rowView=(DataRowView)lvDataItem.DataItem;取到DataRowView進而取到DataRow,讀取資料的值,然後賦值給DropDownList的SelectedValue屬性。

(2)   在插入資料的時候設定DropDownList對應的欄位的值,響應ItemInserting事件,通過e.Item.FindControl找到DropDownList控制元件,然後通過e.Values設定值。

(3)   在資料更新的時候設定DropDownList對應的欄位的值,響應ItemUpdating事件,通過ListViewDataItem dataItem

59、行命令按鈕

LIstView的行按鈕和Repeater一樣,不同的是取當前行資料的方式。Int index = ((ListViewDataItem)e.Item).DisplayIndex取出操作行的行號,ListView1.DataKeys[index].Value取出主鍵的值,如果對資料進行了操作,最後要對ListView執行DataBind重新整理資料。由LIstView的DataKeyNames屬性決定儲存那些欄位值為主鍵,可以多個主鍵(和資料庫主鍵沒有直接關係),所以有Values。

    排序:將LayoutTemplate中的表頭用<aso:LinkButton runat=”server” CommandName = “Sort” Text=”Id” CommandArgument=”Id” />代替,其中,CommandArgument的值為排序欄位。只要是CommandName、CommandArgument對就行,展現成什麼、顯示在哪兒都可以。

60、高效率分頁

ListView預設的分頁是先從資料來源取得所有資料,然後再擷取當前頁面的部分,在資料量非常大的情況下效率非常低,因此預設分也基本不能用。應該是隻從資料來源取得要顯示的資料。

    複習:SQL中語句中取得分頁資料。SQL語句中獲得每一行序號的方法:

SELECT  Id,SiteNmae,LogoURL,Row_Number() over(order by Id) rownum FROM T_Links,

Row_Number() 函式是SQL2005之後提供的一個計算結果集函式的函式,over中指定排序規則,Row_Number()從1開始。取得第11條至20條資料(條數從0開始)的方法,使用子查詢用行號進行再次處理:

Select * from (SELECT Id,SiteName,LogoURL,Row_Number() over(order by Id) rownum FROM T_Links) t where t.rownum>11 and t.rownum<=20.

    在強型別DataSet中增加取得所有資料條數的方法QueryCount,增加取得指定行數範圍資料的方法GetPagedData:Select * from (SELECT ……,Row_Number() over(order by …) rownum FROM T_Links) t where t.rownum>@startRowIndex and t.rownum<[email protected] + @maximumRows。

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

61、DataPager調整

    相關單詞:First:第一;Last:最後;Next:下一個;Previous:上一個。

    NextPreviousPagerField主要屬性:ButtonCssClass:按鈕的樣式;ButtonType,按鈕渲染成什麼(Button按鈕、Link超連結、Image圖片);

    FirstPageImageUrl,【第一頁】按鈕圖片地址;FirstPageText,【第一頁】按鈕文字,這樣可以實現上一頁顯示為“<”,最後一頁顯示為“>>”這樣的效果;

    ShowFirstButton,是否顯示【第一頁】,其他按鈕也有對應屬性。

    NumericPagerField主要屬性:ButtonCount,數字的個數;按鈕渲染成什麼(Button、Link、Image);CurrentPageLabelCssClass當前頁文字的樣式;NuericButtonCssClass數字按鈕的樣式。

    如何實現|<</</頁數/>/>>|這樣的效果。順序新增NextPreviousPageField、NumericPagerField、NextPreviousPagesField,將第一個NextPreviousPageField的First、Previous設定為不可見,將最後一個NextPreviousPagerField的First、Previous設定為不可見,Last、Next設定為可見。

    (*)實現輸入頁面標號點選跳轉或在下啦列表中選擇頁數要用TemplatePagerField。

62、高效率分頁

ObjectDataSource中EnablePaging屬性設定為true,SelectCountMethod設定為QueryCount,SelectMethod設定為GetPagedData。

    如果出錯的話看看是不是沒