常用的輔助代碼

 點擊返回上頁代碼:
<form>
<p><input TYPE="button" VALUE="返回上一步" ONCLICK="history.back(-1)"></p>
</form>

彈出警告框代碼:
<form>
<p><input TYPE="button" VALUE="彈出警告框" ONCLICK="AlertButton()"></p>
</form>
<script language="JavaScript"><!--
function AlertButton(){window.alert("要多多光臨呀!");}
// --></script>

點擊打開新窗口
<form>
<p><input TYPE="button" VALUE="打開新窗口" ONCLICK="NewWindow()"></p>
</form>
<script language="JavaScript"><!--
function NewWindow(){window.open("http://www.mcmx.com","","height=240,width=340,status=no,location=no,toolbar=no,directories=no,menubar=no");}
// --></script></body>

刪除記錄時彈出確認框:
<script LANGUAGE="VBSCRIPT">
a=msgbox("真的要刪除該記錄嗎?",1,"注意")
if a=1 then
location="Dodelete.asp?id=<%=id%>" //指向執行刪除的頁面Dodelete.asp
else
history.go(-1)
end if
</script>


關閉打開的窗口
< a href="/" οnclick="javascript:window.close(); return false;">關閉窗口</a>

清空INPUT且選定
onClick="Javascript:this.value=''" onFocus="this.select()" onMouseOver="this.focus()"

右鍵屏蔽
<body on_contextmenu=self.event.returnValue=false>

連串英文自動換行的解決方法 IE5.5
style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-word" 你可修改爲指定的大小如 200px

圖片“重置”按鈕
<script language="jscript">
function myreset()
{ document.login.reset();
document.login.focus();}
</script>
<img src="image/reclear.gif" width="69" height="20" style="cursor:hand" οnfοcus="this.blur()" οnclick="myreset()"

畫細線表格
<table style="border-collapse: collapse">

狀態欄信息
<form>
<p><input TYPE="button" VALUE="狀態欄信息" ONCLICK="StatusButton()"></p>
</form>
<script language="JavaScript"><!--
function StatusButton(){window.status="要多多光臨呀!";}
// --></script>

最小化、最大化、關閉窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" VALUE="Close"></OBJECT>

<input type=button value=最小化 οnclick=hh1.Click()>
<input type=button value=最大化 οnclick=hh2.Click()>
<input type=button value=關閉 οnclick=hh3.Click()>
本例適用於IE

隱藏狀態欄裏出現的LINK信息
<a href="http://"; onMouseOver="window.status='none';return true">夢想天空</a>

文本框自動滾動條
<textarea name=words rows=18 cols=26 style="border:1 solid #000000;background-color:white; font-size:9pt; width:188; overflow:auto" wrap=hard></textarea>

全選並複製
<FORM name=test><INPUT οnclick="javascript:HighlightAll('test.select1')" type=button value=全選並複製><BR><TEXTAREA name=select1 rows=3 cols=46>你好,歡迎您的光臨!</TEXTAREA>
</FORM>
<SCRIPT language=Javascript>
<!--

var copytoclip=1

function HighlightAll(theField) {
var tempval=eval("document."+theField)
tempval.focus()
tempval.select()
if (document.all&&copytoclip==1){
therange=tempval.createTextRange()
therange.execCommand("Copy")
window.status="Contents highlighted and copied to clipboard!"
setTimeout("window.status=''",1800)
}
}
//-->
</SCRIPT>

屏蔽JAVASCRIPT錯誤
<script language="JavaScript">
<!--
function killErrors(){
return true;
}
window.onerror = killErrors;
-->
</script>

關閉子窗口時刷新父窗口
<script language="JavaScript">
<!--
self.opener.location.reload();
window.close()
-->
</script>


背景色變換
<form>
<p><input TYPE="button" VALUE="背景色變換" onClick="BgButton()"></p>
</form>
<script>function BgButton(){
if (document.bgColor=='#00ffff')
{document.bgColor='#ffffff';}
else{document.bgColor='#00ffff';}
}
</script>

檢查一段字符串是否全由數字組成
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

判斷是否是字符
if (/[^/x00-/xff]/g.test(s)) alert("含有漢字");

點擊刷新代碼:
<form>
<p><input TYPE="button" VALUE="刷新按鈕一" ONCLICK="ReloadButton()"></p>
</form>
<script language="JavaScript"><!--
function ReloadButton(){location.href="allbutton.htm";}
// --></script>

讓層不被控件覆蓋代碼:
<div z-Index:2><object xxx></object></div> # 前面
<div z-Index:1><object xxx></object></div> # 後面
<div id="Layer2" style="position:absolute; top:40;width:400px; height:95px;z-index:2"><table height=100% width=100% bgcolor="#ff0000"><tr><td height=100% width=100%></td></tr></table><iframe width=0 height=0></iframe></div>
<div id="Layer1" style="position:absolute; top:50;width:200px; height:115px;z-index:1"><iframe height=100% width=100%></iframe></div>

讓層的相對定位
<div id="Layer1" style="position:relative; left:0px; top:0px; width:0px; height:0px;z-index:1">
<div id="Layer2" style="position:absolute; left:500px; top:0px; width:220px; height:220px; z-index:1">
內容
</div></div>

Flash代碼以及背景透明
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="200" height="200">
<param name="movie" value="文件">
<param name="quality" value="high">
<param name="wmode" value="transparent">
<embed src="images/fish.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="220" height="220"></embed></object>

Windows Media Player 播放器
<OBJECT id=MediaPlayer1
style="LEFT: 0px; VISIBILITY: visible; POSITION: absolute; TOP: 0px;z-index:2"
codeBase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701standby=

Loading
type=application/x-oleobject height=300 width=320
classid=CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6 VIEWASTEXT>
<PARAM NAME="URL" VALUE="地址">

<param name="AudioStream" value="-1">
<param name="AutoSize" value="0">
<param name="AutoStart" value="-1">
<param name="AnimationAtStart" value="0">
<param name="AllowScan" value="-1">
<param name="AllowChangeDisplaySize" value="-1">
<param name="AutoRewind" value="0">
<param name="Balance" value="0">
<param name="BaseURL" value>
<param name="BufferingTime" value="5">
<param name="CaptioningID" value>
<param name="ClickToPlay" value="-1">
<param name="CursorType" value="0">
<param name="CurrentPosition" value="-1">
<param name="CurrentMarker" value="0">
<param name="DefaultFrame" value>
<param name="DisplayBackColor" value="0">
<param name="DisplayForeColor" value="16777215">
<param name="DisplayMode" value="0">
<param name="DisplaySize" value="4">
<param name="Enabled" value="-1">
<param name="EnableContextMenu" value="-1">
<param name="EnablePositionControls" value="0">
<param name="EnableFullScreenControls" value="0">
<param name="EnableTracker" value="-1">
<param name="InvokeURLs" value="-1">
<param name="Language" value="-1">
<param name="Mute" value="0">
<param name="PlayCount" value="1">
<param name="PreviewMode" value="0">
<param name="Rate" value="1">
<param name="SAMILang" value>
<param name="SAMIStyle" value>
<param name="SAMIFileName" value>
<param name="SelectionStart" value="-1">
<param name="SelectionEnd" value="-1">
<param name="SendOpenStateChangeEvents" value="-1">
<param name="SendWarningEvents" value="-1">
<param name="SendErrorEvents" value="-1">
<param name="SendKeyboardEvents" value="0">
<param name="SendMouseClickEvents" value="0">
<param name="SendMouseMoveEvents" value="0">
<param name="SendPlayStateChangeEvents" value="-1">
<param name="ShowCaptioning" value="0">
<param name="ShowControls" value="-1">
<param name="ShowAudioControls" value="-1">
<param name="ShowDisplay" value="0">
<param name="ShowGotoBar" value="0">
<param name="ShowPositionControls" value="-1">
<param name="ShowStatusBar" value="-1">
<param name="ShowTracker" value="-1">
<param name="TransparentAtStart" value="-1">
<param name="VideoBorderWidth" value="0">
<param name="VideoBorderColor" value="0">
<param name="VideoBorder3D" value="0">
<param name="Volume" value="70">
<param name="WindowlessVideo" value="0">
</OBJECT>


RealPlayer 播放器
<object id=video1 classid=" clasid:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA"
width=320 height=240 align="middle">
<param name="controls" value="inagewindow">
<param name="console" value="chicp1">
<param name="autostar" value="true">
<param name="src" value="地址">
<embed
src="地址"
type="audio/x-pn-realaudio-plugin" console="chip1"
controls="imagewindow" width=320 height=240 autostart=true align="middle">
</embed>
</object>

---------------------------------------------------------------
---------------------------------------------------------------
1.如何用Asp判斷你的網站的虛擬物理路徑
答:使用Mappath方法
< p align="center" >< font size="4" face="Arial" >< b >
The Physical path to this virtual website is:
< /b >< /font >
< font color="#FF0000" size="6" face="Arial" >
< %= Server.MapPath("/")% >
< /font >< /p >

2.我如何知道使用者所用的瀏覽器?
答:使用the Request object方法
strBrowser=Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strBrowser,"MSIE") < > 0 Then
  Response.redirect("ForMSIEOnly.htm")
Else
  Response.redirect("ForAll.htm")
End If

3.如何計算每天的平均反覆訪問人數
答:解決方法
< % startdate=DateDiff("d",Now,"01/01/1990")
if strdate< 0 then startdate=startdate*-1
avgvpd=Int((usercnt)/startdate) % >
顯示結果
< % response.write(avgvpd) % >
that is it.this page have been viewed since November 10,1998

4.如何顯示隨機圖象
< % dim p,ppic,dpic
ppic=12
randomize
p=Int((ppic*rnd)+1)
dpic="graphix/randompics/"&p&".gif"
% >
顯示
< img src="< %=dpic% >" >

5.如何回到先前的頁面
答:< a href="< %=request.serverVariables("Http_REFERER")% >" >preivous page< /a >
或用圖片如:< img src="arrowback.gif" alt="< %=request.serverVariables("HTTP_REFERER")% >" >

6.如何確定對方的IP地址
答:< %=Request.serverVariables("REMOTE_ADDR)% >

7.如何鏈結到一副圖片上
答:< % @Languages=vbs cript % >
< % response.expires=0
strimagename="graphix/errors/erroriamge.gif"
response.redirect(strimagename)
% >

8.強迫輸入密碼對話框
答:把這句話放載頁面的開頭
< % response.status="401 not Authorized"
response.end
% >

9.如何傳遞變量從一頁到另一頁
答:用 HIDDEN 類型來傳遞變量
< % form method="post" action="mynextpage.asp" >
< % for each item in request.form % >
< input namee="< %=item% >" type="HIDDEN"
value="< %=server.HTMLEncode(Request.form(item)) % >" >
< % next % >
< /form >

10.爲何我在 asp 程序內使用 msgbox,程序出錯說沒有權限
答:由於 asp 是服務器運行的,如果可以在服務器顯示一個對話框,那麼你只好等有人按了確定之後,你的程序才能繼續執行,而一般服務器不會有人守着,所以微軟不得不禁止這個函數,並胡亂告訴你 (:) 呵呵) 沒有權限。但是ASP和客戶端腳本結合倒可以顯示一個對話框,as follows:
< % yourVar="測試對話框"% >
< % s cript language='javas cript' >
alert("< %=yourvar% >")
< /s cript >

11.有沒有辦法保護自己的源代碼,不給人看到
答:可以去下載一個微軟的Windows s cript Encoder,它可以對asp的腳本和客戶端javas cript/vbs cript腳本進行加密。。。不過客戶端加密後,只有ie5才能執行,服務器端腳本加密後,只有服務器上安裝有s cript engine 5(裝一個ie5就有了)才能執行。

12.怎樣才能將 query string 從一個 asp 文件傳送到另一個?
答:前者文件加入下句: Response.Redirect("second.asp?" & Request.ServerVariables("QUERY_STRING"))

13.global.asa文件總是不起作用?
答:只有web目錄設置爲web application, global.asa纔有效,並且一個web application的根目錄下 global.asa纔有效。IIS4可以使用Internet Service Manager設置application setting 怎樣才能使得htm文件如同asp文件一樣可以執行腳本代碼?

14.怎樣才能使得htm文件如同asp文件一樣可以執行腳本代碼?
答:Internet Sevices Manager - > 選擇default web site - >右鼠鍵- >菜單屬性-〉主目錄- > 應用程序設置(Application Setting)- > 點擊按鈕 "配置"- > app mapping - >點擊按鈕"Add" - > executable browse選擇 /WINNT/SYSTEM32/INETSRV/ASP.DLL EXTENSION 輸入 htm method exclusions 輸入PUT.DELETE 全部確定即可。但是值得注意的是這樣對htm也要由asp.dll處理,效率將降低。

15.如何註冊組件
答:有兩種方法。
第一種方法:手工註冊 DLL 這種方法從IIs 3.0一直使用到IIs 4.0和其它的Web Server。它需要你在命令行方式下來執行,進入到包含有DLL的目錄,並輸入:regsvr32 component_name.dll 例如 c:/temp/regsvr32 AspEmail.dll 它會把dll的特定信息註冊入服務器中的註冊表中。然後這個組件就可以在服務器上使用了,但是這個方法有一個缺陷。當使用這種方法註冊完畢組件後,該組件必須要相應的設置NT的匿名帳號有權限執行這個dll。特別是一些組件需要讀取註冊表,所以,這個註冊組件的方法僅僅是使用在服務器上沒有MTS的情況下,要取消註冊這個dll,使用:regsvr32 /u aspobject.dll example c:/temp/regsvr32 /u aneiodbc.dll

第二種方法:使用MTS(Microsoft Transaction Server) MTS是IIS 4新增特色,但是它提供了巨大的改進。MTS允許你指定只有有特權的用戶才能夠訪問組件,大大提高了網站服務器上的安全性設置。在MTS上註冊組件的步驟如下:
1) 打開IIS管理控制檯。
2) 展開transaction server,右鍵單擊"pkgs installed"然後選擇"new package"。
3) 單擊"create an empty package"。
4) 給該包命名。
5) 指定administrator帳號或則使用"interactive"(如果服務器經常是使用administrator 登陸的話)。
6) 現在使用右鍵單擊你剛建立的那個包下面展開後的"components"。選擇 "new then component"。
7) 選擇 "install new component" 。
8) 找到你的.dll文件然後選擇next到完成。
要刪除這個對象,只要選擇它的圖標,然後選擇delete。
附註:特別要注意第二種方法,它是用來調試自己編寫組件的最好方法,而不必每次都需要重新啓動機器了。

16. ASP與Access數據庫連接:

