以前筆者都是使用 NDoc 在製作 VS.NET 的 HELP 文件,它是相當好用且速度快的 HELP 產生器;不過 NDoc 在 1.3.1 版後,NDoc 的作者 Kevin Downs 就不再進行 NDoc Open Soruce 的開發。筆者之前有自行修改 NDoc 的 Source Code 解決中文亂碼的問題,不過後來又遇到泛型類別無法正常產生 HELP 文件的問題,所以就改用微軟推出的 SandCastle 配合 Sandcastle Help File Builder 來產生 HELP 文件,本文將介紹使用 Sandcastle Help File Builder 製作 VS.NET 的 HELP 文件。
在 Internet Explorer 或 Opera 中,可以使用 JavaScript 來複製資料到剪貼簿;不過在 Firefox 中,只能使用選取文字使用按鍵 Ctrl+C (或功能表的編輯\複製)來做複製的動作,預設是無法使用 JavaScript 來做複製的動作。
若 Firefox 要啟用 JavaScript 允許複製的話,可以在網址列輸入
about:config
然後就會列出 Firefox 所有的參數設定列表,找到
signed.applets.codebase_principal_support
這個參數,並將其設定為 true 即可在 Firefox 中啟用 JavaScript 允許複製。再來就可以利用以下的 JavaScript 函式,來測試複製功能了。
function CopyToClipboard(meintext) 2 { 3 if (window.clipboardData) 4 { 5 // the IE-manier 6 window.clipboardData.setData("Text", meintext); 7 } 8 else if (window.netscape) 9 { 10 // dit is belangrijk maar staat nergens duidelijk vermeld: 11 // you have to sign the code to enable this, or see notes below 12 netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); 13 14 // maak een interface naar het clipboard 15 var clip = Components.classes['@mozilla.org/widget/clipboard;1'] 16 .createInstance(Components.interfaces.nsIClipboard); 17 if (!clip) return; 18 //alert(clip); 19 // maak een transferable 20 var trans = Components.classes['@mozilla.org/widget/transferable;1'] 21 .createInstance(Components.interfaces.nsITransferable); 22 if (!trans) return; 23 24 // specificeer wat voor soort data we op willen halen; text in dit geval 25 trans.addDataFlavor('text/unicode'); 26 27 // om de data uit de transferable te halen hebben we 2 nieuwe objecten 28 // nodig om het in op te slaan 29 var str = new Object(); 30 var len = new Object(); 31 var str = Components.classes["@mozilla.org/supports-string;1"] 32 .createInstance(Components.interfaces.nsISupportsString); 33 var copytext=meintext; 34 str.data=copytext; 35 trans.setTransferData("text/unicode",str,copytext.length*2); 36 var clipid=Components.interfaces.nsIClipboard; 37 if (!clip) return false; 38 clip.setData(trans,null,clipid.kGlobalClipboard); 39 } 40 else 41 { 42 return false; 43 } 44 45 alert("你已經複製資料: " + meintext); 46 return false; 47 }
參考網址: http://www.febooti.com/support/website-help/website-javascript-copy-clipboard.html
上一篇 整合 jQuery ContextMenu plugin 的右鍵選單控制項 的文章中,我們實作了 TBContextMenu 控制項;本文將以 TBContextMenu 控制項為例,為選單項目加入 Click 事件,並說明三種不同模式的 Click 動作。
程式碼下載:ASP.NET Server Control - Day31.rar
一、AutoPostBack 及 AutoCallBack 屬性
TBMenuItem 類別原有個 OnClientClick 屬性,設定要執行的用戶端指令碼;此為用戶端的的 Click 動作,執行指定的 JavaScript 指令碼。我們在 TBMenuItem 屬性新增 AutoPostBack 及 AutoCallBack 屬性,分別用來設定選單項目的 PostBack 及 CallBack 動作。另外 ClientCallBack 為執行 CallBack 時,會接收成功的伺服器事件結果的用戶端事件處理常式名稱。
二、新增 Click 事件
TBContextMenu 新增 Click 事件及 ClickEventArgs 事件引數類別,ClickEventArgs 類別包含 Key 屬性表示按鈕鍵值,CallBackResult 屬性保留給 CallBack 使用。
三、實作 IPostBackEventHandler 介面
實作 IPostBackEventHandler 介面,當選單項目產生 PostBack 動作後,在 RaisePostBackEvent 方法中,取得選單項目的鍵值 (eventArgument 參數),並引發 Click 事件。
四、實作 ICallbackEventHandler 介面
實作 ICallbackEventHandler 介面,當選單項目產生 CallBack 動作後,會先執行 RaiseCallbackEvent 方法,在此方法接收用戶端傳入的鍵值 (eventArgument 參數),並引發 Click 事件,最後會將 ClickEventArgs.CallbackResult 的結果回傳到用戶端,由用戶端指定的事件處理常式,來處理伺服器回傳的結果。
五、輸出選單項目的用戶端指令碼
在 Render 方法中,會有一段輸出程式碼來輸出每個選單項目的用戶端指令碼;其中會透過 GetItemClientScritp 私有方法,取得指定選單項目的用戶端指令碼。
GetItemClientScritp 私有方法程式碼如下,會判斷 TBMenuItem 是否設定 AutoPostBack、AutoCallBack 或 OnClientClick 屬性,來決定用戶端選單項目 Click 動作的行為。
六、測試程式
在頁面拖曳 TBContextMenu,設定 Delete1、Delete2、Delete3 三個 TBMenuItem。其中 Delete1 設定 OnClientClick 屬性;Delete2 設定 AutoPostBack 屬性為 True,會以 PostBack 方法引發伺服端的 Click 事件;Delete3 設定 AutoCallBack 屬性為 True,會以 CallBack 方法引發伺服端的 Click 事件,並設定 ClientCallBack 屬性決定接收成功的伺服器事件結果的用戶端事件處理常式名稱。
在伺服端 Click 事件撰寫測試程式碼,可以利用 Me.IsCallback 來判斷目前是否在 CallBack 狀態中。
另外 Delete3 選單項目有設定 ClientCallBack="ReceiveServerData",所以 aspx 程式碼中會有 ReceiveServerData JavaScript 函式,來接收 CallBack 時由伺服端傳回的結果。
執行程式,先選取 Delete1 選單項目,會執行在 OnClientClick 屬性指定的用戶端指令碼。
當選取 Delete2 選單項目時,會產生 PostBack 動作並引發伺服端的 Click 事件,在 Click 事件中會輸出要執行的用戶端指令碼。
當選取 Delete3 選單項目時,會產生 CallBack 動作並引發伺服端的 Click 事件,在 Click 事件中設定 e.CallbackResult 屬性值,並將 e.CallbackResult 的結果回傳給用戶端的 ReceiveServerData 函式來處理。
jQuery 是一個非常精簡強大的 JavaScript 函式庫,最近看到一個消息,未來微軟的 ASP.NET 也會全面支援 jQuery,詳見「 微軟將在 ASP.NET 相關產品中全面支援 jQuery」一文。筆者在之前就被 jQuery 簡短有力的程式語法所吸引,也把 jQuery 套用在伺服器控制項中,在本文將示範如何將 jQuery 的 ContextMenu plugin 封裝成伺服器控制項,使開發人員在使用上更為簡便。
DropDownList 控制頁的成員清單中,若有 ListItem 的 Value 值是相同的情形時,會造成 DropDownList 無法取得正確的 SelectedIndex 屬性值、且無法正確引發 SelectedIndexChanged 事件的問題;今天剛好在網路上看到有人在詢問此問題,所以本文將說明這個問題的源由,並修改 DropDownList 控制項來解決這個問題。