2016年1月3日 星期日

ASPX中使用ASPX.VB的Function

前言
有時我們會在GridView Template中使用CheckBox物件,Bind資料的Code如下,
,可是如果IS_OK欄位的值為DBNULL OR 空字串時,要如何處理呢?

實作

1.是在RowDataBound事件中去Find出該CheckBox物件,然後讀取資料處理後,再Assign給CheckBox's checked值。
2.使用一個Protected Function來處理,如下:
ASPX:

<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# ProcBoolean(Eval("IS_OK")) %>' />
ASPX.VB:
protected function ProcBoolean(byval vValue as Object) as Boolean
  If (vValue Is DBNull.Value) = False Then
     '........ Your Logic....
 End If
     Return true 'or /false
end function
請注意哦! 那個Function的參數要用Object哦! 不然如果Bind進來的值是DBNull的話,會有錯誤哦!
另外,如果是ASP.NET 1.1的DataGrid中使用方式如下(回傳字串),
ASPX:
<asp:Label id="lblLevHR" runat="server" text='<%# ProcLevHour((Container.DataItem("LEVHR"))) %>' ></asp:Label>
ASPX.VB:
Protected Function ProcLevHour(ByVal vValue As Object) As String
    Dim result As String = String.Empty
    If (vValue Is DBNull.Value) = False Then
        '........ Your Logic....
    End If
    Return result
End Function

ASP.NET Web 網頁程式碼模型

ASP.NET Web 網頁是由兩部分組成:
  • 視覺項目,其中包含標記、伺服器控制項和靜態文字。
  • 網頁的程式設計邏輯,其中包含事件處理常式和其他程式碼。
ASP.NET 提供兩個模型以管理視覺項目和程式碼:單一檔案網頁模型和程式碼後置網頁模型。兩個模型的功能是相同的,並且您可以在兩個模型上使用相同的控制項和程式碼。

在單一檔案網頁模型中,網頁的標記和程式碼都在相同的實體 .aspx 檔中。程式設計碼是在包含 runat="server" 屬性的 script 區塊中,以便讓其成為 ASP.NET 要執行的程式碼。
下列程式碼範例,示範了包含 Button 和 Label 控制項的單一檔案網頁。反白顯示的部分顯示 script 區塊中 Button 控制項的 Click 事件處理常式
script區塊可以包含網頁所需的任何程式碼數量。程式碼可以由網頁上控制項的事件處理常式 (如同在這個範例中)、方法、屬性,以及在類別檔中通常會使用的任何其他程式碼所組成。在執行階段時,單一檔案網頁會被視為衍生自 Page 類別的類別。這個網頁並未包含明確類別宣告,而是由編譯器產生包含控制項做為成員的新類別 (並非所有控制項都會公開做為網頁成員。某些控制項是其他控制項的子系)。網頁中的程式碼會變成類別的一部分。例如,您建立的事件處理常式會變成衍生 Page 類別的成員。
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, _ByVal e As System.EventArgs)
Label1.Text = "Clicked at " & DateTime.Now.ToString()    
End Sub
</script>

<html>
<head id="Head1" runat="server">
  <title>Single-File Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:Label ID="Label1" 
        runat="server" Text="Label">
      </asp:Label>
      <asp:Button ID="Button1" 
         runat="server" OnClick="Button1_Click" Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<script runat="server">
void Button1_Click(Object sender, EventArgs e)
{
Label1.Text = "Clicked at " + DateTime.Now.ToString();
}
</script>
<html>
<head>
  <title>Single-File Page Model</title>
</head>
<body>
  <form runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label">
       </asp:Label>
       <br />
       <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>