<%@ language=VBs cript%>
<%
dim conn,mdbfile
mdbfile=server.mappath("數據庫名稱.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=數據庫密碼;dbq="&mdbfile

%>

17. ASP與SQL數據庫連接:

<%@ language=VBs cript%>
<%
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服務器名稱或IP地址;UID=sa;PWD=數據庫密碼;DATABASE=數據庫名稱
%>

建立記錄集對象:

set rs=server.createobject("adodb.recordset")
rs.open SQL語句,conn,3,2

18. SQL常用命令使用方法: 

(1) 數據記錄篩選:

sql="select * from 數據表 where 字段名=字段值 order by 字段名 [desc]"

sql="select * from 數據表 where 字段名 like '%字段值%' order by 字段名 [desc]"

sql="select top 10 * from 數據表 where 字段名 order by 字段名 [desc]"

sql="select * from 數據表 where 字段名 in ('值1','值2','值3')"

sql="select * from 數據表 where 字段名 between 值1 and 值2"

(2) 更新數據記錄:

sql="update 數據表 set 字段名=字段值 where 條件表達式"

sql="update 數據表 set 字段1=值1,字段2=值2 …… 字段n=值n where 條件表達式"

(3) 刪除數據記錄:

sql="delete from 數據表 where 條件表達式"

sql="delete from 數據表" (將數據表所有記錄刪除)

(4) 添加數據記錄:

sql="insert into 數據表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"

sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表)

(5) 數據記錄統計函數:

AVG(字段名) 得出一個表格欄平均值
COUNT(*|字段名) 對數據行數的統計或對某一欄有值的數據行數統計
MAX(字段名) 取得一個表格欄最大的值
MIN(字段名) 取得一個表格欄最小的值
SUM(字段名) 把數據欄的值相加

引用以上函數的方法:

sql="select sum(字段名) as 別名 from 數據表 where 條件表達式"
set rs=conn.excute(sql)

用 rs("別名") 獲取統的計值,其它函數運用同上。

(5) 數據表的建立和刪除:

CREATE TABLE 數據表名稱(字段1 類型1(長度),字段2 類型2(長度) …… )

例:CREATE TABLE tab01(name varchar(50),datetime default now())

DROP TABLE 數據表名稱 (永久性刪除一個數據表)

19. 記錄集對象的方法:

rs.movenext 將記錄指針從當前的位置向下移一行
rs.moveprevious 將記錄指針從當前的位置向上移一行
rs.movefirst 將記錄指針移到數據表第一行
rs.movelast 將記錄指針移到數據表最後一行
rs.absoluteposition=N 將記錄指針移到數據表第N行
rs.absolutepage=N 將記錄指針移到第N頁的第一行
rs.pagesize=N 設置每頁爲N條記錄
rs.pagecount 根據 pagesize 的設置返回總頁數
rs.recordcount 返回記錄總數
rs.bof 返回記錄指針是否超出數據表首端,true表示是,false爲否
rs.eof 返回記錄指針是否超出數據表末端,true表示是,false爲否
rs.delete 刪除當前記錄,但記錄指針不會向下移動
rs.addnew 添加記錄到數據表末端
rs.update 更新數據表記錄

---------------------------------------

20 Recordset對象方法

Open方法

recordset.Open Source,ActiveConnection,CursorType,LockType,Options

Source
Recordset對象可以通過Source屬性來連接Command對象。Source參數可以是一個Command對象名稱、一段SQL命令、一個指定的數據表名稱或是一個Stored Procedure。假如省略這個參數,系統則採用Recordset對象的Source屬性。

ActiveConnection
Recordset對象可以通過ActiveConnection屬性來連接Connection對象。這裏的ActiveConnection可以是一個Connection對象或是一串包含數據庫連接信息(ConnectionString)的字符串參數。

CursorType
Recordset對象Open方法的CursorType參數表示將以什麼樣的遊標類型啓動數據,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
--------------------------------------------------------------
常數 常數值 說明
-------------------------------------------------------------
adOpenForwardOnly 0 缺省值,啓動一個只能向前移動的遊標(Forward Only)。
adOpenKeyset 1 啓動一個Keyset類型的遊標。
adOpenDynamic 2 啓動一個Dynamic類型的遊標。
adOpenStatic 3 啓動一個Static類型的遊標。
-------------------------------------------------------------
以上幾個遊標類型將直接影響到Recordset對象所有的屬性和方法,以下列表說明他們之間的區別。

-------------------------------------------------------------
Recordset屬性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
-------------------------------------------------------------
AbsolutePage 不支持 不支持 可讀寫 可讀寫
AbsolutePosition 不支持 不支持 可讀寫 可讀寫
ActiveConnection 可讀寫 可讀寫 可讀寫 可讀寫
BOF 只讀 只讀 只讀 只讀
Bookmark 不支持 不支持 可讀寫 可讀寫
CacheSize 可讀寫 可讀寫 可讀寫 可讀寫
CursorLocation 可讀寫 可讀寫 可讀寫 可讀寫
CursorType 可讀寫 可讀寫 可讀寫 可讀寫
EditMode 只讀 只讀 只讀 只讀
EOF 只讀 只讀 只讀 只讀
Filter 可讀寫 可讀寫 可讀寫 可讀寫
LockType 可讀寫 可讀寫 可讀寫 可讀寫
MarshalOptions 可讀寫 可讀寫 可讀寫 可讀寫
MaxRecords 可讀寫 可讀寫 可讀寫 可讀寫
PageCount 不支持 不支持 只讀 只讀
PageSize 可讀寫 可讀寫 可讀寫 可讀寫
RecordCount 不支持 不支持 只讀 只讀
Source 可讀寫 可讀寫 可讀寫 可讀寫
State 只讀 只讀 只讀 只讀
Status 只讀 只讀 只讀 只讀
AddNew 支持 支持 支持 支持
CancelBatch 支持 支持 支持 支持
CancelUpdate 支持 支持 支持 支持
Clone 不支持 不支持
Close 支持 支持 支持 支持
Delete 支持 支持 支持 支持
GetRows 支持 支持 支持 支持
Move 不支持 支持 支持 支持
MoveFirst 支持 支持 支持 支持
MoveLast 不支持 支持 支持 支持
MoveNext 支持 支持 支持 支持
MovePrevious 不支持 支持 支持 支持
NextRecordset 支持 支持 支持 支持
Open 支持 支持 支持 支持
Requery 支持 支持 支持 支持
Resync 不支持 不支持 支持 支持
Supports 支持 支持 支持 支持
Update 支持 支持 支持 支持
UpdateBatch 支持 支持 支持 支持
--------------------------------------------------------------
其中NextRecordset方法並不適用於Microsoft Access數據庫。

LockType
Recordset對象Open方法的LockType參數表示要採用的Lock類型,如果忽略這個參數,那麼系統會以Recordset對象的LockType屬性爲預設值。LockType參數包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:

-------------------------------------------------------------
常數 常數值 說明
--------------------------------------------------------------
adLockReadOnly 1 缺省值,Recordset對象以只讀方式啓動,無法運行AddNew、Update及Delete等方法
adLockPrssimistic 2 當數據源正在更新時,系統會暫時鎖住其他用戶的動作,以保持數據一致性。
adLockOptimistic 3 當數據源正在更新時,系統並不會鎖住其他用戶的動作,其他用戶可以對數據進行增、刪、改的操作。
adLockBatchOptimistic 4 當數據源正在更新時,其他用戶必須將CursorLocation屬性改爲adUdeClientBatch才能對數據進行增、
刪、改的操作。

 

10:02 | 評論 (1)

2005年6月1日 #

使用SELECT的一個小錯誤
若要使用SELECT A 別名1,B 別名2 。。。。FROM XXX

應該在別名上加“”,如 select a “a1”, b “b1” from sssss

這樣別名裏就可以有特殊字符了,比如括號“()”之類的,如果不加“”,不含特殊字符的漢字也可以通過,但是包括<()這樣的字符就不行可,不知道爲什麼,誰知道麼?

21:51 | 評論 (0)

DataGrid點擊刪除按鈕彈出確認對話框一個好辦法
datagrid-》屬性生成器-》列-》添加按鈕列-》刪除-》文本(T)->在文本框里加上:
<div id="de" οnclick="JavaScript:return confirm('確定刪除嗎?')">刪除</div>

21:50 | 評論 (1)

ASP.NET中DataGrid控件應用技巧簡述
一.概述:

  運用ASP.NET開發Web應用程序過程中,DataGrid是一個非常重要的控件,幾乎任何和數據相關的表現都要用到該控件。所以熟練掌握DataGrid控件的應用技巧是每個Web開發人員所必備的基本能力。

  DataGrid控件能以表格的方式顯示數據源中的數據,並提供了諸如分頁、排序以及過濾等一些強大的內置功能,所以它能大大簡化Web應用程序的開發過程。同時,開發者還可以通過運用各種不同的數據綁定列來自定義DataGrid控件顯示數據的方式,這樣就大大增強了DataGrid控件的功能。本文我就將向大家介紹如何運用其中的TemplateColumn、EditCommandColumn、HyperlinkColumn、ButtonColumn以及BoundColumn等來自定義DataGrid控件顯示數據的方式。

  二.BoundColumn數據列的應用:

  一般地,我們運用DataGrid控件開發數據驅動的Web應用程序時會以一行顯示數據源中的某一條記錄,而其中的一列則顯示某個特定的字段值。DataGrid控件本身爲我們提供了強大的功能,所以我們只需要以很少的代碼便可以實現數據的顯示功能。不過,這樣也帶來了一個問題,那就是我們如何來個性化顯示數據的方式呢?顯然DataList控件和Repeater控件在這個方面要強於DataGrid控件,不過如果我們放棄了DataGrid控件也就相當於放棄了其具有的強大功能。那麼,我們如何運用DataGrid控件也來實現數據顯示的自定義功能呢?首先,我們得把DataGrid控件根據數據源自動產生數據綁定列的功能關掉,方法很簡單,就是將其AutoGenerateColumns屬性設置爲False即可。下面是這種方法的一個示例:

<asp:DataGrid runat= "server"id="myDataGrid" AutoGenerateColumns="False">
</asp:DataGrid>

  一旦其AutoGenerateColumns屬性爲False值,我們就得編程實現數據列的綁定了。在綁定數據列過程中,我們可以運用上面介紹的五中數據列中的任何一種,不過任何數據列都必須在<Columns></Columns>標記內被定義,這個標記能表明被定義的對象是一種數據列。

  下面我們首先來介紹BoundColumn數據列的應用。通過運用BoundColumn數據列,我們能根據自己的需求來動態地將數據源中的數據綁定到特定的數據列上並修改數據列的外觀,比如我們可以更改各個列顯示的次序、使DataGrid控件只顯示某些字段的值而非全部字段的值、更改數據列的標題等等。BoundColumn數據列能設定DataField、DataFormatString、FooterText、HeaderText、HeaderImageUrl以及SortField等屬性,而正是這些使得DataGrid控件的外觀變得千變萬化、多姿多彩。

  下面,我們來建立一個示例性的Web應用程序項目,該項目運用到了DataGrid控件,並且顯示瞭如何在其中運用BoundColumn數據列來自定義數據的顯示方式。下面是本項目的主要文件以及其代碼後置文件的內容:

  WebForm1.aspx:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="DataGridTemplates.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:DataGrid runat="server" id="myDataGrid" AutoGenerateColumns="False" BorderWidth="1px" Font-Names="Verdana,Arial,sans-serif" Font-Size="12px" BorderColor="#404040" GridLines="Horizontal" CellPadding="4">
<AlternatingItemStyle BackColor="#E0E0E0"></AlternatingItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="Teal"></HeaderStyle>
<Columns>
<asp:BoundColumn DataField="CustomerID" HeaderText="ID"></asp:BoundColumn>
<asp:BoundColumn DataField="CompanyName" HeaderText="Company Name"></asp:BoundColumn>
<asp:BoundColumn DataField="ContactName" HeaderText="Contact Name"></asp:BoundColumn>
<asp:BoundColumn DataField="Address" HeaderText="Address"></asp:BoundColumn>
<asp:BoundColumn DataField="City" HeaderText="City"></asp:BoundColumn>
<asp:BoundColumn DataField="Region" HeaderText="Region"></asp:BoundColumn>
<asp:BoundColumn DataField="PostalCode" HeaderText="Postal Code">
<HeaderStyle Wrap="False"></HeaderStyle>
</asp:BoundColumn>
</Columns>
</asp:DataGrid>
</form>
</body>
</HTML>

WebForm1.aspx.cs:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace DataGridTemplates
{
/// <summary>
/// WebForm1 的摘要說明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid myDataGrid;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
if( !Page.IsPostBack )
BindData();
}

private void BindData()
{
SqlConnection con = new SqlConnection( "server=localhost;database=Northwind;integrated security=true;" );
SqlCommand cmd = new SqlCommand( "SELECT * FROM Customers", con );

try
{
con.Open();
myDataGrid.DataSource = cmd.ExecuteReader();
myDataGrid.DataBind();
con.Close();
}
catch( Exception ) {}
if( con != null && con.State == ConnectionState.Open )
con.Close();
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}

  項目創建完畢,在瀏覽器中運行的效果如圖1所示:


圖1 DataGrid控件中運用BoundColumn數據列顯示數據的效果。

三.HyperlinkColumn數據列以及ButtonColumn數據列的應用:

  上面我向大家介紹了BoundColumn數據列的應用,而其它的兩種數據列:HyperlinkColumn數據列以及ButtonColumn數據列的應用方式與之相差無幾。

  HyperlinkColumn數據列包含了DataTextField屬性以及DataNavigateUrlField屬性等,前者可以用於指定要顯示的文本內容,而後者則用於指定超鏈接。同時HyperlinkColumn數據列還包含了一個可用於指定文本顯示格式的DataNavigateUrlFormatString屬性。

  像HyperlinkColumn數據列那樣ButtonColumn數據列也提供了DataTextField屬性以及DataTextFormatString屬性。同時它還提供了一個CommandName屬性,該屬性能指定按鈕被點擊時服務器端的響應動作。而此時DataGrid控件的OnItemCommand屬性必須指向一個相應的方法,該方法在按鈕被點擊時會自動被調用。DataGrid控件中的一行可以包含多個ButtonColumn數據列,每個數據列中的按鈕消息響應函數都是OnItemCommand屬性所對應的方法,而不同的按鈕是根據其CommandName屬性來區分函數所應執行的不同部分的。ButtonColumn數據列還提供了一個ButtonType屬性以指定按鈕的外觀,該屬性包括兩種可取值:LinkButton(默認)和PushButton。

  下面我們在原來解決方案的基礎上再添加一個新的Web應用程序項目,並在其中運用DataGrid控件的BoundColumn數據列、HyperlinkColumn數據列以及ButtonColumn數據列。下面是本項目的主要文件以及其代碼後置文件的內容:

  WebForm1.aspx:

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="DataGridTemplates2.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<asp:DataGrid id="myDataGrid" runat="server" HeaderStyle-Font-Bold="True" Cellpadding="4" BorderWidth="1px" AutoGenerateColumns="False" GridLines="Horizontal" Font-Names="Verdana,Arial,sans-serif" Font-Size="12px" BorderStyle="Solid">
<AlternatingItemStyle BackColor="#EFEFEF"></AlternatingItemStyle>
<ItemStyle Font-Size="X-Small"></ItemStyle>
<HeaderStyle Font-Bold="True" ForeColor="White" BackColor="Teal"></HeaderStyle>
<Columns>
<asp:BoundColumn DataField="CustomerID" HeaderText="ID"></asp:BoundColumn>
<asp:HyperLinkColumn DataNavigateUrlField="Url" DataTextField="CompanyName" HeaderText="Comapny Name"></asp:HyperLinkColumn>
<asp:ButtonColumn Text="Get Details" ButtonType="PushButton" CommandName="GetDetails"></asp:ButtonColumn>
</Columns>
</asp:DataGrid>
</form>
</body>
</HTML>
 

