2014年1月20日 星期一

[C#] Some experience on developing ASP charts

先以不整裡的方式快速記錄工作中上網查到的一些函式使用或參數設定方式。



狀況1. 在C#中使用檔案存取或資料夾建立的函式時,會遇到下圖情況
解決方案:雖然有人提說將Web.config裡面的<authentication mode="Forms">設定改成<authentication mode="Windows">就可以解決,不過實驗結果是失敗的。最後找到的方式是更改目錄權限,我所透過Visual Studio 2012所建立的C# website專案是將產生的網頁檔放在C:\Program Files (x86)\IIS Express底下,所以將\IIS Express這目錄的使用者權限開放至完全控制就可以解決此問題。


狀況2. 在.aspx的Design下建立圖表,會找不到平常在一般C# App所建立圖表時,右上角那個用來表示各種顏色代表什麼項目的提示。
解決方案:在圖表 (System.Web.UI.DataVisualization.Charting.Chart) 的屬性中有個叫Legends的項目,進去新增一個Legend就可以看到所要的圖示。


狀況3. 在.aspx的Design下建立Chart圖表,雙點擊下圖Click空白框後會自動產生處理事件用的callback。可是會發現程式執行時,不管怎麼點擊圖表都無法進入此callback function。
解決方案:不像C#可以簡單的建立OnClick event,在ASP C#下,只有一種Click事件,但與一般C#不同,一般C#在程式執行時點擊圖表就會自動進入此callback function,可是ASP C#卻不是這樣。它必須要使用PostBackValue來送出事件以及事件內容。圖表包含了一些物件像是Series、MapArea、Legends、ChartArea等...,可是只有少數元件像Series和MapArea有PostBackValue參數可以使用,用法是在圖表產生後設定PostBackValue要回傳什麼內容,例如:
  chartStatus.Series["Open"].PostBackValue = "#VALX";
  chartStatus.Series["Closed"].PostBackValue = "#VALX";
如此一來,當滑鼠移到Open和Close兩個直方圖上時(下圖紅框範圍),滑鼠圖形會變成手指狀,點擊後就會進入先前設定的callback function。


狀況4. 開發.aspx過程中最不習慣的一點就是網頁是一種無狀態(Stateless)的程式,白話文就是每當頁面重新整理的時候,在.cs裡面所宣告的全域變數內容都會回歸初始值。

解決方案:假設今天你的程式必須保留某個變數數值,常用兩種保存方式,一種是使用Cookie,一種是Session。Cookie的使用方法如下:
  Response.Cookies["Username"].Value = "Soflen"; //在Cookies中產生Username這變數並將字串寫入
  Response.Cookies["Username"].Expires = DateTime.Now.AddDays(3);  //設定Cookies保存期限
  if (Request.Cookies["Username"] != null)  //判斷此變數是否存在Cookies中
    String name = Request.Cookies["Username"].Value;  //從Cookies讀取此變數的內容
可是假如使用Cookies的時機是在一個事件 (例如ListBoxA_SelectedIndexChanged) 的開始寫入Cookies並在事件結束前讀取Cookies就會發現讀到的內容是尚未寫入之前的值,因為瀏覽器會等事件結束後才會真的執行寫入的行為。
這就是Session比Cookies更好用的地方,所謂Session就是將變數儲存在server端的方法,瀏覽器處理此命令時會立刻將Session內容傳給遠方的server,讀取的時候也是如此。於是可以輕鬆解決上述情況。Session的用法:
  Session["Username"] = "Soflen"; //要求Server暫存Username這變數
  //Session的保存期限就是只到瀏覽器關閉、Session斷開時
  if (Session["Username"] != null)  //判斷此變數是否存在Server中
    String name = (String)Session["Username"];  //讀取此變數的內容
另外一個需要注意的差別在於Cookies把變數都當String處理,Session就可以是各式型別,但在讀值的時候需要指定型別。

沒有留言:

張貼留言