程式碼後置網頁模型可以讓您將標記放在單一檔案 (.aspx 檔),並且將程式碼放在另一個檔案。程式碼檔案的名稱會根據您使用的程式設計語言而有所不同。
015103yb.alert_note(zh-tw,VS.100).gif注意事項:
並非所有的 .NET 程式設計語言,都可以讓您建立 ASP.NET Web 網頁的程式碼後置檔案。語言必須支援 partial 類別。例如,J# 不支援 partial 類別,因此不支援建立 ASP.NET 網頁的程式碼後置檔案。
例如,如果您使用名為 SamplePage 的網頁,則標記會在 SamplePage.aspx 檔,程式會在名為 SamplePage.aspx.vb (Visual Basic) 或 SamplePage.aspx.cs (C#) 等檔案中。
015103yb.alert_note(zh-tw,VS.100).gif注意事項:
.NET Framework 2.0 版中使用的程式碼後置模型與舊版中使用的不同。
在程式碼後置模型中,之前章節中所使用的單一檔案網頁範例可以分為兩部分。標記會在一個檔案中 (在這個範例中是 SamplePage.aspx) 並且類似單一檔案網頁,如同下列程式碼範例所示
程式碼後置檔案在預設命名空間中包含完整的類別宣告。然而,類別是使用 partial 關鍵字宣告,表示類別並非完全包含在單一檔案中。而是在網頁執行時,編譯器會讀取 .aspx 網頁以及在 @ Page 指示詞中參考的檔案、將其組成單一類別,然後編譯為單一類別的單元。
partial 類別檔會繼承自網頁 Page 類別
<%@ Page Language="VB" CodeFile="SamplePage.aspx.vb" 
    Inherits="SamplePage" AutoEventWire="false" %>
<html>
<head runat="server" >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>

Partial Class SamplePage
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "Clicked at " & DateTime.Now.ToString()
    End Sub
End Class

<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" 
    Inherits="SamplePage" AutoEventWireup="true" %>
<html>
<head runat="server" >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>
</html>
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SamplePage : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Clicked at " + DateTime.Now.ToString();
    }
}


單一檔案和程式碼後置網頁模型的功能相同。在執行階段,模型的執行方式相同,並且兩者之間並沒有效能上的差異。因此選擇網頁模型是依照其他因素而定,例如應用程式中程式碼的組織方式、分開網頁設計和程式碼是否很重要等因素。
015103yb.alert_note(zh-tw,VS.100).gif注意事項:
在文件中讀取的範例通常會以單一檔案網頁表示。這主要是為了方便讀者,因為如此就不需要說明每個範例的兩種檔案。在文件中發現單一檔案範例的事實,並不能解釋為偏好單一檔案網頁而不是程式碼後置網頁,也不代表單一檔案網頁有某些其他先天優勢。

單一檔案網頁的優點

一般而言,如果網頁的程式碼主要是由網頁上控制項的事件處理常式所組成,則適合使用單一檔案模型。
單一檔案網頁模型的優點如下列所示:
  • 在程式碼不多的網頁中,將程式碼和標記放在相同檔案中的便利性,將超越程式碼後置模型的其他優點。例如,因為您可以在同一個地方看到程式碼和標記,就比較容易學習單一檔案網頁。
  • 因為只有一個檔案,所以使用單一檔案模型撰寫的網頁比較容易部署,或傳送至其他程式設計人員。
  • 因為檔案之間沒有相依性,所以單一檔案網頁較容易重新命名。
  • 因為網頁獨立於單一檔案中,所以管理原始程式碼控制系統中的檔案會比較容易。

程式碼後置網頁的優點

程式碼後置網頁提供的優勢,可以適用於使用大量程式碼的 Web 應用程式,或是多個開發人員在建立網站的情況
程式碼後置模型的優點如下列所示:
  • 程式碼後置網頁可以清楚分隔標記 (使用者介面) 和程式碼。如果在程式設計人員撰寫程式碼的同時,可以讓設計人員處理標記就很實用。
  • 程式碼不會公開給網頁設計人員或是只使用網頁標記的其他人員。
  • 多個網頁可以重複使用程式碼。