WebForm1.aspx.cs:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace DataGridTemplates2
{
/// <summary>
/// WebForm1 的摘要說明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid myDataGrid;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
if( !Page.IsPostBack )
BindData();
}

private void BindData()
{
SqlConnection con = new SqlConnection( "server=localhost;integrated security=true;database=Northwind" );
SqlCommand cmd = new SqlCommand( "SELECT *, 'http://www.' + CustomerID + '.com' As Url FROM Customers", con );
try
{
con.Open();
myDataGrid.DataSource = cmd.ExecuteReader();
myDataGrid.DataBind();
con.Close();
}
catch( Exception ) {}
if( con != null && con.State == ConnectionState.Open )
con.Close();
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.myDataGrid.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.myDataGrid_ItemCommand);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

private void myDataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if( e.CommandName == "GetDetails" )
Response.Redirect( "WebForm2.aspx?id=" + e.Item.Cells[0].Text );
}
}
}

  項目創建完畢,在瀏覽器中運行的效果如圖2所示:


圖2 DataGrid控件中運用HyperlinkColumn以及ButtonColumn數據列顯示數據的效果。

四.TemplateColumn數據列的應用:

  DataGrid控件中的TemplateColumn數據列可以說是功能極其強大的,靈活地運用它就能使得DataGrid控件顯示數據的方式變得多種多樣。TemplateColumn數據列主要爲我們提供了以下四種數據列模板:

  ·HeaderTemplate
  ·ItemTemplate
  ·EditItemTemplate
  ·FooterTemplate

  其中HeaderTemplate是用於顯示DataGrid控件的首行中的文本、圖片或是綁定數據的。FooterTemplate的功能與HeaderTemplate的功能類似,不過它是用於顯示尾行中的內容的。EditItemTemplate是應用於具有編輯功能的數據列的,任何運用了該模板的數據列的數據能被用戶編輯並在適當時候更新到數據源中。

  ItemTemplate允許你建立具有完全自定義數據顯示方式的數據列。通過運用<%# Container.DataItem("[FieldName]") %>或<%# DataBinder.Eval(Container.DataItem, "[FieldName]", "{0:[FormatString]}") %>兩種數據綁定語法你就可以將數據源中的某列數據綁定到相應的數據列中並賦予完全自定義的顯示方式。

  下面我們在第三步中建立的Web應用程序中添加一個新的Web頁面-WebForm2,該頁面能顯示公司的詳細信息,也就是在圖2中的按鈕被點擊時瀏覽器會導向到的頁面。它能根據用戶的選擇顯示相應公司的詳細信息,方法就是判斷Request.QueryString內的信息。如果其中包含了一個"id"名/值對,則根據其中的值選擇相對應的公司信息並顯示在頁面中,如果沒有包含任何"id"值的信息則從數據表中選取所有公司的信息並顯示在頁面中。同時還要指出的是,在一個DataGrid控件中你可以將多種類型的數據列結合起來一起使用,並根據不同的需要選擇合適的數據列顯示相應的數據。下面是本頁面的HTML文件以及其代碼後置文件的內容:

  WebForm2.aspx:

<%@ Page language="c#" Codebehind="WebForm2.aspx.cs" AutoEventWireup="false" Inherits="DataGridTemplates2.WebForm2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm2</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<asp:datagrid id="myDataGrid" runat="server" ItemStyle-Font-Size="x-small" HeaderStyle-Font-Bold="True" HeaderStyle-Font-Size="x-small" AlternatingItemStyle-BackColor="#EFEFEF" Cellpadding="4" BorderWidth="1" AutoGenerateColumns="False" BorderStyle="Solid" GridLines="Horizontal" BorderColor="#404040" Font-Names="Verdana,Arial,sans-serif" Font-Size="11px">
<AlternatingItemStyle BackColor="#E0E0E0"></AlternatingItemStyle>
<ItemStyle Font-Size="X-Small"></ItemStyle>
<HeaderStyle Font-Size="X-Small" Font-Bold="True" ForeColor="White" BackColor="Teal"></HeaderStyle>
<Columns>
<asp:TemplateColumn>
<HeaderTemplate>
<b>Company Detail</b>
</HeaderTemplate>
<ItemTemplate>
<table border="0" Cellpadding="4" Cellspacing="0" Width="100%" style="FONT-SIZE: 11px; FONT-FAMILY: Verdana, Arial, sans-serif">
<tr>
<td colspan="4">
<b>
<%# DataBinder.Eval( Container.DataItem, "CompanyName" ) %>
</b>
</td>
</tr>
<tr>
<td width="25%" valign="top"><b>Contact:</b></td>
<td width="25%" valign="top" nowrap>
<%# DataBinder.Eval( Container.DataItem, "ContactName" ) %>
</td>
<td width="25%" valign="top"><b>Phone:</b></td>
<td width="25%" valign="top" nowrap>
<%# DataBinder.Eval( Container.DataItem, "Phone" ) %>
</td>
</tr>
<tr>
<td width="25%" valign="top"><b>Title:</b></td>
<td width="25%" valign="top">
<%# DataBinder.Eval( Container.DataItem, "ContactTitle" ) %>
</td>
<td width="25%" valign="top"><b>Fax:</b></td>
<td width="25%" valign="top" nowrap>
<%# DataBinder.Eval( Container.DataItem, "Fax" ) %>
</td>
</tr>
<tr>
<td width="25%" valign="top"><b>Address:</b></td>
<td width="25%" valign="top" colspan="3">
<%# DataBinder.Eval( Container.DataItem, "Address" ) %>
<br>
<%# DataBinder.Eval( Container.DataItem, "City" ) %>
,
<%# DataBinder.Eval( Container.DataItem, "Region" ) %>
<%# DataBinder.Eval( Container.DataItem, "PostalCode" ) %>
<br>
<%# DataBinder.Eval( Container.DataItem, "Country" ) %>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
</form>
</body>
</HTML>
 

WebForm2.aspx.cs:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace DataGridTemplates2
{
/// <summary>
/// WebForm2 的摘要說明。
/// </summary>
public class WebForm2 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid myDataGrid;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
if( !Page.IsPostBack )
BindData();
}

private void BindData()
{
DataSet ds = new DataSet();
SqlDataAdapter da;
String strSQL;

if( Request.QueryString["id"] == null )
strSQL = "SELECT * FROM Customers";
else
strSQL = "SELECT * FROM Customers WHERE CustomerID = '" + Request.QueryString["id"].ToString() + "'";

da = new SqlDataAdapter( strSQL, "server=localhost;integrated security=true;database=Northwind" );
da.Fill( ds, "Customers" );
myDataGrid.DataSource = ds.Tables["Customers"].DefaultView;
myDataGrid.DataBind();
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN:該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}

  新頁面創建完畢,在瀏覽器中運行的效果如圖3所示:


圖3 DataGrid控件中運用TemplateColumn數據列顯示數據的效果。

  五.總結:

  到此爲止,我想大家已經基本掌握了在Web應用程序中運用DataGrid控件自定義數據顯示的方法了。相比於DataList控件和Repeater控件,DataGrid控件具有更多強大的功能,而且其自定義數據顯示的功能也不弱。所以只要你好好掌握其中的技巧和方法,運用DataGrid控件也同樣可以使得你的Web應用程序不僅具有強大的數據處理功能,而且非常富有個性。

17:15 | 評論 (0)

Asp.Net中DataGrid的模版列(TemplateColumn)內容控制簡單方法
最近寫了幾個asp.net的項目。其中,Asp.Net的控件DataGrid使用的最多了,前幾天需要一個功能,我研究了很長時間,發現一個方法,應該是最簡單的實現。現表述如下。

DataGrid的html定義很簡單,如下 <Asp:DataGrid ID="myDatagrid" runat="server" datakeyfield="fID" AutoGenerateColumns="False">
<Columns>
<Asp:TemplateColumn itemstyle-width=".." ..>
<ItemTemplate>
.
</ItemTemplate>
</Asp:TemplateColumn>
</Columns>
</Asp:DataGrid>
功能的要求是在 ItemTemplate中,有可能是一個綁定數據源的:
<a href="...">...</a>
鏈接代碼,也有可能是一個
<span>...</span>
顯示文本代碼,而判斷的根據是綁定到DataGrid中數據源的DataTable中每行的某一特定列的內容。

說白了,功能就是DataGrid在綁定數據生成行的時候,判斷數據源DataTable每行DataRow中一個字段的內容,這個字段類型是bool類型,如果爲true,則這個列顯示的是<a href="...">...</a>鏈接,而如果是false,則顯示<span>...</span>文本。而顯示的鏈接內指向的地址必須執行數據綁定。就是這個DataGrid的列有的行要數據綁定,有的行不要數據綁定。

功能需求分析到這裏,那麼現在該思考如何實現了。

我當時瞭解需求後,馬上反應出來,使用DataGrid自帶的BoundColumn、HyperLinkColumn肯定是不行的。而且,使用TemplateColumn也有麻煩。他只能放一些固定的控件,如html控件或服務器控件等。後來我沒有辦法了,準備繼承ITemplate接口自己開發一個模版列。後來又覺得麻煩。因爲綁定的時候需要一個類似於BoundColumn功能的綁定數據源內容的東西。後來我發現了這個方法。

在查看.Net Framework SDK 文檔的時候,我發現在<Asp:TemplateColumn>中的<ItemTemplate>中可以放類似於
<%# DataBinder.Eval(Container.DataItem, "fID") %> 這樣的數據綁定代碼,我就想是否可以再加入代碼呢

我做了一個試驗,試驗結果發現上面的代碼(包括前面和後面的<% %>符號)輸出的實際上是一個object對象,然後DataGrid顯示的時候把它轉換成字符串。後來我就想,是否可以前面再加入代碼,調用這個頁面的後臺代碼中的方法。

我們都知道,在asp.net1.1中,一個名稱爲aaa.aspx的asp.net頁在asp.net內部處理時是一個名叫ASP.aaa_aspx的類,這個類繼承它的後臺代碼aaa.aspx.cs中的類,這個類繼承System.Web.UI.Page類,從而實現需要的功能。這就是說,在asp.net 1.1中,我們在.aspx中的以<% %> 包含的代碼可以調用後臺cs類中的以public 和protected生命的任何方法。

這就好辦了,既然從上面的數據綁定代碼可以獲取主鍵內容(是個字符串),那麼我可以在後臺寫一個方法,這個方法有一個字符串參數,返回的也是字符串。這個返回的字符串就是顯示在列中的內容。

首先說一下綁定表的內容,如下

列名 類型 用途
fID System.String 表主鍵
hasSub System.Boolean 判斷的依據
contentUrl System.String 鏈接的地址

然後是後臺代碼中C#代碼
protected string GetDGColumn(string id)
{
// 從數據源獲取DataTable內容略
DataTable dt = .;
// 定義DataTable的主鍵列
DataColumn[] key = {dt.Columns["fID"]};
dt.PrimaryKey = key;

// 根據傳入的id開始找數據行
DataRow row = dt.Rows.Find(id);

// 找到後開始判斷
if((bool)row["hasSub"])
{
// hasSub爲 true,表示返回<span>
return "<span style=/"/">內容內容</span>";
}
else
{
// hasSub列爲false,返回鏈接
return "<a href=/"XXXX.aspx?id="+id+"/" target=/"_blank/">鏈接內容</a>";
}
}

然後在.aspx中的DaaGrid內這樣定義:
<Asp:DataGrid ID="myDatagrid" runat="server" datakeyfield="fID" AutoGenerateColumns="False">
<Columns>
<Asp:TemplateColumn itemstyle-width=".." ..>
<ItemTemplate>
<%# base.GetDGColumn((object)DataBinder.Eval(Container.DataItem, "fID")) %>
</ItemTemplate>
</Asp:TemplateColumn>
</Columns>
</Asp:DataGrid>

利用了DataGrid綁定時內部使用的數據綁定方法獲取結果,然後把結果傳遞給GetDGColumn()方法,DataGrid列的內容實際上是使用的這個方法返回的字符串

17:10 | 評論 (0)

2005年5月17日 #

ASP.NET中的FILE對象總結
在ASP.NET中引入了名字空間,其中文件操作對應的名字空間是System.IO。名字空間和動態鏈接庫有些類似,但是名字空間在整個.net系統中都可以應用。在ASP.NET的頁面中可以使用<%@import namespace=...%>來引用名字空間。在vb6中採用fso對文件進行操作,在asp.net中的文件對象和fso很相似。

這裏我介紹一下file對象:file對象的作用主要是創建文件流對象。通過file對象可以對系統文件進行全面的管理,可以創建、複製、刪除、移動和打開文件

下面我門首先創建一個file對象。

在asp.net中,可以使用2種方法來創建一個file對象。

(1)使用dim 語句來創建一個file對象
  dim mikecatfile as file
  mikecatfile.create("c:/mikecat.txt")


(2)使用new語句來創建file對象
dim mikecatfile as new file("c:/mikecat.txt")

也可以這樣定義
dim mikecatfile as file
mikecatfile=new file("c:/mikecat.txt")


大家請注意asp.net中用到vb語法在進行對象賦值時不再需要使用set語句

file對象的主要屬性

在對file對象進行文件的讀寫操作時,只要使用2個屬性:length和name分別爲文件的長度和文件名字。

file對象的主要方法

file對象有9個常用的方法


(1)create方法   該方法用於創建一個新文件
  function create(string) as filestream
   其中string爲所需要創建的文件的路徑,返回filestream對象,此對象爲文件的讀寫提供通道 

(2)delete方法   該方法用於刪除一個已經存在的文件
  sub delete (string)
  或者sub delete()
  如果file對象包含有文件參數,可以使用第二種方法刪除文件。否則只能用第一種方法來刪除文件,string參數指定所要刪除的文件路徑。


