2016年1月7日 星期四

給ASP.NET 初學者的話

ASP.NET網頁的特性與生命週期
跟其他 ASP / PHP / JSP都不太一樣
他強調PostBack(回傳)

(1). 您在畫面(網頁)上的任何動作,例如:按下按鈕,或是按下(操作)什麼控制項的功能

都會觸發「PostBack(回傳)」

然後重新執行一次 Page_Load事件
(2). 我也必須在第一節課裡面,讓學生知道「網頁程式」是一個無狀態的協定(Stateless Protocol)

補充範例: 寫到 ADO.NET程式了,還在問 Connection.Close()

而且他在A事件開啟DB連線,。

必須另外按下一個 Button按鈕,才能關閉連結。

(他完全不懂網頁程式的運作、也不知道什麼叫做 PostBack) 他想要寫一個功能,能在 ASP.NET程式錯誤的時候,抓圖(Print Screen)
把 User的瀏覽器(他正在上哪一個網頁、URL),畫面抓起來 不小心看到以前的文章,才知道他不是剛剛加入的菜鳥

他想要寫書賺點錢(ASP.NET的書....號稱有很多絕招!) 不懂網頁程式「前端(JavaScript)」與「後端(ASP.NET)」的差異
不懂網頁程式(Web Form)與 Windows程式(Windows Form)的差異

因為基本的差異不懂,所以被另外一個不懂的人,帶著亂跑(沒辦法說服對方),
進入一個「混亂而且很難作」的困境!

活該!!仗著自己有經驗,看不起網頁程式,結果死在一開始的地方而不自知
Server上已有asp.net的web
正常來說web會讀取server的DB
但我想問的是
從web端讀到使用者本機的access
*全部使用者的access架構.路徑.名稱等,全部都一樣的情況下

其實web端就是個display用的
真正的DB是放在使用者的電腦上

我設路徑為C:\DB.mdb
本機測當然沒問題
丟到server上時
會讀成server自己的C:\DB.mdb

所以是否有解決之道?
以前的一個範例,說明 Windows Form與 Web Form(網頁程式)兩者的差異!

2016年1月5日 星期二

繪製統計圖表的利器 - Microsoft Chart Controls for Microsoft .NET Framework 3.5

在古早古早的時代,如果遇到有需要繪製統計圖表的需求,而且沒錢買現成的圖表元件的話,最慘的作法是土法煉鋼式的自己把圖表「刻」出來;先進「一點點」的作法可以引用Office中Excel的製圖元件(ASP.Net 2.0版就可以用喔!!)。
而在.Net Framework 3.5 SP1之後,當然就首推Microsoft Chart Controls for Microsoft .NET Framework 3.5 (英文版連結在此)啦,因為它免費!!如果你有幸所使用的.Net Framework是4.0版的話(也就是使用Visual Studio 2010啦)那就更棒了,因為它內建!! 


在古早古早的時代,如果遇到有需要繪製統計圖表的需求,而且沒錢買現成的圖表元件的話,最慘的作法是土法煉鋼式的自己把圖表「刻」出來;先進「一點點」的作法可以引用Office中Excel的製圖元件(ASP.Net 2.0版就可以用喔!!)。
而在.Net Framework 3.5 SP1之後,當然就首推Microsoft Chart Controls for Microsoft .NET Framework 3.5 (英文版連結在此)啦,因為它免費!!如果你有幸所使用的.Net Framework是4.0版的話(也就是使用Visual Studio 2010啦)那就更棒了,因為它內建!!
image


安裝好之後,在Visual Studio 2008的Toolbox中就可以看到多了Chart控制項囉!! 把它拖拉到我們的頁面上的話,它預設會生出以下的HTML碼: 
<asp:Chart ID="Chart1" runat="server">
    <Series>
        <asp:Series Name="Series1">
        </asp:Series>
    </Series>
    <ChartAreas>
        <asp:ChartArea Name="ChartArea1">
        </asp:ChartArea>
    </ChartAreas>
</asp:Chart>

而在Design Mode中看到的則是如下的長條圖:

image
 
再來跟大家稍微的介紹一下Chart的幾個較為常用的屬性:
首先要登場的是Palette屬性:我們可以透過選取內建的調色盤,輕鬆的改變圖表的配色。

image
 

再來是Chart分類下的相關屬性:

image
  • Annotations:可以在圖表中加入說明
  • ChartAreas:可以設定圖表的外觀,例如是否要以3D方式呈現、繪圖的細節程度...等等
image
  • Legend:可以在圖表中加入圖說的部份(如下圖圖表的右上角)
image
  • Series:可以設定圖表中資料分組的相關資料,例如資料組名稱、呈現方式等等
image
  • Titles:可以設定圖表的表頭文字
image

還有很重要的Image分類下的設定:

image
  • AntiAliasing:可以設定要對圖表中的哪些物件進行反鋸齒處理。
  • Compression:設定圖片的壓縮率,壓縮率越高失真越嚴重,但檔案越小。
  • ImageLocation:圖檔的路徑和檔名,需搭配ImageStorageMode使用。ChartPic為圖檔的前綴檔名_#SEQ(300,3)代表圖片會使用流水號的方式命名,最多允許300張,之後就會再從頭開始編號;而3代表了該圖片生成的程序Timeout時間為三分鐘,關於更詳細的設定方式請參考:Image File Management (Chart Controls)
  • ImageStorageMode:設定圖片的儲存方式,可以選擇要儲存在實際的路徑中,或是透過HttpHandler顯示而不進行儲存的動作。
  • ImageType:圖檔的編碼格式。
  • IsSoftShadows:陰影的繪製是否要進行柔化處理。
  • RenderType:設定圖片的顯示方式,可選擇以ImageTag或是以BinaryStreaming的方式傳輸圖片,還有ImageMap的方式顯示,詳細參數設定請參考:Chart Image Rendering (Chart Controls)
  • TextAntiAliasingQuality:設定文字反鋸齒的品質。

最後再補充一個也很重要的屬性 – Appearance分類下面的BorderSkin(其實就在Palette上面啦):可以用來設定圖表的外框。

image

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"];