單一檔案和程式碼後置網頁的編譯與部署方式類似。最簡單的方式是將網頁複製到目標伺服器。如果您使用程式碼後置網頁,就要同時複製 .aspx 網頁和程式碼檔案。當首次要求網頁時,ASP.NET 會編譯並執行網頁。請注意在兩種情況下您都要使用標記部署原始程式碼。
此外,您也可以先行編譯網站。在這種情況下,ASP.NET 會產生網頁的物件程式碼,讓您複製到目標伺服器。單一檔案和程式碼後置模型都能夠使用先行編譯,並且兩種模型的輸出都相同

2015年12月28日 星期一

JQuery中的Ajax的基礎運用。提供範例程式下載

在這個號稱 web 2.0 的時代,寫網站,尤其是還用到了大量的 JavaScript,如果與使用者的互動還沒有用到 Ajax 技術的話,似乎是一件很神奇的事,至於 Ajax 是什麼東西?想瞭解的人可以到這裡去看維基百科上的解釋,這篇就專心寫一下 jQuery 中的 Ajax 部份。
程式範例:下載點
這個 PHP 程式很簡單, recive.php它只回應一個index.php傳入的字串,所以我們現在要做的事情便是:按下按鈕後,向 server 端的 index.php向recive.php 發出一個 request,然後把它回應的東西放alert出來。所以我們把 Submit 函式的部份寫成這樣:index.php
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
        <script type="text/javascript" src="jquery.js" ></script>
        <script>
         var Submit=function(){
            var URLs="recive.php";
           
            $.ajax({
                url: URLs,
                data: $('#sentToBack').serialize(),
                type:"POST",
                dataType:'text',
                success: function(msg){
                    alert(msg);
                },
                 error:function(xhr, ajaxOptions, thrownError){ 
                    alert(xhr.status); 
                    alert(thrownError); 
                 
}
            });
            
        }
        </script>
    </head>
    <body>
        <form id="sentToBack">
            <input type="text" name="Text"/> 
            <input type="button"  value="送出" onClick="Submit()"/>
        </form>
    </body>
</html>

ajax當中的參數:
url:指定要進行呼叫的位址。
data:傳送至Server的資料,會自動轉為query string的型式,如果是GET請求還會幫你附加到URL。可用processData選項禁止此自動轉換。物件型式則為一Key/Value pairs。這個範例程式,是使用serialize(),會把name為sentToBack的表單中的資料傳送出去,型態的部分要看type的設定,一般表單都是用POST或是GET。
type:請求方式,POST/GET。
dataType:預期Server傳回的資料類型,如果沒指定,jQuery會根據HTTP MIME Type自動選擇以responseXML或responseText傳入你的success callback。可選的資料類型有:
                  xml:傳回可用jQuery處理的XML
                  html:傳回HTML,包含jQuery會自動幫你處理的script tags。
                  script:傳回可執行的JavaScript。(script不會被自動cache,除非cache設為true)
                  json:傳回JSON
                  jsonp:在URL加上?callback=?參數,並在Server端配合送回此jsonp callback。
                  text:傳回純文字字串。
success:請求成功時執行函式。
                
function (data, textStatus) {
                       // data 可以是 xmlDoc, jsonObj, html, text, 但還是要參考datatype 
                         
                } 
error:請求失敗時執行函式。           function (xhr, ajaxOptions, thrownError) {
                   //通常ajaxOptions或thrownError只有一個有值
           } 
           這個很重要,因為有時候Sever寫好的程式不容易測試,可以透過這個函數把錯誤顯示出來。

                  
其他可能比較會用的參數:
complete:請求完成時執行的函式(不論結果是success或error)。
                 function (XMLHttpRequest, textStatus) {
                   // the options for this ajax request 
                 }
beforeSend:發送請求之前可在此修改XMLHttpRequest物件,如添加header等,你可以在此函式中return flase取消Ajax request。
                     function (XMLHttpRequest) { 
                          // the options for this ajax request 
                     }
其他更多相關的資訊:http://api.jquery.com/jQuery.ajax/
接下來編寫PHP:recive.php
echo $_POST["Text"];

下面是index.php 會看到的畫面。
當你打下AAA送出後會看到的畫面。
再來我們在recive.php 故意寫錯程式,如果你沒有加error,會找不出問題。讓你看看有什麼差別。
ehco              //故意的,你可以測測看。
echo $_POST["Text"];