(3)copy方法
  該方法用於將一個文件複製到一個新文件
  sub copy(source,destination)
  source指定源文件的路徑,destination指定目的文件的路徑。copy方法只允許複製一個已經存在的文件到一個新文件,不允許覆蓋一個已經存在的文件。


(4)createtext方法
  該方法用於創建一個新文件,該文件可以進行寫操作。
  function createtext(string) as streamwriter
或者function createtext() as streamwriter
返回值爲streamwriter對象用於執行對文件的寫操作
和create方法不一樣的是,createtext方法返回的不是filestream對象,而是streamwriter對象。


(5)fileexists方法
  該方法用於檢查指定文件是否存在
  function fileexits(string) as boolean
  string 指定所要查找的文件路徑,如果該文件存在,返回值爲true,否則爲false

 

(6)getextension方法
該方法用於得到文件的擴展名
function getextension(string) as string
如果指定的文件有擴展名,則返回擴展名字符串,該字符串也包含"."
如果指定的文件不包含有擴展名,如string參數指定的是某個文件夾的路徑,則返回empty


(7)move方法
  該方法用於把一個已經存在的文件移動到一個新的文件夾下。
  sub move(source,destination)
  source 指定源文件的路徑,destination指定目的文件的路徑,和copy方法不同的是使用move方法後源文件被刪除了。


(8)open方法
  function open(filename,filemode,fileaccess) as filestream
  該方法返回的是文件操作通道對象filestream。
  filemode和fileaccess在system.io名字空間裏各自定義了一組枚舉常量,用於指定文件操作模式和操作權限。
  filemode.append  以追加的方式打開文件,或者以追加的方式創建一個新的文件。使用這種模式操作文件時,必須和fileaccess.write一起使用,就是說必須有寫入權限
  filemode.create 創建一個新文件,如果存在同名的文件,將覆蓋原文件
  filemode.createnew 創建一個新文件,如果有同名文件,打開文件出錯
  filemode.open  打開一個已經存在的文件
  filemode.openorcreate  打開一個已經存在文件,如果該文件不存在則創建一個新文件。
  filemode.truncate 當文件打開時清空文件的所有內容,如果使用這個屬性對文件至少要有寫入的權限

  fileaccess.read 打開的文件只有讀取的權限
  fileaccess.write 打開的文件只有寫入的權限
  fileaccess.readwrite 打開的文件既可以寫入也可以讀取


(9)opentext方法
  該方法用來創建一個streamreader對象並對已經存在的文件進行讀取操作。
  function opentext(string) as streamreader
  或者function opentext() as streamreader
和open方法不一樣的是,opentext返回的是streamreader對象,此對象用於執行對文件的讀操作.
9:57 | 評論 (0)

2005年5月16日 #

ASP.net中隨機數應用實例
大家可能都用過Chinaren的校友錄,不久前它的留言簿上加了一個防止灌水的方法,就是系統每次產生一個由隨機的數字和字母組成的圖片,每次留言必須正確地輸入這些隨機產生的字符,否則不能添加留言。這是一個很好的防止惡意攻擊的方法,其核心的技術就是如何產生隨機數。Chinaren網站是使用PHP實現的,而我們可以充分利用ASP.net的強大功能很輕易地實現。

在.net Framework中提供了一個專門用來產生隨機數的類System.Random,使用這個類時必須導入System命名空間。當然,命名空間System在每個ASP.net頁面中都是自動導入的,所以我們可以直接使用這個類。

對於隨機數,大家都知道,計算機不可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的算法對事先選定的隨機種子做複雜的運算,用產生的結果來近似的模擬完全隨機數,這種隨機數被稱作僞隨機數。僞隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。僞隨機數的選擇是從隨機種子開始的,所以爲了保證每次得到的僞隨機數都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那麼同一個隨機數發生器產生的隨機數也會一樣。一般地,我們使用同系統時間有關的參數作爲隨機種子,這也是.net Framework中的隨機數發生器默認採用的方法。


我們可以使用兩種方式初始化一個隨機數發生器:

第一種方法不指定隨機種子,系統自動選取當前時間作爲隨機種子:

Random ro = new Random();


第二種方法可以指定一個int型參數作爲隨機種子:


int iSeed=10;

Random ro = new Random(10);

之後,我們就可以使用這個Random類的對象來產生隨機數,這時候要用到Random.Next()方法。這個方法使用相當靈活,你甚至可以指定產生的隨機數的上下限。

不指定上下限的使用如下:

int iResult;

iResult=ro.Next();


下面的代碼指定返回小於100的隨機數:

int iResult;

int iUp=100;

iResult=ro.Next(iUp);

而下面這段代碼則指定返回值必須在50-100的範圍之內:


int iResult;

int iUp=100;

int iDown=50;

iResult=ro.Next(iDown,iUp);


除了Random.Next()方法之外,Random類還提供了Random.NextDouble()方法產生一個範圍在0.0-1.0之間的隨機的雙精度浮點數:


double dResult;

dResult=ro.NextDouble();


另外一個與Random.NextDouble()方法相似的方法是Random.Sample(),它跟Random.NextDouble()方法唯一的區別在於訪問級別,我們可以看看它們的原始聲明:


protected virtual double Sample();

public virtual double NextDouble();


Random.Sample()方法是保護方法,只允許子類的對象訪問,而Random.Sample()方法則可以看作是Random.Sample()的公開版本。一般地,用戶在Random的子類中重寫Sample()方法來得到更一般的分佈。
16:49 | 評論 (0)

2005年4月15日 #

爲 ASP.NET Datagrid 創建自定義列
摘要:ASP.NET Datagrid 是 Web 開發人員可以使用的一個功能強大的控件。通過添加自定義列以便爲用戶更準確地顯示數據,來學習如何增強該控件的功能。(本文包含一些指向英文站點的鏈接。)

適用於:
    Microsoft? ASP.NET

下載本文的源代碼。(請注意,在示例文件中,程序員的註釋使用的是英文,本文中將其譯爲中文是爲了便於讀者理解。)

目錄
簡介
重複使用的情況
DropDownList 方案
內置的 Datagrid 列
傳統方法:TemplateColumn 中的 DropDownList
所有列的基礎:DataGridColumn
可以重複使用的方法:創建 DropDownColumn
使用 DropDownColumn

小結

簡介
不得不承認,爲 Microsoft? ASP.NET 編寫 Datagrid 代碼包括大量的重複工作。儘管我深受該控件的困擾,但我還是不斷尋找簡化這類任務的捷徑。誰都不願意做重複的工作,對不對?爲了擺脫這種煩人的工作,我們要將多個項目中的重複代碼封裝到一個可重複使用的程序包中。這纔是面向對象的編程工作所要解決的問題,使用 Datagrid 也不例外。對於 Datagrid 控件來說,要實現該目的,需要將常用的代碼放到一個內置的列類型中(將在第一個示例中使用),然後創建一個可以在多個 Datagrid 對象中重複使用的自定義列類型。 

本文介紹使用標準 TemplateColumn 在一個 Datagrid 列中使用 DropDownList 控件的過程,然後將該邏輯轉換爲您的自定義 Datagrid 列類型,我稱其爲 DropDownColumn。已經爲您創建了一些免費的 Datagrid 列,您可以到 MetaBuilders.com 下載所需的類型。

重複使用的情況

如果您的小組與許多組織一樣,已經將業務邏輯和/或數據訪問邏輯分成單獨的組件或組件集,而剩下的 ASP.NET 文件、ASPX 及其代碼只包含純粹的表示邏輯。(“純粹”是一個相對的詞語。)但是,即使是表示層的邏輯有時也會重複使用,這樣,下次某個用戶來到您門前說,“我想讓我的應用程序在‘財務’方面看起來與蘇茜的一樣”時,您可以重複使用“財務”應用程序的部分表示內容快速爲其構建一個這樣的應用程序。您可能還想將一些邏輯打包,在 Web 上銷售或在您的 Web 站點分發。ASP.NET 使這一切比以往更容易實現,因爲它使您可以創建自己的服務器控件,或從現有的類型導出列類型,從而獲得所需的功能。

DropDownList 方案

假設您正在本地 Microsoft SQL Server? 中編輯 Northwind 數據庫(或做其他工作),您想使您的用戶(我們稱之爲 Ed,倉庫保管員)可以編輯 Orders 表。其中一個字段包含運輸信息 (ShipVia),Ed 要能夠修改該字段的信息。在顯示模式下,運輸公司應顯示爲純文本。當 Ed 單擊 Edit(編輯)按鈕時,您不光要爲他提供一個 TextBox 以編輯運輸方式代碼(1、2 或 3),還要爲他提供一個包含可以選擇不同運輸公司的 DropDownList。(因爲 Ed 記不住哪個運輸公司對應哪個號碼,所以,DropDownList 方案可以幫助他解決這個問題。)

 

圖 1:選擇運輸公司

內置的 Datagrid 列

瞭解問題的大概情況後,現在我們後退一步,看一下 ASP.NET 中構建的 5 種 Datagrid 列類型及其父類型 DataGridColumn。 

BoundColumn。這是文本字段的標準顯示。它顯示爲純文本,但是當 Datagrid 處於“編輯”模式時,它將轉換爲 TextBox。還可以選擇格式化選項。 
HyperlinkColumn。用於顯示文本數據,還代表一個 Web 地址 (URL)。URL 可以與顯示文本相同,也可以不同,它們都可以單獨設置。它顯示爲 <a href=...> 標記。 
ButtonColumn。它使用戶能夠按行與網格進行交互。它可以顯示爲超鏈接 LinkButton (<a href=...>) 或 Pushbutton (<input type="button">)。單擊該按鈕時將觸發 PostBack,而在 Datagrid 上觸發 ItemCommand 事件。 
EditCommandColumn。它與 ButtonColumn 類似,但是它自動創建用於編輯 Datagrid、取消或提交更改的按鈕。觸發 ItemCommand 事件,以及所單擊按鈕的特定事件:EditCommand、CancelCommand 或 UpdateCommand。 
TemplateColumn。用於完全控制顯示給用戶的控件,分爲多種模板,例如 ItemTemplate 和 EditItemTemplate。任何 ASP.NET 或 HTML 控件或控件組都可以放置在這些模板中。 
注意:直接使用這些列類型之前,請關閉 AutoGenerateColumns(運行時自動生成列)。然後,您可以在屬性生成器中使用這些列類型,或者直接在 ASPX 文件的 HTML 代碼中使用。

 

圖 2:從 DataGridColumn 中繼承的 5 種內置列

儘管這些列類型非常有用,它們不過是瞭解 Datagrid 列內容的開始。 

傳統方法:TemplateColumn 中的 DropDownList

在研究如何創建新列類型之前,首先讓我們看一下如何通過直接在 TemplateColumn 內使用 DropDownList 解決下拉列表的問題,而不用自定義列。ItemTemplate 將只包含表示當前值的純文本表示,而 EditItemTemplate 包含一個需要在運行時管理的 <asp:DropDownList> 控件。

<asp:DataGrid id="DataGrid1" 
   runat="server" CssClass="grid" 
   AutoGenerateColumns="False">
   <Columns>
      <asp:EditCommandColumn 
         EditText="Edit" CancelText="Cancel" 
         UpdateText="Update" />
      <asp:BoundColumn 
         DataField="OrderID" ReadOnly="True" 
         HeaderText="Order ID" />
      <asp:BoundColumn 
         DataField="ShipName" HeaderText="Ship to" 
         ReadOnly="True" />
      <asp:BoundColumn 
         DataField="ShipCountry" HeaderText="Country" 
         ReadOnly="True" />
      <asp:TemplateColumn HeaderText="Ship Method">
         <ItemTemplate>
            <%#Container.DataItem("ShipVia")%>
         </ItemTemplate>
         <EditItemTemplate>
            <asp:DropDownList runat="server" ID="Dropdownlist1"/>
         </EditItemTemplate>
      </asp:TemplateColumn>
   </Columns>
</asp:DataGrid>
 
 


綁定 Datagrid 的代碼:

Sub BindGrid()
    Dim SQL As String = "SELECT OrderID, 
      ShipName, ShipCountry, ShipVia FROM Orders"
    Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
    Dim DS As New DataSet
    DA.Fill(DS, "Orders")
    DataGrid1.DataSource = DS.Tables("Orders").DefaultView
    DataGrid1.DataBind()
End Sub
 
 


當前編輯的項目是在觸發 Datagrid 的 ItemDataBound 事件時綁定到 DropDownList 的。使用 ItemDataBound 事件時,請檢查當前項目的 ListItemType,否則您可能會發現您正在使用 HeaderItem 或其他不適用的項目類型。爲 EditItem 引用 DropDownList 控件。在下面的代碼中,我直接使用單元格控件集進行說明(爲了與後面的示例保持一致),但是,您可以採用簡單的方法,直接爲 DropDownList 控件指定 ID,並使用 Datagrid 項目的 FindControl 方法定位控件引用。由於 Datagrid 被綁定到 DataTable 的默認視圖,而該視圖的元素屬於 DataRowView 類型,所以您可以將當前項目的 DataItem 屬性轉換爲一個 DataRowView 實例。這樣,您可以按字段名直接引用 DataItem 中的字段。使用這種方法,將“ShipVia”的當前值保存到該記錄中,並使用它選擇相應的下拉列表項。

Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) _ 
      Handles DataGrid1.ItemDataBound
    If e.Item.ItemType = ListItemType.EditItem Then
        Dim DRV As DataRowView = CType(e.Item.DataItem, DataRowView)
        Dim CurrentShip As String = DRV("ShipVia")
        Dim DDL As DropDownList = _
      CType(e.Item.Cells(4).Controls(1), DropDownList)
        Dim SQL As String = _
      "SELECT ShipperID, CompanyName FROM Shippers ORDER BY ShipperID"
        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
        Dim DS As New DataSet
        Dim item As ListItem
        DA.Fill(DS, "Shippers")
        DDL.DataSource = DS.Tables("Shippers").DefaultView
        DDL.DataTextField = "CompanyName"
        DDL.DatavalueField = "ShipperID"
        DDL.DataBind()
        item = DDL.Items.FindByvalue(CurrentShip)
        If Not item Is Nothing Then item.Selected = True
    End If
End Sub
 
 


最後,編寫從 DropDownList 中檢索當前選定值的代碼,並執行數據庫更新:

Private Sub DataGrid1_UpdateCommand(ByVal source As Object, _
   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
   Handles DataGrid1.UpdateCommand
    Dim DDL As DropDownList = _
      CType(e.Item.Cells(4).Controls(1), DropDownList)
    Dim NewShip As Integer = DDL.Selectedvalue
    Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)
    Dim SQL As String = _
      "UPDATE Orders SET ShipVia=@Ship WHERE OrderID=@ID"
    Dim Conn As SqlConnection = New SqlConnection(ConnStr)
    Dim Cmd As New SqlCommand(SQL, Conn)
    Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))
    Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))
    Conn.Open()
    Cmd.ExecuteNonQuery()
    Conn.Close()
    DataGrid1.EditItemIndex = -1
    BindGrid()
End Sub
 
 


所有列的基礎:DataGridColumn

我們回顧一下所有內置列類型的父類型 DataGridColumn。(參見圖 1。)它包含所有 Datagrid 列中常用的屬性和方法。帶星號的類型表示您創建自定義列類型時要使用的類型。

DataGridColumn 屬性

FooterStyle (TableItemStyle) 
FooterText(字符串) 
HeaderImageUrl(字符串) 
HeaderStyle (TableItemStyle) 
HeaderText(字符串) 
ItemStyle (TableItemStyle) 
SortExpression(字符串) 
Visible(布爾值) 

DataGridColumn 方法

Initialize 
InitializeCell 
LoadViewState 
OnColumnChanged 
SaveViewState 
TrackViewState 
 
 


可重複使用的方法:創建 DropDownColumn
首先要在 Microsoft? Visual Studio? .NET 中創建一個新類庫,並將其命名爲 MyCustomColumn。添加一個新類 DropDownColumn,並確保在您的類定義中添加命名空間,這樣您的初始代碼應如下所示:

Namespace MyCustomColumn
    Public Class DropDownColumn
        Inherits DataGridColumn

        Public DataSource As ICollection
        Public DataField As String
        Public DataTextField As String
        Public DatavalueField As String

    End Class
End Namespace
 
 


我還聲明瞭 4 個公共屬性,如下所示: 
[html]
<UL type=disc>
  <LI><B>DataSource</B>。它是用來填充 <B>DropDownList</B> 的數據集。可以是實現 <B>ICollection</B> 接口的任何內容。在本文的示例中,我使用 <B>ArrayList</B> 和 <B>DataView</B>。
  <LI><B>DataField</B>。它是父 <B>Datagrid</B> 數據源中的字段,它與從下拉列表中選定的數據相對應。例如,如果 <B>DataSource</B> 包含一個狀態集,<B>DataField</B> 將類似於“StateCode”,也可以在表格中使用狀態隨意命名字段。
  <LI><B>DataTextField</B>。這是要顯示在下拉列表中的文本,可以是下面的值,也可以不是。
  <LI><B>DatavalueField</B>。這是表示特殊下拉選項的值。<B>DatavalueField</B> 通常是一個整數值或其他代碼,而 <B>DataTextField</B> 是對用戶來說更有意義的文本說明。 </LI>
</UL>[/html]

接下來,覆蓋 InitializeCell,它是 Datagrid 列的一個固有事件。列中的所有單元格都將發生 InitializeCell,它與直接使用 Datagrid 時的 ItemCreated 事件非常相似。您可以使用它來管理單元格內容,例如設置 HeaderText,添加您將向其中添加數據的 DropDownList 控件。我已經爲單元格的 DataBinding 事件添加了處理程序,需要根據當前是否正在編輯行來採取不同的處理方式。每個 System.Web.UI.Control 都有一個 DataBinding 事件,當數據被綁定到控件時,您可以從這裏訪問底層的數據,本例中爲 Datagrid 中的 TableCell 對象。

Public Overrides Sub InitializeCell(ByVal cell As TableCell, _
   ByVal columnIndex As Integer, _
   ByVal itemType As ListItemType)
       MyBase.InitializeCell(cell, columnIndex, itemType)
       Select Case itemType
              Case ListItemType.Header
                   cell.Text = HeaderText
              Case ListItemType.Item, ListItemType.AlternatingItem
                   AddHandler cell.DataBinding, AddressOf ItemDataBinding
              Case ListItemType.EditItem
                   AddHandler cell.DataBinding, AddressOf EditItemDataBinding
                   Dim DDL As New DropDownList
                   cell.Controls.Add(DDL)
            End Select
        End Sub
 
 

接下來是 ItemDataBinding 例程,當對 Datagrid 中的 Item 或 AlternatingItem 進行數據時,將觸發該例程。您需要引用回正在綁定的 TableCell,可以直接轉換傳遞給事件的“發送者”對象,再使用 TableCell 的 NamingContainer 屬性引用當前的 DataGridItem。這裏只能以純文本格式顯示 DataField 的內容,就象顯示在 BoundColumn 中一樣。最後,如果用戶指定的字段不存在,我將爲用戶顯示更友好的錯誤信息,而不是僅僅顯示“索引超出範圍”這樣的一般信息。

Private Sub ItemDataBinding(ByVal sender As Object, ByVal e As EventArgs)
     Dim cell As TableCell = CType(sender, TableCell)
     Dim DGI As DataGridItem = CType(cell.NamingContainer, DataGridItem)
     Try
          cell.Text = DGI.DataItem(DataField)
     Catch RangeEx As IndexOutOfRangeException
          Throw New Exception("Specified DataField was not found.")
     Catch OtherEx As Exception
          Throw New Exception(OtherEx.InnerException.ToString)
     End Try
 End Sub
  
 


下一步,編寫 EditItemDataBinding 事件的代碼,當某個行進入“編輯”模式時,將在我們的自定義列單元格上觸發該事件。再次引用當前單元格並在調用 InitializeCell 方法時插入 DropDownList 控件。在 DropDownList 中添加一個空項目作爲第一個選項,如果列中的當前數據與您從 DataSource 集合中選擇並放在列表中的任何項目都不匹配,則選擇該選項。

然後,需要確定所傳入集合的類型。在本例中,我將處理兩種情況:通過 ArrayList 傳遞一組字符串,或者數據表中的 DataView,它由 DataRowView 項目構成。對於字符串數據,我將輸入一個新的 ListItem,並設置下拉項的值和文本。由於這兩種情況是相同的,所以這裏只需要文本。但是我將選擇相應的項目來根據值作出選擇,以便與下一個示例保持一致,下一個示例將設置一個單獨的值屬性。對於 DataRowView 項目,上一個示例中已指出,DataRowViewInstance("FieldName") 返回一個表示該字段中的數據的對象。可以使用同樣的方法檢索 DataTextField 和 DatavalueFields 需要的值。

最後,拋出一些異常以處理開發人員使用列時遇到的常見錯誤,例如向 DataField 屬性發送無效字段名,或傳入不兼容的 DataSource 類型。我已經對要彈出的異常消息進行了硬編碼,但希望您在實際的應用程序中將這些消息保存到更容易配置的位置。例如,如果您希望在全球範圍內使用您的應用程序,則可以保存到您的 web.config 文件或資源文件中。同樣,您不一定非要再次拋出“未找到指定的 DataField”異常,因爲在 Datagrid 被置於“編輯”模式之前可能已經在 ItemDataBinding 事件中捕獲了該異常。

Private Sub EditItemDataBinding(ByVal sender As Object, _
ByVal e As EventArgs)
            Dim cell As TableCell = CType(sender, TableCell)
            Dim DDL As DropDownList = _
CType(cell.Controls(0), DropDownList)
            Dim DataSourceItem As Object
            Dim item As ListItem
            Dim DGI As DataGridItem

            '首先添加一個空選項
            DDL.Items.Add(New ListItem(""))
            For Each DataSourceItem In DataSource
                Select Case DataSourceItem.GetType.ToString
                    Case "System.String" '應用到 ArrayList 示例
                        item = New ListItem(DataSourceItem, DataSourceItem)
                        DDL.Items.Add(item)
                    Case "System.Data.DataRowView"
                        Dim DRV As DataRowView = _
                           CType(DataSourceItem, DataRowView)
                        item = New_
              ListItem(DRV(DataTextField), DRV(DatavalueField))
                        DDL.Items.Add(item)
                    Case Else
                        Throw New Exception("Invalid DataSource type.")
                End Select
            Next

            Try
                DGI = CType(cell.NamingContainer, DataGridItem)
                item = DDL.Items.FindByvalue(DGI.DataItem(DataField))
            Catch RangeEx As IndexOutOfRangeException
                Throw New Exception("Specified DataField was not found.")
            Catch OtherEx As Exception
                Throw New Exception(OtherEx.InnerException.ToString)
            End Try

            If Not item Is Nothing Then item.Selected = True
End Sub
 
 


使用 DropDownColumn
以上是創建 DropDownColumn 類所需的所有代碼,下面我們看一看如何在應用程序中使用該控件。如果您是在家中學習,而且還沒有開始做,請將上面創建的命名空間編譯到 MyCustomColumn.dll 中,並將其複製到您想試驗的應用程序的 /bin 文件夾中。本例中,我創建一個新的 Web 應用程序 UseCustomColumn,並在我的 /bin 目錄的 MyCustomColumn.dll 中添加一個引用。在 ASPX 文件的頂部,添加 @Register 指令:

<%@ Register TagPrefix="dgg" 
      Namespace="MyCustomColumn" 
      Assembly="MyCustomColumn" %>
 
 


請注意,新的 Datagrid 列類型不會爲 Datagrid 出現在 Visual Studio .NET 屬性生成器中,因此您需要進入 HTML 視圖並在其中添加列聲明。確保 Datagrid 聲明位於一組 <form runat="server">...</form> 標記之中,這些標記用於處理 PostBack。ASPX 文件的其餘部分應如下所示:

<%@ Page Language="vb" 
   AutoEventWireup="false" 
   Codebehind="WebForm1.aspx.vb" 
   Inherits="UseCustomColumn.WebForm1" 
Trace="False" Debug="True"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
   <HEAD>
      <title>WebForm1</title>
      <LINK rel="stylesheet" type="text/css" href="Styles.css">
      <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
      <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
      <meta name="vs_defaultClientscript" content="Javascript">
      <meta name="vs_targetSchema" 
         content="http://schemas.microsoft.com/intellisense/ie5">
   </HEAD>
   <body>
   <form id="Form1" method="post" runat="server">
   <asp:DataGrid id="DataGrid1" 
      runat="server" CssClass="grid" 
      AutoGenerateColumns="False">
      <Columns>
         <asp:EditCommandColumn 
            EditText="Edit" CancelText="Cancel" 
            UpdateText="Update" />
         <asp:BoundColumn 
            DataField="OrderID" 
            ReadOnly="True" 
            HeaderText="Order ID"/>
         <asp:BoundColumn 
            DataField="ShipName" 
            HeaderText="Ship to" 
            ReadOnly="True"/>
         <asp:BoundColumn 
            DataField="ShipCountry" 
            HeaderText="Country" 
            ReadOnly="True"/> 
         <dgg:DropDownColumn DataField="ShipVia" HeaderText="Ship Method" />
      </Columns>
   </asp:DataGrid>
   </form>
   </body>
</HTML>
 
 


Datagrid 被綁定到 Northwind 示例的 Orders 表,自定義 DropDownColumn 被綁定到 ShipVia 列。現在我只設置 DataField 屬性,因爲剛剛綁定到一個簡單的 ArrayList,不需要 DataTextField 和 DatavalueField 屬性。如果您有預定義的常數列表或者您需要一個快速設置選項的方法,ArrayList 選項最簡單。DropDownColumn 的 DataSource 在代碼中設置,首先引用 DropDownColumn:

Dim DDC As MyCustomColumn.DropDownColumn
DDC = CType(DataGrid1.Columns(4), MyCustomColumn.DropDownColumn)
 Dim AL As New ArrayList
 AL.Add("Shipping Company A")
 AL.Add("Shipping Company B")
 AL.Add("Shipping Company C")
 DDC.DataSource = AL
 
 


下面是運行此代碼的結果:

 


圖 3:使用 ArrayList

接下來,我需要轉換該示例以便使用數據庫中的活動表。ShipVia 是查找表 Shippers 的外鍵,我在代碼中將其指定爲 DropDownColumn 的 DataSource。我還需要改變 DropDownColumn 聲明,以包括與 Shippers 表中的相應字段匹配的 DataTextField 和 DatavalueField 名稱:

<dgg:DropDownColumn 
   DataField="ShipVia" 
   DataTextField="CompanyName" 
   DatavalueField="ShipperID" HeaderText="Ship Method" />
 
 


然後將兩個 Orders 表綁定到 Datagrid,將 Shippers 表綁定到自定義列:

     Dim SQL As String = 
     "SELECT OrderID, ShipName, ShipCountry, ShipVia FROM Orders"
        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)
        Dim DS As New DataSet
        DA.Fill(DS, "Orders")
        'Dim Cmd As SqlCommand = New SqlCommand(SQL, Conn)
        'Conn.Open()
        'DataGrid1.DataSource = _
      Cmd.ExecuteReader(CommandBehavior.CloseConnection)
        DataGrid1.DataSource = DS.Tables("Orders").DefaultView
        SQL = "SELECT ShipperID, CompanyName " & _
            "FROM Shippers ORDER BY ShipperID"
        DA.SelectCommand.CommandText = SQL
        DA.Fill(DS, "Shippers")
        DDC.DataSource = DS.Tables("Shippers").DefaultView
        DataGrid1.DataBind()
 
 


DataGridColumn 使用活動數據,根據 Orders 表中的值(1、2 或 3)自動選擇正確的項目,如下所示:

 

圖 4:從數據庫中檢索數據

使用 DropDownColumn 的最後一步是檢索選定的值以傳遞迴數據庫更新。爲此,只需在單元格內引用 DropDownList 控件,並確定其 Selectedvalue 屬性:

 Private Sub DataGrid1_UpdateCommand( _
   ByVal source As Object, _
   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _
   Handles DataGrid1.UpdateCommand
        Dim CustomDDL As DropDownList = _
CType(e.Item.Cells(4).Controls(0), DropDownList)
        Dim NewShip As Integer = CustomDDL.Selectedvalue
        Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)
        Dim SQL As String = _
         "UPDATE Orders SET ShipVia=@Ship WHERE OrderID=@ID"
        Dim Conn As SqlConnection = New SqlConnection(ConnStr)
        Dim Cmd As New SqlCommand(SQL, Conn)
        Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))
        Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))
        Conn.Open()
        Cmd.ExecuteNonQuery()
        Conn.Close()
        DataGrid1.EditItemIndex = -1
        BindGrid()
    End Sub
 
 


小結
上文概述瞭如何以 DataGridColumn 爲父類型創建一個新類型、如何進行數據綁定以及如何將其應用到實際應用程序中。這只是可重複使用的 Datagrid 列的一個示例,因此,您需要檢查您自己的應用程序,以確定哪些重複的功能可以封裝到其自己的自定義 Datagrid 列中。您可以開發自己的列,以解決常見問題(例如,在列中顯示 DropDownList),或滿足您公司的特殊需要。您也不必拘泥於本文的示例,只在自定義列中包含一個 ASP.NET 控件,您可以編寫更復雜的結構,例如將一系列控件、第三方內容或整個 Datagrid 控件嵌套到列中,以表現多層信息。總之,您可以充分發揮您的想象力。

