看到一個問題:定時更新GridView的某一列中的狀態文字。馬上就有了想法:GridView最後會產生表格,所以我們在頁面中透過Ajax更新表格的列,從而達到ajax更新GridView的效果。
具體實作:
準備一個xml文件,用於儲存要更新的數據,在頁面中啟動一個計時器,每隔5秒鐘調用一個函數,函數裡邊透過$.ajax獲取xml中的數據,解析xml,遍歷表格行,匹配要更新的數據,更新。
getuserlist.xml
定義一個UserList的根節點,下邊每個UserItem對應一條數據,UID可以理解成主鍵,UStatus是最新的狀態。
<?xml version="1.0" encoding="utf-8" ?> <UserList> <UserItem><UID>1</UID><UStatus>关闭</UStatus></UserItem> <UserItem><UID>2</UID><UStatus>关闭</UStatus></UserItem> <UserItem><UID>3</UID><UStatus>开放</UStatus></UserItem> </UserList>
test.html
具體的邏輯都寫到這裡邊了。
<html> <head> <title>Ajax Update Table Column</title> <script src="jquery-1.3.1.min.js" type="text/javascript"></script> <script type="text/javascript"> window.onload=function(){ //每隔5秒检查一下数据 window.setInterval(checkStatus,5000); }; //检查数据 function checkStatus(){ //ajax请求数据 $.ajax({ //换成你的文件,构造xml格式的数据就行了 url: 'getuserlist.xml', //请求类型 type: 'GET', //数据格式 dataType: 'xml', //超时时间:1秒 timeout: 2000, //加载数据发生错误 error:function (XMLHttpRequest, textStatus, errorThrown) { alert("XMLHttpRequest="+XMLHttpRequest.responseText+"\ntextStatus="+textStatus+"\nerrorThrown="+errorThrown); }, //成功加载数据 success: function(xml){ //遍历表格的行,需要给表格定义一个ID $("#userListTable tr").each(function(){ //获取行的第一列,这里边保存了XML中对应的UID信息 var trID=$(this).find("td").eq(0).text(); //数据的新状态 var trStatus=""; //遍历xml中的UserItem $(xml).find("UserList > UserItem").each(function(){ //获取UID和UStatus的值 var uid = $(this).find("UID").text(); var ustatus = $(this).find("UStatus").text(); //比对当前行的ID和UID,如果相等,给数据的新状态赋值 if(trID==uid){ trStatus=ustatus; } }); //如果数据的新状态不为空,则更新单元格中现实的文本 if(trStatus!=""){ $(this).find("td").eq(2).text(trStatus); } }); } }); } </script> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <!-- 这个表格有三列 ID:数据的ID,相当于主键,用于从xml中查询新数据 Name:只是显示 Status:要更新的列 --> <table border="1" id="userListTable"> <tr><th>ID</th><th>Name</th><th>Status</th></tr> <tr><td>1</td><td>张三</td><td>开放</td></tr> <tr><td>2</td><td>李四</td><td>开放</td></tr> <tr><td>3</td><td>王五</td><td>开放</td></tr> </table> </body> </html>
最後將所需檔案放到可以瀏覽的網站下邊,開啟test.html。
等待5秒鐘,就可以看到效果了。
因為IE的問題,直接在資料夾下開啟會出現不能解析xml檔(parsererror)的問題,所以建議放到可以執行的網站下邊,或是用別的瀏覽器開啟。
PS:GridView 是 DataGrid的後繼控件,在 framework 2 中,雖然還存在DataGrid,但是GridView已經走上了歷史的前台,取代DataGrid的趨勢已是勢不可擋。 GridView和DataGrid功能相似,都是在web頁面中顯示資料來源中的數據,將資料來源中的一行數據,也就是一筆記錄,顯示為在web頁面上輸出表格中的一行。
GridView相對於DataGrid來說,具有如下優勢,功能上更加豐富,因為提供了智能標記面板(也就是show smart tag)更加易用方便,常用的排序、分頁、更新、刪除等操作可以零代碼實現!具有PagerTemplate屬性,可以自訂使用者導覽頁面,也就是說分頁的控制更隨心所欲。 GridView和DataGrid在事件模型上也多有不同之處,DataGrid控制引發的都是單一事件,而GridView控制項會引發兩個事件,一個在操作前發生,一個在操作後發生,操作前的事件多位***ing事件,操作後的事件多位元***ed事件,例如Sorting 事件和sorted 事件,RowDeleting和RowDeleted事件。
Listview和Gridview的刷新介面的方式是呼叫adapter.notifyDataSetChanged()進行介面刷新。
但是此方法有其弊端,他是將介面中的資料全部刷新一遍,不論資料有沒有變化。