2015年12月27日 星期日

電腦概論隨手筆記

資料結構
陣列array
堆疊stack
佇列queue
連結串列linked list
樹tree
圖graph
推heap
雜湊表hash table

資料結構英語:data structure)是電腦中儲存、組織資料的方式。
一個資料結構可被視為兩個函式之間的介面 ,或者是由資料類型聯合組成的儲存內容的存取方法封裝。

資料結構可以透過程式語言 提供的data type與reference及其他操作加以實作,盡可能較少的時間與空間

正確的資料結構選擇可以提高演算法的效率 ,程式設計的困難程度與最終成果的品質與表現,取決於是否選擇了最適合的資料結構。

絕大多數的語言都帶有某種程度上的模組化思想,透過將資料結構的具體實作封裝隱藏於使用者介面之後的方法,來讓不同的應用程式能夠安全地重用這些資料結構。C++JavaPython物件導向的程式語言可使用類別來達到這個目的。

陣列array
裝固定大小和相同資料型態的容器
arraylist
是一種動態陣列,資料可從中插入或刪除

推疊stack
處理資料後進先出的排成(EX:疊盤子)
住列queue
處理資料先進先出的排程(EX:排隊)

連結串列linked list
每個節點紀錄資料並且指向下一個節點,將節點串連起來
樹tree
一種階層式的資料集合
樹的最開始會有一個根節點,就像樹的樹根一樣,所有的資料都是由這裡開始發展,接著會有一些其他的節點,有些節點可能在最末端,稱之為葉節點,就像樹的樹葉一樣,其他的節點則像樹的樹枝一樣
在資料結構中的實作會有父節點和子節點的分別,所以可以進一步的定義:
  1. 樹存在一個為根節點,根節點沒有父節點(不可以有迴圈)。
  2. 每個節點只有一個父節點(子樹不交集)

雜湊表hash table
無論相同或相異的資料只要有相同的索引值,就會儲存到同一個格子

死結deadlock
一個執行緒鎖住一個變數資料,導致其他執行緒無窮等待

要死結必須要滿足以下四個條件
  1. Mutual exclusion:一個資源一次只能被一個process所使用
  2. Hold and Wait: process取得一個資源之後等待其他的資源
  3. No preemption:資源只能由process自己釋放,不能由其他方式釋放
  4. Circular wait:每個process都握有另一個process請求的資源,導致每一個process都在等待另一個process釋放資源
Deadlock Avoidance死結的避免
為了確保死結不會發生,我們定義一個安全的狀態--能夠分配給所有process資源而不會造成死
結,在不安全的狀態下則有可能發生死結,假設我們知道
  1. 系統目前可用的資源數量(Available)
  2. 各process對資源的最大需求量(max)
  3. 各process目前持有的資源量(allocation)
各系統還需多少資源(need) = max - allocation
Deadlock pretention預防死結
  1. Mutual exclusion:對不可共用的資源類型而言,互斥一定成立,而可共用的資源類型,因為可以同時讀取相同檔案,所以一定不會產生。
  2. Hold and Wait:process必須保證一個行程在要求一項資源時,不可以佔用任何其它的資源。
  3. No preemption:只要某個處理元要不到所要求的資源時,便把它已經擁有的資源釋放,然後再重新要求所要資源。
  4. Circular Wait:確保循環式等候的條件不成立,我們對所有的資源型式強迫安排一個線性的順序。


=========================相關聯結===============================
講義下載
http://www.cs.pu.edu.tw/~bcc/download.htm

2015年11月29日 星期日

MS Chart Control 學習手記 - 圓餅圖

using System.Web.UI.DataVisualization.Charting;
using System.Drawing;