5 個內置的列類型非常有用,它們可以滿足使用 Datagrid 控件進行顯示的大多數情況下的需要。現在並沒有開發您自己的控件,只是將一些有意義的內容隨便放到 TemplateColumn 中。創建自定義列使您可以突破這些限制,在您的 Datagrid 應用程序中添加豐富的功能。

作者簡介
“Datagrid 女孩”Marcie Robillard 是 Microsoft 最優秀的 ASP.NET 專家,她是一位獨立的 ASP.NET 顧問和培訓師。ASP.NET Datagrid 是她的專業,她還專門爲此創建了一個 Web 站點 DatagridGirl.com。您可以從該站點找到優秀 Datagrid 文章的鏈接、Datagrid 內容的書評以及不斷增加的 Datagrid 常見問題。Marcie 還花費了大量時間主持 ASP.NET 論壇,回答有關 Datagrid 的各種問題。Marcie 當前的任務是指導各公司開發自己的 .NET 技術。如果您的組織需要這方面的專業諮詢或培訓,請聯繫 [email protected]

參考站點:
MetaBuilders.com。免費的自定義 Datagrid 列,包括源代碼 (C#)。

DatagridGirl.com。有關 Datagrid 的各種資源。

Scott Mitchell 著的《ASP.NET Data Web Controls》,SAMS 2003 年出版。ISBN 0672325012
posted on 2004-12-06 11:13 毛小華 閱讀(946) 評論(1)  編輯 收藏

Feedback
9:10 | 評論 (0)

C#版的網站新聞發佈系統
寫這篇文章的時候首先要向bben_h 和jdxx表示感謝,是bben_h提出了C#中字符替換這個問題,jdxx很好的解決了這個問題,同時也使我想起以前做的一些程序(簡單網站新聞發佈系統),現在就把它奉獻給大家,希望能對大家學習通過ADO.NET操作SqlServer數據庫和DataGrid控制元件有些幫助。
  數據庫結構

  數據庫名:mydb,數據表名:news
  news表結構
  id(int 4) 遞增ID
  biaoti(nvarchar 50) 新聞標題
  zhaizi(nvarchar 50) 出自
  neirong(ntext 16) 新聞內容
  shijian(datatime 8)發佈時間
  img(nvarchar 50)圖片路徑
  counter(int 4)點擊次數
 
  程序中連接SqlServer數據庫,其中netfiresoft是我的機子的名稱。
 
  網站新聞發佈系統源程序:(數據庫用的是SqlServer)
 
  增加頁面(addnews.aspx)
 
  〈%@Page language="C#" Debug="True"%〉
  〈%@Import Namespace="System.Data"%〉
  〈%@Import Namespace="System.Data.SqlClient"%〉
  〈html〉
  〈head〉
  〈title〉網站新聞信息添加頁面〈/title〉
  〈style type="text/css"〉
  〈!--
  table {  font-size: 9pt}
  body {  font-size: 9pt}
  --〉
  〈/style〉
  〈Script Language="C#" runat="server"〉
  void submit_Click(Object sender,EventArgs e)
  {
  //當單擊提交按鈕之後執行下面的代碼
   SqlConnection MyConnection;
  SqlCommand MyCommand;
  String ConnStr;
   DateTime now= DateTime.Now;
   //鏈接SQL Server數據庫
  MyConnection =new SqlConnection("Initial Catalog=mydb;Data Source=netfiresoft;Integrated Security=SSPI;");
  MyConnection.Open();
  String neirong2;
  neirong2=Server.HtmlEncode(neirong.Text);
  String zh="";
  String tmpstr="";
  for (int i=0; i〈neirong2.Length;i++) {
  zh=neirong2.Substring(i,1);
 if (zh==" ") { zh=" ";}
 if (zh=="/n") { zh="〈br〉"; }
 if (zh=="/t") { zh="    ";}
 tmpstr=tmpstr+zh; }
 neirong2=tmpstr;
  if ((biaoti.Text=="")||(neirong2==""))
 {
  Label1.Text="標題或內容不能爲空!";
  }
  else if (biaoti.Text.Length〉=100)
 {
  Label1.Text="你的標題太長了!";
 }
  else if (img.Text.Length〉=100)
 {
  Label1.Text="你的圖片路徑太長了!";
 }
  else
 {
  //將新記錄插入到數據庫中
  ConnStr="insert into news(biaoti,zhaizi,neirong,shijian,img,counter) VALUES(‘"+biaoti.Text+"‘,
‘"+zhaizi.Text+"‘, ‘"+neirong2+"‘, ‘"+now.ToString()+"‘, ‘"+img.Text+"‘,0)";
  MyCommand=new SqlCommand(ConnStr,MyConnection);
  MyCommand.ExecuteNonQuery();
  Label1.Text="增加成功!";
 }
  biaoti.Text="";
  zhaizi.Text="";
  neirong.Text="";
  img.Text="";
}
void reset_Click(Object sender,EventArgs e)
{
  //當單擊取消按鈕之後執行下面代碼
  biaoti.Text="";
  zhaizi.Text="";
  neirong.Text="";
  img.Text="";
}
〈/Script〉
〈/head〉
〈body 〉
〈table width="550" border="1" cellspacing="0" cellpadding="0" align="center"
bordercolorlight="#666666" bordercolordark="#FFFFFF"〉
〈form runat=server〉
 〈tr bgcolor="#CCCCCC"〉
  〈td colspan="2"〉網站新聞信息添加頁面〈/td〉
 〈/tr〉
 〈tr〉
  〈td colspan="2"〉 〈/td〉
 〈/tr〉
 〈tr〉
  〈td width="78"〉標題:〈/td〉
  〈td width="416"〉 〈asp:TextBox  id="biaoti" size="50" runat="server"/〉
  〈/td〉
 〈/tr〉
 〈tr〉
  〈td width="78"〉摘自:〈/td〉
  〈td width="416"〉 〈asp:TextBox id="zhaizi" size="30" runat="server"/〉 〈/td〉
 〈/tr〉
 〈tr〉
  〈td width="78"〉圖片:〈/td〉
  〈td width="416"〉〈asp:TextBox id="img" size="30" runat="server"/〉〈/td〉
 〈/tr〉
 〈tr〉
  〈td width="78"〉內容:〈/td〉
  〈td width="416"〉 〈asp:TextBox id="neirong" Columns="60" Rows="15" TextMode="MultiLine" runat="server"〉〈/asp:TextBox〉〈/td〉
 〈/tr〉
 〈tr〉
  〈td colspan="2"〉 〈/td〉
 〈/tr〉
 〈tr〉
  〈td colspan="2"〉
  〈div align="center"〉
   〈asp:Button  id="submit"  onClick=submit_Click runat="server" Text="提交"〉〈/asp:Button〉
   〈asp:Button  id="reset" onClick=reset_Click runat="server" Text="取消"〉〈/asp:Button〉
  〈/div〉
  〈/td〉
 〈/tr〉
〈/form〉
〈/table〉
〈p align="center"〉〈asp:Label id="Label1"  runat="server"/〉
〈/body〉
〈/html〉
 
  顯示新聞標題頁面(newsshow.aspx):(用到DataGrid控制元件)
 
%@Page language="C#" Debug="True"%〉
%@Import Namespace="System.Data"%〉
%@Import Namespace="System.Data.SqlClient"%〉
〈Html〉
〈Head〉
〈Title〉網站新聞發佈系統〈/Title〉
〈script language="C#" runat="server" 〉
//當剛載入頁面時候執行下面的程序。
int startIndex;
void Page_Load(Object Src,EventArgs E)
{
   if (!IsPostBack)
   {
           startIndex =0;
    }          
//綁定DataGrid
Binding();
}
//鏈接數據庫,綁定DataGrid
void Binding()
{
 SqlConnection MyConnection;
 String ConnStr;
 MyConnection =new SqlConnection("Initial Catalog=mydb;Data Source=netfiresoft;Integrated Security=SSPI;");
 MyConnection.Open();
 String strCom= "SELECT  id ,biaoti ,zhaizi ,counter ,shijian FROM news ORDER BY id DESC";
 DataSet myDataSet= new DataSet();
 SqlDataAdapter myCommand=new SqlDataAdapter(strCom,MyConnection);
 //填充DataSet
 myCommand.Fill(myDataSet,"news");
 //關閉鏈接
 DataGrid1.DataSource = myDataSet.Tables["news"].DefaultView;
 //綁定 DataGrid
 DataGrid1.DataBind();
}
void ChangePage(Object sender,DataGridPageChangedEventArgs e)
{
     startIndex = e.NewPageIndex*DataGrid1.PageSize;
     DataGrid1.CurrentPageIndex = e.NewPageIndex;
     Binding();
}
〈/script〉
〈/Head〉
〈Body runat=server〉
〈p align="Center"〉〈font size="+3"〉新聞瀏覽〈/font〉
〈form runat=server〉
〈asp:DataGrid id=DataGrid1
 runat="server"
 ForeColor="Black"
 PagerStyle-Mode="NumericPages"
 Headerstyle-BackColor="#AAAADD"
 AlternatingItemStyle-BackColor="#FFFFCD"
 OnPageindexChanged="ChangePage"
 PageSize="10"
 AllowPaging="True"
 Width="80%"
 Font-Name="Verdana"
 Font-Size="8pt"
 autogeneratecolumns="False"〉
〈Columns〉
〈asp:HyperLinkColumn
               HeaderText="標題"
               DataNavigateUrlField="id"
               DataNavigateUrlFormatString="show.aspx?id={0}"
               DataTextField="biaoti"
               Target="_new"
               /〉
〈asp:BoundColumn HeaderText="摘自" itemstyle-width=20% DataField=zhaizi/〉
〈asp:BoundColumn HeaderText="點擊次數" itemstyle-width=10% DataField=counter/〉
〈asp:BoundColumn HeaderText="發表日期" itemstyle-width=20% DataField=shijian/〉
〈/Columns〉
〈/asp:DataGrid〉
〈/form〉
〈/Body〉
〈/Html〉
 
  新聞內容瀏覽頁面(show.aspx):
 
%@Page language="C#" Debug="True"%〉
%@Import Namespace="System.Data"%〉
%@Import Namespace="System.Data.SqlClient"%〉
〈html〉
〈head〉
〈title〉新聞發佈系統〈/title〉
〈style type="text/css"〉
〈!--
TABLE {    FONT-SIZE: 9pt }
INPUT {    FONT-SIZE: 9pt }
SELECT{ FONT-SIZE: 9pt }
BODY {    FONT-SIZE: 9pt }
a:link { color: #000099; text-decoration: none}
a:visited { color:#000099; text-decoration: none}
a:hover { color: #990000; text-decoration: underline}
td {font-size:9pt;line-height:13pt;}
.p1 {  font-family: "宋體"; font-size: 9pt}
.p2 {  }
.p3 {  font-family: "宋體"; font-size: 12pt}
--〉
〈/style〉
〈script Language="C#" runat="server"〉
 DataSet ds;
 DataRow dr;
 String newsid;
void Page_Load(Object sender,EventArgs e)
{
 SqlConnection MyConnection;
 String ConnStr,strCon;
 newsid = Request.Params["id"];
 MyConnection =new SqlConnection("Initial Catalog=mydb;Data Source=netfiresoft;Integrated Security=SSPI;");
 MyConnection.Open();
 String strCom= "SELECT  biaoti ,zhaizi ,neirong,img,counter ,shijian FROM news where id="+newsid;
 ds= new DataSet();
 SqlDataAdapter myCommand=new SqlDataAdapter(strCom,MyConnection);
 myCommand.Fill(ds,"news");
 dr = ds.Tables["news"].Rows[0];
 strCon ="SELECT counter FROM news WHERE id = "+newsid;
 SqlCommand myCommand2= new SqlCommand(strCon, MyConnection);
 SqlDataReader reader = myCommand2.ExecuteReader();
 reader.Read();
 int i = reader.GetInt32(0);
 i++;
 reader.Close();
 strCon ="UPDATE news SET counter = "+i.ToString()+" WHERE (id= "+newsid+")";
 myCommand2.CommandText = strCon;
 myCommand2.ExecuteNonQuery();
 MyConnection.Close();
}
〈/script〉
〈/head〉
〈body bgcolor="#FFFFFF" link="#000000"〉
〈div align="center" class="p2"〉
〈table width="500" border="0" cellspacing="0" cellpadding="0"〉
 〈tr〉
  〈td〉〈div align="center"〉新聞發佈系統〈/div〉〈/td〉
 〈/tr〉
 〈tr〉〈td〉 〈/td〉
 〈/tr〉
〈/table〉
〈table width="500" border="1" cellspacing="0" cellpadding="0" bordercolordark="#FFFFFF" bordercolorlight="#CCCCCC"〉
 〈tr〉
  〈td background="mmto.gif" height="15" width="470"〉
  〈table width="500" border="0" cellspacing="0" cellpadding="0" background="mmto.gif"〉
   〈tr〉
    〈td background="mmto.gif"〉 〈/td〉
    〈td background="mmto.gif"〉
      〈div align="right"〉
      〈img src="printer.gif" width="16" height="14"〉
      〈a href="javascript:window.print()"〉打印本頁〈/a〉
      〈/div〉
    〈/td〉
   〈/tr〉
  〈/table〉
  〈/td〉
 〈/tr〉
 〈tr〉
  〈td width="470"〉
   〈table width="500" border="0" cellspacing="0" cellpadding="0"〉
    〈tr align="center"〉
     〈td class="p3"〉〈br〉 〈%=dr["biaoti"]%〉〈/td〉
    〈/tr〉
    〈tr align="center"〉
     〈td〉 〈div〉 〈hr size="1" width="300"〉
          〈font color="#999999"〉[〈%=dr["shijian"]%〉]〈/font〉〈br〉
          〈/div〉
     〈/td〉
    〈/tr〉
    〈tr〉
     〈td〉
        〈%
           if(dr["img"] != "") {
           Response.Write("〈img src=‘" + dr["img"] + "‘ border=0 align=‘left‘ width=‘20‘ height=‘200‘〉");
        }
        %〉〈br〉 〈%=dr["neirong"]%〉
     〈/td〉
    〈/tr〉
    〈tr〉
     〈td〉 〈br〉  
          〈br〉 摘自: 〈%=dr["zhaizi"]%〉
          〈br〉
     〈/td〉
    〈/tr〉
    〈tr〉
     〈td〉
      〈div align="right"〉〈/div〉
     〈/td〉
    〈/tr〉
   〈/table〉
  〈/td〉
 〈/tr〉
 〈tr〉
  〈td height="17"〉
   〈table width="498" border="0" cellspacing="0" cellpadding="0" mmto.gif"〉
    〈tr〉
     〈td width="172" background="mmto.gif"〉本條消息被瀏覽了
       〈font color="#FF3333"〉[〈%=dr["Counter"]%〉]〈/font〉回
     〈/td〉
     〈td width="172" background="mmto.gif"〉 
     〈/td〉
     〈td width="134" background="mmto.gif"〉
      〈p align="right"〉〈a href="javascript:window.close()"〉關閉本窗口 〈/a〉〈/p〉
     〈/td〉
    〈/tr〉
   〈/table〉
  〈/td〉
 〈/tr〉
〈/table〉
〈table width="500" border="0" cellspacing="0" cellpadding="0"〉
 〈tr〉
  〈td〉〈img src="bian.gif" width="500" height="13"〉〈/td〉
 〈/tr〉
〈/table〉
〈/div〉
〈/body〉
〈/html〉


9:08 | 評論 (1)

如何顯示在線人數和所在位置
一、原理
在.net中的global.asax中有Application_AuthenticateRequest事件和Application_BeginRequest事件是在每次訪問aspx文件都會觸發。但是Application_BeginRequest中不能對已經經過FROMS身份驗證的身份ticket票進行識別。所以只能放到Application_AuthenticateRequest中去。

我的實現原理是:每次訪問aspx文件時候都會判斷在線表裏面是否有這個用戶(已經登錄了的記錄用戶名,沒有登錄的記錄IP地址),如果不存在,則將該用戶的身份、最後訪問時間、最後訪問IP、和最後訪問的URL存入數據庫。如果數據庫中已經曾在,則更新該記錄,把最後訪問時間,IP以及最後訪問URL更新。

同時,刪除數據庫中與當前時間間隔20分鐘以上的數據(20分鐘沒操作當爲超時)。

二、優點
這樣,你不僅僅可以看到當前在線的準確人數,還知道是那些人在線,以及是否登陸,和訪問人數中已經是會員的比例,以及所在位置,並計算某個頁上的人數。

三、數據庫結構:
主鍵    字段            類型    長度    是否爲空說明
1uson_serialint40序號
0uson_uservarchar200用戶名(沒登陸則爲IP)
0uson_companyvarchar1000公司名(沒登陸則爲'遊客')
0uson_ip        varchar200IP地址
0uson_datedatetime80最後操作時間
0uson_urlvarchar1000最後操作頁面路徑

四、程序
注意:
1、程序位於global.asax中
2、我是使用的FORMS身份驗證
3、請using System.Web.Security

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
string strUserID = string.Empty;
string strCompany = string.Empty;
if (Request.IsAuthenticated)
{
FormsIdentity identity = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = identity.Ticket;
strUserID = User.Identity.Name;
strCompany = ticket.UserData.Split("|".ToCharArray())[2];
}
else
{
strUserID = Request.UserHostAddress;
strCompany = "遊客";
}

MemberOnlineInfo objOnline = new MemberOnlineInfo(strUserID, Request.UserHostAddress, DateTime.Now.ToString(), Request.FilePath, strCompany);

MemberAccount account = new MemberAccount();
if (!account.CheckUserOnline(strUserID))
account.AddOnline(objOnline);
else
account.UpdateOnline(objOnline);

//刪除超時的會員
account.DeleteOnline();
}


9:07 | 評論 (2)

不走尋常路 設計ASP.NET應用程序的七大絕招
隨着微軟.NET的流行,ASP.NET越來越爲廣大開發人員所接受。作爲ASP.NET的開發人員,我們不僅需要掌握其基本的原理,更要多多實踐,從實踐中獲取真正的開發本領。在我們的實際開發中,往往基本的原理滿足不了開發需求,我們更多的要積累一些開發技巧,本文就向大家介紹一些實用技巧,希望對大家的開發有所裨益。
  1. ~ 的用法

  一般的情況下,我們是使用./../ 這樣的相對路徑來確定和規劃我們的資源(比如圖片、資源文件),但這種方式下在我們部署應用的時候,可能會出錯,另外對於.ascx的控件中如果包含了一個圖片,而這個控件被我們在不同層次的兩個目錄的aspx文件分別引用時,問題就會出現了。

  ~/image/about.bmp 是一種非常好的方法,它以Web應用程序的根目錄爲起始點,這樣使得比你使用./image/about.bmp這樣的方式要更加靈活和方便。有一點不好,是這種方式是在ASP.NET運行時動態解析的,所以在IDE設計模式中,你可能不能預覽它。

  2. 在刷新和提交頁面後,保存你的頁面滾動條的位置

  經常有這樣的情況,我們需要用戶提交一個表單,但是表單中有超過500+個?控件或文本框要填寫,也就是說用戶需要拉動IE的滾動條才能夠填得完,那麼假如用戶正在可見IE範圍的2/3處,選擇了一個組合框的值,很不幸組合框是服務器端的,那麼也就意味着頁面會提交一次,而當用戶再看見刷新過的頁面時,頁面確定在3/1的地方也就是顯示在頁面最開始的地方,用戶只有拖動鼠標,然後接着剛剛的地方再填寫剩下的250個控件,很不幸,370個控件又需要他選擇一下?

  用下面的方法可以很快地確定和記住你提交前的位置。

  網上的Old Dog Learns New Tricks也有一個類似的例子Maintain Scroll Position in any Page Element,不過他使用了Web Behavior這意味着你需要使用一個.htc文件

Private Sub RetainScrollPosition()

Dim saveScrollPosition As New StringBuilder
Dim setScrollPosition As New StringBuilder

RegisterHiddenField("__SCROLLPOS", "0")
saveScrollPosition.Append("<script language='javascript'>")
saveScrollPosition.Append("function saveScrollPosition() {")
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = thebody.scrollTop;")
saveScrollPosition.Append("}")
saveScrollPosition.Append("thebody.οnscrοll=saveScrollPosition;")
saveScrollPosition.Append("</script>")

RegisterStartupScript("saveScroll", saveScrollPosition.ToString())

If (Page.IsPostBack = True) Then

setScrollPosition.Append("<script language='javascript'>")
setScrollPosition.Append("function setScrollPosition() {")
setScrollPosition.Append(" thebody.scrollTop = " & Request("__SCROLLPOS") & ";")
setScrollPosition.Append("}")
setScrollPosition.Append("thebody.οnlοad=setScrollPosition;")
setScrollPosition.Append("</script>")
RegisterStartupScript("setScroll", setScrollPosition.ToString())

End If

End Sub

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RetainScrollPosition()
End Sub
  3. DataList使用不同風格的模板

  這招也非常實用,你可以製作兩個不同的模板或表現形式,分別以.ascx控件的形式保存,運行時根據某個條件動態的選擇使用其中的一個模板,另外ScottGu認爲ItemDataBound方法也可以定製你顯示的表現,比如加亮某個元素或是加一個促銷廣告圖等等。

Dim theme As String
theme = DropDownList1.SelectedValue

DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
DataList1.DataSource = DS
DataList1.DataBind()

  4. 設置服務器端控件的焦點

Private Sub SetFocus(ByVal controlToFocus As Control)
Dim scriptFunction As New StringBuilder
Dim scriptClientId As String

scriptClientId = controlToFocus.ClientID
scriptFunction.Append("<script language='javascript'>")
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
scriptFunction.Append("</script>")
RegisterStartupScript("focus", scriptFunction.ToString())
End Sub

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If (Page.IsPostBack = False) Then
SetFocus(TextBox1)
End If
End Sub

  5. 滾動DataGrid

  這招就更簡單了,有時候你的頁面只有一個固定的地方,但是需要顯示非常多的數據,亦或是也不定,但是隻有固定的一個地方給你顯示它了。這時你就可以用下面這招,自動出滾動條,而且適用許多控件。很簡單將你的控件放在一個DIV中將overflow屬性設置成auto

<div style=“height:400px;width:200px;overflow:auto”>
<asp:datagrid id=“MyGrid” runat=“server”/>
</div>

  6. 動態創建控件

  利用PlaceHolder控件,這東西在ASP.NET 2.0 Mutil-View和Master Page中運用的就更加多了。

Sub Page_Load()
Dim i as Integer
For i=0 to 4
Dim myUserControl as Control
myUserControl = Page.LoadControl(“foo.ascx”)
PlaceHolder1.Controls.Add(myUserControl)
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
Next i
End Sub

  7. 客戶端代碼的使用

  1). 可以使用客戶端的事件代碼,但兩者不能同名,服務器端代碼的名是你可以控制的。對於非ASP.NET的標準控件的自定義控件必須實現IAttributeAccessor接口或從WebControl派生並且可用expando屬性

asp:ImageButton id=“foo”
ImageUrl=“start.jpg”
onMouseOver=“rollover(this);”
onMouseOut=“rollout(this)”
rolloversrc=“myrollover.jpg”
rolloutsrc=“myrollout.jpg”
runat=“server”/>

<input type=Button onClick=“return clientHandler()”
onServerClick=“Button1_Click” … />

  2). 使用可以在Postback之前執行客戶端代碼,當然也可以取消這次Postback,另外也可以訪問客戶端該頁所有的客戶端控件。

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles MyBase.Load
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
End Sub

  3). 還有更復雜的我認爲不實用,大家可以自己去看,主要是運用RegisterStartupScript和JavaScript的技術

  以上文章介紹了一些ASP.NET中常用而且比較實用的技巧,希望能對大家的實際開發有所裨益!

 

9:06 | 評論 (2)

爲ASP.NET封裝的SQL數據庫訪問類
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace MyCorporation.DepartMent.DataBase
{
 /// <summary>
 /// 通用數據庫類
 /// </summary>
 public class DataBase
 {

  private string ConnStr = null;

  public DataBase()
  {
   ConnStr = ConfigurationSettings.AppSettings["ConnStr"];
  }
  public DataBase(string Str)
  {
   try
   {
    this.ConnStr = Str;

   }
   catch(Exception ex)
   {
    throw ex;
   }
  }

  /// <summary>
  /// 返回connection對象
  /// </summary>
  /// <returns></returns>
  public SqlConnection ReturnConn()
  {
   SqlConnection Conn = new SqlConnection(ConnStr);
   Conn.Open();
   return Conn;
  }
  public void Dispose(SqlConnection Conn)
  {
   if(Conn!=null)
   {
    Conn.Close();
    Conn.Dispose();
   }
   GC.Collect();
  }
  /// <summary>
  /// 運行SQL語句
  /// </summary>
  /// <param name="SQL"></param>
  public void RunProc(string SQL)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlCommand Cmd ;
   Cmd = CreateCmd(SQL, Conn);
   try
   {
    Cmd.ExecuteNonQuery();
   }
   catch
   {
    throw new Exception(SQL);
   }
   Dispose(Conn);
   return;
  }   

  /// <summary>
   /// 運行SQL語句返回DataReader
  /// </summary>
    /// <param name="SQL"></param>
    /// <returns>SqlDataReader對象.</returns>
  public SqlDataReader RunProcGetReader(string SQL)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlCommand Cmd ;
   Cmd = CreateCmd(SQL, Conn);
   SqlDataReader Dr;
   try
   {
    Dr = Cmd.ExecuteReader(CommandBehavior.Default);
   }
   catch
   {
    throw new Exception(SQL);
   }
   //Dispose(Conn);
   return Dr;
  }

  /// <summary>
  /// 生成Command對象
  /// </summary>
  /// <param name="SQL"></param>
  /// <param name="Conn"></param>
  /// <returns></returns>
  public SqlCommand CreateCmd(string SQL, SqlConnection  Conn)
  {
   SqlCommand Cmd ;
   Cmd = new SqlCommand(SQL, Conn);
   return Cmd;
  }
 
  /// <summary>
  /// 生成Command對象
  /// </summary>
  /// <param name="SQL"></param>
  /// <returns></returns>
  public SqlCommand CreateCmd(string SQL)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlCommand Cmd ;
   Cmd = new SqlCommand(SQL, Conn);
   return Cmd;
  }

  /// <summary>
  /// 返回adapter對象
  /// </summary>
  /// <param name="SQL"></param>
  /// <param name="Conn"></param>
  /// <returns></returns>
  public SqlDataAdapter CreateDa(string SQL)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlDataAdapter Da;
   Da = new SqlDataAdapter(SQL, Conn);
   return Da;
  }

  /// <summary>
  /// 運行SQL語句,返回DataSet對象
  /// </summary>
  /// <param name="procName">SQL語句</param>
  /// <param name="prams">DataSet對象</param>
  public DataSet RunProc(string SQL ,DataSet Ds)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlDataAdapter Da;
   //Da = CreateDa(SQL, Conn);
   Da = new SqlDataAdapter(SQL,Conn);
   try
   {
    Da.Fill(Ds);
   }
   catch(Exception Err)
   {
    throw Err;
   }
   Dispose(Conn);
   return Ds;
  }

  /// <summary>
  /// 運行SQL語句,返回DataSet對象
  /// </summary>
  /// <param name="procName">SQL語句</param>
  /// <param name="prams">DataSet對象</param>
  /// <param name="dataReader">表名</param>
  public DataSet RunProc(string SQL ,DataSet Ds,string tablename)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlDataAdapter Da;
   Da = CreateDa(SQL);
   try
   {
    Da.Fill(Ds,tablename);
   }
   catch(Exception Ex)
   {
    throw Ex;
   }
   Dispose(Conn);
   return Ds;
  }

  /// <summary>
  /// 運行SQL語句,返回DataSet對象
  /// </summary>
  /// <param name="procName">SQL語句</param>
  /// <param name="prams">DataSet對象</param>
  /// <param name="dataReader">表名</param>
  public DataSet RunProc(string SQL , DataSet Ds ,int  StartIndex ,int PageSize, string tablename )
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlDataAdapter Da ;
   Da = CreateDa(SQL);
   try
   {
    Da.Fill(Ds, StartIndex, PageSize, tablename);
   }
   catch(Exception Ex)
   {
    throw Ex;
   }
   Dispose(Conn);
   return Ds;
  }

  /// <summary>
  /// 檢驗是否存在數據
  /// </summary>
  /// <returns></returns>
  public bool ExistDate(string SQL)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlDataReader Dr ;
   Dr = CreateCmd(SQL,Conn).ExecuteReader();
   if (Dr.Read())
   {
    Dispose(Conn);
    return true;
   }
   else
   {
    Dispose(Conn);
    return false;
   }
  }

  /// <summary>
  /// 返回SQL語句執行結果的第一行第一列
  /// </summary>
  /// <returns>字符串</returns>
  public string ReturnValue(string SQL)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   string result;
   SqlDataReader Dr ;
   try
   {
    Dr = CreateCmd(SQL,Conn).ExecuteReader();
    if (Dr.Read())
    {
     result = Dr[0].ToString();
     Dr.Close();
    }
    else
    {
     result = "";
     Dr.Close();
    }
   }
   catch
   {
    throw new Exception(SQL);
   }
   Dispose(Conn);
   return result;
  }

  /// <summary>
  /// 返回SQL語句第一列,第ColumnI列,
  /// </summary>
  /// <returns>字符串</returns>
  public string ReturnValue(string SQL, int ColumnI)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   string result;
   SqlDataReader Dr ;
   try
   {
    Dr = CreateCmd(SQL,Conn).ExecuteReader();
   }
   catch
   {
    throw new Exception(SQL);
   }
   if (Dr.Read())
   {
    result = Dr[ColumnI].ToString();
   }
   else
   {
    result = "";
   }
   Dr.Close();
   Dispose(Conn);
   return result;
  }

  /// <summary>
  /// 生成一個存儲過程使用的sqlcommand.
  /// </summary>
  /// <param name="procName">存儲過程名.</param>
  /// <param name="prams">存儲過程入參數組.</param>
  /// <returns>sqlcommand對象.</returns>
  public SqlCommand CreateCmd(string procName, SqlParameter[] prams)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlCommand Cmd = new SqlCommand(procName, Conn);
   Cmd.CommandType = CommandType.StoredProcedure;
   if (prams != null)
   {
    foreach (SqlParameter parameter in prams)
    {
     if(parameter != null)
     {
      Cmd.Parameters.Add(parameter);
     }
    }
   }
   return Cmd;
  }

  /// <summary>
  /// 爲存儲過程生成一個SqlCommand對象
  /// </summary>
  /// <param name="procName">存儲過程名</param>
  /// <param name="prams">存儲過程參數</param>
  /// <returns>SqlCommand對象</returns>
  private SqlCommand CreateCmd(string procName, SqlParameter[] prams,SqlDataReader Dr)
  {
   SqlConnection Conn;
   Conn = new SqlConnection(ConnStr);
   Conn.Open();
   SqlCommand Cmd = new SqlCommand(procName, Conn);
   Cmd.CommandType = CommandType.StoredProcedure;
   if (prams != null)
   {
    foreach (SqlParameter parameter in prams)
     Cmd.Parameters.Add(parameter);
   }
   Cmd.Parameters.Add(
    new SqlParameter("ReturnValue", SqlDbType.Int, 4,
    ParameterDirection.ReturnValue, false, 0, 0,
    string.Empty, DataRowVersion.Default, null));

   return Cmd;
  }

  /// <summary>
  /// 運行存儲過程,返回.
  /// </summary>
  /// <param name="procName">存儲過程名</param>
  /// <param name="prams">存儲過程參數</param>
  /// <param name="dataReader">SqlDataReader對象</param>
  public void RunProc(string procName, SqlParameter[] prams, SqlDataReader Dr)
  {

   SqlCommand Cmd = CreateCmd(procName, prams, Dr);
   Dr = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
   return;
  }

  /// <summary>
  /// 運行存儲過程,返回.
  /// </summary>
  /// <param name="procName">存儲過程名</param>
  /// <param name="prams">存儲過程參數</param>
  public string RunProc(string procName, SqlParameter[] prams)
  {
   SqlDataReader Dr;
   SqlCommand Cmd = CreateCmd(procName, prams);
   Dr = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
   if(Dr.Read())
   {
    return Dr.GetValue(0).ToString();
   }
   else
   {
    return "";
   }
  }

  /// <summary>
  /// 運行存儲過程,返回dataset.
  /// </summary>
  /// <param name="procName">存儲過程名.</param>
  /// <param name="prams">存儲過程入參數組.</param>
  /// <returns>dataset對象.</returns>
  public DataSet RunProc(string procName,SqlParameter[] prams,DataSet Ds)
  {
   SqlCommand Cmd = CreateCmd(procName,prams);
   SqlDataAdapter Da = new SqlDataAdapter(Cmd);
   try
   {
    Da.Fill(Ds);
   }
   catch(Exception Ex)
   {
    throw Ex;
   }
   return Ds;
  }

 }
}