namespace Chart.AJAX
{
    public partial class Export_AJAX : System.Web.UI.Page
    {
        void CreateChart()
        {
            string[] xValues = { "0-20", "20-30", "30-40", "40-50", "50-60", "> 60", "unknow" };
            int[] yValues = {5, 18, 45, 17, 2, 1, 162 };

            //ChartAreas,Series,Legends 基本設定-------------------------------------------------
            Chart Chart1 = new Chart();
            Chart1.ChartAreas.Add("ChartArea1"); //圖表區域集合
            Chart1.Legends.Add("Legends1"); //圖例集合說明
            Chart1.Series.Add("Series1"); //數據序列集合

            //設定 Chart-------------------------------------------------------------------------
            Chart1.Width = 770;
            Chart1.Height = 400;
            Title title = new Title();
            title.Text = titleStr;
            title.Alignment = ContentAlignment.MiddleCenter;
            title.Font = new System.Drawing.Font("Trebuchet MS", 14F, FontStyle.Bold);
            Chart1.Titles.Add(title);

            //設定 ChartArea1--------------------------------------------------------------------
            Chart1.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = is3D;
            Chart1.ChartAreas[0].AxisX.Interval = 1;

            //設定 Legends-------------------------------------------------------------------------                
            //Chart1.Legends["Legends1"].DockedToChartArea = "ChartArea1"; //顯示在圖表內
            //Chart1.Legends["Legends1"].Docking = Docking.Bottom; //自訂顯示位置
            //背景色
            Chart1.Legends["Legends1"].BackColor = Color.FromArgb(235, 235, 235); 
            //斜線背景
            Chart1.Legends["Legends1"].BackHatchStyle = ChartHatchStyle.DarkDownwardDiagonal; 
            Chart1.Legends["Legends1"].BorderWidth = 1;
            Chart1.Legends["Legends1"].BorderColor = Color.FromArgb(200, 200, 200);

            //設定 Series1-----------------------------------------------------------------------
            Chart1.Series["Series1"].ChartType = SeriesChartType.Pie;
            //Chart1.Series["Series1"].ChartType = SeriesChartType.Doughnut;
            Chart1.Series["Series1"].Points.DataBindXY(xValues, yValues);
            Chart1.Series["Series1"].LegendText = "#VALX:    [ #PERCENT{P1} ]"; //X軸 + 百分比
            Chart1.Series["Series1"].Label = "#VALX\n#PERCENT{P1}"; //X軸 + 百分比
            //Chart1.Series["Series1"].LabelForeColor = Color.FromArgb(0, 90, 255); //字體顏色
            //字體設定
            Chart1.Series["Series1"].Font = new System.Drawing.Font("Trebuchet MS", 10, System.Drawing.FontStyle.Bold); 
            Chart1.Series["Series1"].Points.FindMaxByValue().LabelForeColor = Color.Red;
            //Chart1.Series["Series1"].Points.FindMaxByValue().Color = Color.Red;
            //Chart1.Series["Series1"].Points.FindMaxByValue()["Exploded"] = "true";
            Chart1.Series["Series1"].BorderColor = Color.FromArgb(255, 101, 101, 101);
            
            //Chart1.Series["Series1"]["DoughnutRadius"] = "80"; // ChartType為Doughnut時,Set Doughnut hole size
            //Chart1.Series["Series1"]["PieLabelStyle"] = "Inside"; //數值顯示在圓餅內
            Chart1.Series["Series1"]["PieLabelStyle"] = "Outside"; //數值顯示在圓餅外
            //Chart1.Series["Series1"]["PieLabelStyle"] = "Disabled"; //不顯示數值
            //設定圓餅效果,除 Default 外其他效果3D不適用
            Chart1.Series["Series1"]["PieDrawingStyle"] = "Default"; 
            //Chart1.Series["Series1"]["PieDrawingStyle"] = "SoftEdge";
            //Chart1.Series["Series1"]["PieDrawingStyle"] = "Concave";

            //Random rnd = new Random();  //亂數產生區塊顏色
            //foreach (DataPoint point in Chart1.Series["Series1"].Points)
            //{
            //    //pie 顏色
            //    point.Color = Color.FromArgb(150, rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)); 
            //}
            Page.Controls.Add(Chart1);  
        }
    }
}

畫出來的圓餅圖就像這樣