9:05 | 評論 (0)

2005年4月5日 #

ASP.NET上傳文件
<%--
upload.aspx
這是一個上傳文件,從中我們可以看出asp.net的優勢,以前需要控件才能完成的程序,現在只需要幾行代碼就可以輕鬆完成。
--%>
<%@ Import Namespace="System.IO" %>
<%@ page Language="C#" debug="true" codepage="936"%>

<html>
<head>
<title>文件上傳,aspcool.com </title>
<script language="C#" runat="server">

public void UploadFile(object sender , EventArgs E)
{

if(myFile.PostedFile!=null)
{
//定義一些變量
string nam = myFile.PostedFile.FileName ;
int i= nam.LastIndexOf("//") ;
string newnm =nam.Substring(i) ;


//改變下面的“c://"到你想要保存的地址。
myFile.PostedFile.SaveAs("c://"+newnm) ;

//取得上傳文件的各種屬性。
fname.Text=myFile.PostedFile.FileName;
fenc.Text=myFile.PostedFile.ContentType ;
fsize.Text=myFile.PostedFile.ContentLength.ToString();


}
}

</script>
</head>
<body>
<center>
<h3> 文件上傳演示,飛鷹製作 </h3>
<form id="uploderform" method="post" action="upload.aspx" enctype="multipart/form-data" runat="server" >

<table border="1" cellspacing="0" cellpadding="0" >
<tr> <td><h5>選擇文件</h5></td</tr>
<tr><td>
<input type="file" id="myFile" runat="server" >
</td></tr>
<tr><td>
<input type="button" value="Upload" OnServerClick="UploadFile" runat="server" >
</td></tr>
</table>
</form>
 
 
<table border="1" cellspacing="0">
<tr><td><b>文件資料</b></td>
<td> </td>
</tr>
<tr>
<td>文件名稱 :</td>
<td><asp:label id="fname" text="" runat="server" /></td></tr>
<tr>
<td>文件類型 :</td>
<td><asp:label id="fenc" runat="server" /></td></tr>
<tr>
<td>文件大小 :(in bytes)</td>
<td><asp:label id="fsize" runat="server" /></td></tr>
</table>
 
 
 
<h5>你可以從 <a href="http://www.aspcool.com/download">http://www.aspcool.com/download</a> 下載該程序.我們將給您提供更多的其它程序。如果有什麼意見請到我的<a href="http://www.chaxiu.com/club/right.php?boardid=7&page=1">ASP論壇</a>來討論。</h5>
</center>
</body>
</html> 

15:00 | 評論 (0)

2005年3月31日 #

ASP中session和cookies的使用
在各個網頁間的變量傳遞和一些記錄用戶的登陸信息要用到SESSION和COOKIE。在ASP.NET中使用COOKIE比ASP中稍微麻煩一點,因爲我們要申明變量。 

   首先看一下SESSION的使用,基本和ASP差不多

   寫入一個SESSION: 

   Session["username"])="aa";
   Session("username")="aa"   

   讀取一個SESSINN:   

   string username= Session["username"]; 

   dim username=Session("username")  

   再來看一下COOKIE的寫入:

   DateTime dt=DateTime.Now; //需要<%@Import Namespace="System"%>,得到當前時間
   HttpCookie mycookie=new HttpCookie("logname");//申明新的COOKIE變量
   mycookie.Value="aa";//賦值
   mycookie.Expires=Convert.ToDateTime(dt+TimeSpan.FromDays(1));//設定過期時間爲1天
   Response.Cookies.Add(mycookie1);//寫入COOKIE
  dim dt as DateTime
   dt=DataTime.Now
   dim mycookie as HttpCookie
   mycookie=new HttpCookie("logname")
   mycookie.Value="aa"
   mycookie.Expires=Convert.ToDateTime(dt+TimeSpan.FromDays(1))
   Response.Cookies.Add(mycookie1) 

   看一下COOKIE的讀取: 

   HttpCookie mycookie=Request.Cookies["username"];
   string username=mycookie.Value;
   dim mycookie as HttpCookie
   mycookie=Request.Cookies["username"]
   dim string=mycookie.Value  

 

14:50 | 評論 (0)

ASP.NET計數器(轉)
ASP.NET計數器
作者:bben_h 發佈時間:2005-03-12 來源:ASPCOOL
--------------------------------------------------------------------------------
 
     前言
  主頁計數器是用來記錄頁面曾經被訪問次數的組件。它是一個比較簡單的功能,但是實現起來卻有許多實際問題要考慮。例如訪問次數的記錄如何存放?如果服務器關機,數據記錄是否會丟失?等等問題都是需要我們考慮的。
  目前的計數器主要是使用ASP技術製作,方法非常簡單。但是很少有使用ASP.NET技術製作的計數器,原因主要是ASP.NET技術還未正式發佈,同時支持.NET的服務器還很少導致的。本文講述瞭如何利用ASP.NET技術,製作主頁計數器。
  
  設計構思
  計數器的核心工作就是想辦法將訪問的次數記錄下來,並且能夠方便的讀出數據記錄。在此應用中,擬建立四個文件,一個是webform1.aspx,主要是用於顯示訪問次數記錄,一個counter.txt文件用於存儲訪問次數記錄,還有global.asax和global.asax.cs,這兩個文件是核心文件,主要是負責響應事件和讀寫文件。因此,程序必須具有打開文件,讀文件,累加數值,寫文件等功能。同時,還需注意:在進行數值累加時,不能象ASP中的那樣寫成
  application(“counter”)=application(“counter”)+1
  因爲數值類型不能和對象做數學運算。
  經過以上的思考,我們基本就可以編寫代碼了,但是在完成編寫之前,還應瞭解以下的相關知識。
  
  相關知識
  1. Global.asax文件
  Global.asax文件也稱爲ASP.NET應用程序文件,它一般被放在根目錄下。此文件中的代碼不產生用戶界面,也不相應單個頁面的請求。它主要是負責處理Application_Start,Application_End,Session_Start和Session_End事件的。
  2. Application對象及其事件
  Application 對象來自HttpApplictionStat 類。它可以在多個請求、連接之間共享公用信息,也可以在各個請求連接之間充當信息傳遞的管道。此對象的生命週期起於IIS開始運行並且有人開始連接時,終止於IIS關閉或者若干時間內無人連接(默認爲20分鐘)。當Application 對象的生命週期開始時,Application_Start 事件會被啓動,當Application對象的生命週期結束時Application_End 事件會被啓動。
  3. Session對象及其事件
  Session對象有着與Application類似的事件:Session_Start和Session_End事件。當有一個新用戶訪問應用程序時,就會立刻觸發Session_Start事件。當某個用戶停止了訪問或者程序執行了Session.Abandon方法,就會觸發Session_End事件。
  4. Application和Session對象比較
  Session對象與Application對象有些相似,但其作用域有更大的限制。Application對象是針對所有用戶都生效,而Session對象則相反,每個用戶都有自己的Session對象,它的生命週期起始於服務器產生對用戶請求頁面的相應,終止於用戶斷開與服務器的連接。Application對象不會象Session對象那樣當一個新用戶請求就觸發事件,Application對象的事件只觸發一次,就是在第一個用戶的第一個請求時。一個Application_End事件肯定發生在Session_End事件之後,Application_End事件只有在服務器停止工作或Application_End事件卸載時才觸發。
  
  程序部分
  首先建立一個文本文件counter.txt,打開文件輸入一個大於0的整數作爲訪問記錄的初始值。
  下面我們就可以正式的編寫計數器的程序了。
  listing 1是webform1.aspx,主要是用於顯示從文件中讀出的訪問次數的記錄。由於在整個應用程序生命週期中,Application 對象都是有效的,所以在不同的頁面中都可以對它進行存取,就像使用全局變量一樣方便。
  在代碼中,使用<%=Application["counter"]%>來表示訪問次數記錄。
  程序代碼如下:
  listing1 -----webform1.aspx-----
  <%@ Page language="c#" Src="WebForm1.aspx.cs" Inherits="counter1.WebForm1" %>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
  <HTML>
   <HEAD>
   <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
   <meta name="CODE_LANGUAGE" Content="C#">
   </HEAD>
   <body>
   <form id="Form1" method="post" runat="server">
   <FONT face="宋體">您是第<%=Application["counter"]%>位訪問者!</FONT>
   </form>
   </body>
  </HTML>
  Listing 2和listing3是global.asax和global.asax.cs文件代碼,當執行webform1.aspx文件之前會執行它們。在global.asax.cs文件中,定義了一些事件和其響應代碼,主要是用於讀寫文件和數值累加。
  Listing 2 -----global.asax----
  <%@ Application Src="Global.asax.cs" Inherits="counter2.Global" %>
  listing 3 -----global.asax.cs-----
  using System;
  using System.Collections;
  using System.ComponentModel;
  using System.Web;
  using System.Web.SessionState;
  using System.IO ;
  namespace counter2
  {
   public class Global : System.Web.HttpApplication
   {
   protected void Application_Start(Object sender, EventArgs e)
   {
   uint count=0;
   StreamReader srd;
  //取得文件的實際路徑
   string file_path=Server.MapPath ("counter.txt");
   //打開文件進行讀取
   srd=File.OpenText (file_path);
   while(srd.Peek ()!=-1)
   {
   string str=srd.ReadLine ();
   count=UInt32.Parse (str);
   }
   object obj=count;
   Application["counter"]=obj;
   srd.Close ();
   }
  
   protected void Session_Start(Object sender, EventArgs e)
   {
   Application.Lock ();
   //數值累加,注意這裏使用了裝箱(boxing)
   uint jishu=0;
   jishu=(uint)Application["counter"];
   jishu=jishu+1;
   object obj=jishu;
   Application["counter"]=obj;
   //將數據記錄寫入文件
   string file_path=Server.MapPath ("counter.txt");
   StreamWriter fs=new StreamWriter(file_path,false);
   fs.WriteLine (jishu);
   fs.Close ();
   Application.UnLock ();
   }
   protected void Application_BeginRequest(Object sender, EventArgs e)
   {
   }
   protected void Application_EndRequest(Object sender, EventArgs e)
   {
   }
   protected void Session_End(Object sender, EventArgs e)
   {
   }
   protected void Application_End(Object sender, EventArgs e)
   {
   //裝箱
   uint js=0;
   js=(uint)Application["counter"];
   //object obj=js;
   //Application["counter"]=js;
   //將數據記錄寫入文件
   string file_path=Server.MapPath ("counter.txt");
   StreamWriter fs=new StreamWriter(file_path,false);
   fs.WriteLine(js);
   fs.Close ();
   }
   }
  }
  
  小結
  經過以上的討論,一個簡單的主頁計數器就完成了。其核心就是以文本模式進行文件讀寫。

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章