顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

2012年7月30日 星期一

System.IO.StreamReader/StreamWriter 和 System.IO.File.ReadAllText/WriteAllText

我在「利用StreamWriter 資料流I/O 寫成檔案」這篇文章寫了一個自已學習的歷程
主題雖然是使用System.IO類別下的方法,但是具體而微,System.IO命名空間下,除了有提供讀寫檔案和資料流的類別外,就是基本檔案、目錄管理的類別。方法都是大同小異…

這次的程式碼範例,我就特別針對「將內容寫進新建的文字檔」「開啟檔案並讀取內容」「將內容附加到既有的文字檔」這三個功能,分別寫了System.IO.Stream 和System.IO.File 二種版本,用這二種類別都可以完成,邏輯上是一樣的,只不過要使用自已類別下的Method方法來達成目的而已。

頁面上的佈置很簡單,一個TextBox、三顆功能按鈕

以下提供File和Stream二種類別的寫法

創意和創新…對我來說就好比「發現和發明…」

創意和創新…
對我來說就好比「發現和發明…」

創意,就是腦力激盪後的idea
都是把idea變的具體可行

週日看到一個電視節目
裡頭的表演者和投影畫面互動
(如果你有興趣看完全部,請點選此處)
image

恰巧的,這個橋段我很久以前在youtube上看過人家分享
恰巧的,我還把這個橋段放在我的「創意」播放清單裡



好的,很明顯的,日本節目中的這個表演者把投影互動搞的更淋漓盡致
我想台灣節目的這個表演者應該也看過類似的「創意」表演吧

所以我們要說這個台灣表演者所演出的內容是抄襲嗎?
(如果表演內容精采度超過日本表演者的話,也許你會說他不是抄襲吧?)

2012年7月14日 星期六

自行撰寫GridView的RowCommand處理常式

目前沒想到什麼應用範例,所以學習一下MSDN現有的範本改寫一下,範本實作的是,把GridView的資料列「加入到ListBox」或「從ListBox移除」

◎以上程式範例AspNet45.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

2012年7月13日 星期五

GridView中和「刪除」事件有關的事件常式

和刪除的事件常式有GridView.RowDeleting 事件和GridView.RowDeleted事件。關聯著不同的事件常式,我們可以利用事件順序中提供的事件常式來加載一些自已設計的程序。

先了解事件發生的順序,從字面上翻譯的話不難理解。

-ing 現在進行式,正在發生的事件(但還沒發生)
-ed 過去式,已經發生的事件

所以GridView刪除資料的事件順序應該是:
按一下GridView的刪除按鈕→(GridView的RowDeleting 事件)→刪除資料列→(GridView的RowDeleted事件)。

上面的順序中,括號( )內是可有可無,所以我們可以用既有的事件常式,自已在一連串的事件過程,撰寫自已的程式碼,以下是測試網頁,當按下刪除會出現」你沒有權限刪除資料」的文字,刪除完資料會顯示「刪除成功」文字。

◎以上程式範例AspNet43_1.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

2012年7月12日 星期四

ASP.NET上使用JavaScript的方法 (二)

繼上一篇文章ASP.NET上使用JavaScript的方法 (一)
談到了在HTML原始碼上面寫進JavaScript的三種方式
是比較傳統的作法

這篇文章才算是真正的進入ASP.NET的範疇
主要是談怎麼在Server端寫Code 程式碼的時候也一併寫JavaScript

寫在前面:這邊我還是延用上一專題ASP.NET上使用JavaScript的方法 (一)的案例「限制級網頁」來探討如何使用JavaScript,Script的內容是一樣的,如下:

    <script type="text/javascript">
            if (confirm('以下內容為限制級,如果你已年滿18歲請按確定繼續觀看,否則請按取消 '))
        { document.write('你按了確定, 這些畫面很暴力、很情色吧…') }
        else {document.getElementById('Panel1').style.visibility = 'hidden'}
    </script>

和上篇文章不同的地方,是我修改了一下畫面的設計,在圖片的部分,我這次不用HTML來維護圖片的長度和寬度,改用CSS設計的方式…把程式碼區塊弄得更複雜一些。HTML原始碼如下:

<head runat="server">
    <title></title>
    <style type="text/css">
        .style1
        {
            width: 100px;
            height: 80px;
        }
        .style2
        {
            width: 100px;
            height: 80px;
        }
        .style3
        {
            width: 100px;
            height: 80px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>    
        <img alt="溫馨圖片,普通級" class="style1" src="Images/test0.jpg" /><br />
        <asp:Panel ID="Panel1" runat="server" style="margin-bottom: 0px">
            <img alt="暴力圖片,限制級" class="style2" src="Images/test1.jpg" />
            <img alt="情色圖片,限制級" class="style3" src="Images/test2.jpg" />
        </asp:Panel>    
    </div>
    </form>
</body>
</html>

用CSS的結果和直接用HTML的Image設定是一樣的,這麼是多此一舉,只是想把HTML弄得複雜一點,JavaScript會看得比較清楚,所以就先用上去吧。
image

後面就來介紹其他的幾種使用方法。

2012年7月11日 星期三

ASP.NET上使用JavaScript的方法 (一)

記得以前在參考書上常常看到JavaScript應用在ASP.NET上
不過寫的方式和位置總是讓人摸不著頭緒
這本書寫在這邊、那本書寫在那邊的…
可能因為那些書也不是專門講JavaScript
所以對於為什麼要這樣寫著墨也不是很多
常常是在出錯中學習

在ASP.NET使用JavaScript的方法不一而足
可是使用的時機不大一樣
想想現在很多的大型的網路應用  (像Google MAP) 都有提供支援JavaScript的API
今個兒想來做個整理
說不定哪一天派得上用場

寫在前面


為了避免混淆,我整理的方式比較特別一點,我想統一使用一種Script,來試著表現出「使用時機」的重要性。所以這邊我設計了一個案例,說明如下:
這個網頁的部分內容是限制級的,所以進入前需要有一個確認的功能,跳出一個詢問視窗詢問Brower是否滿18歲,如果按下確定,就可以看到這個部分的內容,如果按下取消,就把這個限制級的內容給關閉。image

好啦,我承認這個案例有點白痴,是有「目的」設計的案例
用ASP.NET來寫就可以完成的範例,有點殺雞用牛刀的感覺。

這邊就「故意」用JavaScript,Confirm視窗的方式來表現,完整的Script如下:

    <script type="text/javascript">
        if (confirm("以下內容為限制級,如果你已年滿18歲請按確定繼續觀看,否則請按取消 "))
        { document.write("你按了確定, 這些畫面很暴力、很情色吧…") }
        else { document.getElementById('Panel1').style.style.visibility = 'hidden' }
    </script>


說明一下上面的程式碼

行2~行3 如果按下確定,就直接呈現畫面,並輸出文字「你按了確定,這些畫面很暴力、很情色吧」到畫面上

行4 如果按下取消 (或直接按 「x」關閉視窗 ) 那就把 HTML 裡 的 <panel> 給遮蔽掉,這<panel>區塊就是我放暴力情色內容的地方。

這個案例裡,一般的內容我會簡單的用一張圖 test0.jpg 來表示
而panel 這個區塊我會放一張暴力的圖 test1.jpg、一張情色的圖 test2.jpg 來表示

以下就看看下面提到的方式哪些可以完成這個案例。

2012年7月10日 星期二

我還停在ASP.NET 2 的時代…我不甘心

偶有所得

我還停在ASP.NET 2 的時代…我不甘心

寫程式這回事真的是停下腳步就前功盡棄了
第一次學寫程式是2005年的事
第一次學的程式是用vb來寫asp.net動態網頁
當時其實asp和asp.net都分不清楚
常常買錯書,唯一分辨的方式
就是看看書裡面介紹的是不是用Visual Studio這個軟體來寫
也只知道看看一些工具的使用
殊不知道自已在物件導向的領域裡頭了
以為程式就這麼寫
就知道跟著書拉拉控制項
IntelliSense 真的很有sense,因為只要打了關鍵字就會自動跳出相關的參數
CodeBehind 讓我分得出來哪裡是在寫外觀、哪裡是在寫程序…雖然都是程式

2005那年,剛好又是和ASP.NET 2.0新舊交替的年代,在一場研習活動中,我週遭的學員好多上了第一場課就跑了,跑的時候還不忘數落ASP.NET,說「這哪裡叫做寫程式?只是拉拉控制項而已」… 我倒是留在教室內,上完了5日的研習課程。

因為這是我唯一會的程式…

ASP.NET 2.0 帶來了ADO.NET和更多的控制項,我也開始懷疑自已到底會不會寫程式了…漸漸的,我了解了物件導向模式。我也知道自已正在中毒中…

恐怕我唯一會的不是asp.net程式,我唯一會的是利用物件來做網頁
唯一能安慰的是我的資料庫(MS SQL)學習的時間變長了,學的也還不錯,資料表的設計還算可以(不正則,但資料間不會衝突太多)
那時我已經能利用MasterPage控制項做了一個大型的(充滿控制項)的動態網站
該有的都有,但就是人家有的我可能會有,人家沒有的我一定沒有

後來因為到外島工作+結婚+生子 ,ASP.NET 因為工作屬性關係沒有太多需求了
在外島的前幾年就此中斷了ASP.NET學習之路
轉戰硬體技術、軟體操作、網路管理、office…這些領域…因為也有很多沒有接觸過,所以花很多時間去學習。

一直到2011年1月,我的生日,回顧這幾年的日子,看著書架的那琳瑯滿目的書籍,我驚覺到我的書籍中最多的就是ASP.NET (還夾雜著許多買錯的ASP),再拿來翻他一翻…發現了一件事情,就是我比以前看得更明白了一些。再去google 一下ASP.NET,已經一大堆東西我看不懂了…

ASP.NET 3.5
ASP.NET AJAX
ASP.NET MVC
Dynamic Web Site
ASP.NET 4

在2005-2010年這五年期間多出來的東西也太多了吧,雖然我很少碰ASP.NET了,但隨著 google、facebook的發展,我想稱Web Application 是顯學應該是不為過。我好不容易有點基礎的、唯一學習有成的動態網站,怎麼可以說放棄說放棄,所以我在和家人商量後,決定重新回到ASP.NET的懷抱。

這會兒回來了,關發用的軟體雖然是Visual Studio 2010,Framework是4.0,但我很清楚的是,我自已還是在寫ASP.NET 2.0時代的東西。

有時候真的很不甘心…是變化太快,還是因為我不是業界沒有太多的接觸面,我真的沒辦法跟上別人的腳步嗎?2011年開始,我決心要在blogger上寫一些學習心得類的文章,寫這些文章的目的是鞭策自已,文章的內容或是從書上來,或是網路資訊,因為要放在自已的部落格上,所以都得自已辨證過…逐字逐句都是用自已的方式了解並慢慢建構出來的,不直接抄別人的,一切都要自已消化過才敢寫。

這7月雖然炎熱常讓人靜不下心,對我來說卻是需要好好把握的黃金時期。截至今天7月11日為止,7月內我發表的和ASP.NET相關的文章是9篇,每篇都是心血,都是不斷學習的結晶…

不知道是年紀到了還是怎麼,這一陣子對自已的鞕策下來我明白的了,物件導向是一個增加網站開發者產能的一種手段,在層層包裝的物件下,我們不用再自已寫一下「必要」的核心程序。除了程式邏輯外,我開始關注了比較深一層的東西,因為沒必要寫核心程式,不代表不需要關心核心,這種核心文件當然是要從MSDN上取經,很辛苦,因為上面有些是翻譯文,簡直就像火星文那樣,解讀非常吃力,有時候其實原文搞不好更容易懂。不過隨著閱讀時間增多了理解力也愈好了…對於物件導向的程式設計也不覺得害怕。

不過像現在 Cloud Computing 的火熱程度不亞於當初的 Internet Application ,JavaScript 再度成為 Web Application 的用戶端開發的顯學之一,雖然MSDN雜誌上曾經有發表過什麼「VB6老兵不死」的文章,但是我還是蠻怕Visual Basic 的式微 (從google中,我覺得大陸人都在用C#,比爾蓋茲先生,你可要守護好你自已最愛的語言VB啊)

不過雖然語言不同,殊途同歸的就是,「事件驅動」的開發精神是沒有變的,開發者建構物件核心,使用者只要利用物件可引發的事件來處理事情就好了。

不知道這樣算是好還是不好,好吧,既然決定了目標,我想不是心裡不甘心就好了,學習的文件能讀多少就算多少,物件核心能挖多深就挖多深…
image

有朝一日,我要用ASP.NET4.0來寫程式。

GridView 批次刪除功能(複選多個資料列)_1

這個範例主要是在介紹「批次刪除功能」,用GridView快速建置資料列並加以手動修改樣版,使用者按下「全選」按鈕來選擇GridView下所有的資料列,或是透過每列資料列前的CheckBox來「複選」多個資料列,按下「刪除」按鈕把所選取的資料列刪除。

◎以上程式範例AspNet42.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

2012年7月6日 星期五

將GridView裡資料匯出成Excel檔

在網頁上展示報表資料,用GridView是很好的方式
有時候報表要做成不同的圖表顯示,利用Chart控制項來製作也不錯

另一種方式,就是把資料匯出成Excel
要做其他的分析、華麗的圖表也是一種方式

這篇文章就來說說
怎麼將GridView裡的欄位資料輸出到Excel檔案
供使用者來做其他使用

我以前從書上看過這樣類似的範例
是vb.net的書籍
用的方法是調用 Microsoft.Office.Tools.Excel 的命名空間(Namespace)
很專業的方式,可以參考MSDN文章
http://msdn.microsoft.com/zh-tw/library/microsoft.office.tools.excel(v=vs.100).aspx

不過從這個命名空間的層級看來
大概也可以知道是不適合用在WEB FORM的一個物件模型
(ASP.NET網頁一開始就直接調用了 System.Web 並使用階層下的物件)
所以要使用這種方法還有一個條件
就是在Server端也要裝相應版本的Excel
在Browser端也要裝相應版本的Excel
因為在Brower端執行時,還是透過Server的 Automation (ActiveX EXE) 操控 Office ,只是Framework幫你包裝好一些 Namespace 讓你比較好運用而已。(講到要操控Server端的Office,應該會因為browser的權限不足所以根本無法使用吧…光create object 就會出問題了,browser 能在伺服器端產生物件…那權力也大的危險了)

這邊說的方式是比較偷龍轉鳳的方式
利用的是Excel本身支持豐富的文件格式(所以本身還帶自動解析識別)

把網頁資料匯出成Excel的方式
dnowba 有鑽研過(k了不少書+爬了不少文)
方法至少有六種

這篇文章是以一個「需求」的角度來寫的
控制excel的方式並不是最好的

對於B/S (Browser/Server ,即WEB應用) 結構來說
我們也許只是想小小的應用一下excel來產生報表
並不需要擁有太多的控制能力

在此打住,直接提供主範例DEMO

◎以上程式範例AspNet40.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

2012年7月5日 星期四

ANSI和Unicode、UTF-8和UTF-16、BOM

這一篇是個學習紀錄,對於字元編碼其實從前是有點知其然不知其所以然,今個兒決定要徹夜苦讀,爬了些文章並自已做了測試,寫下一些學習心得。可能觀念上還是有些問題,如果有高手路過,一定要給小弟指教指教。

先實作看看

二個是字元編碼的規範,先不談理論,我們實作一下,開啟Windows 裡頭的NotePad.exe 然後輸入「DNOWBA的部落格」

接著「另存新檔」,分別存二種編碼檔案:

一個名稱就叫ANSI,編碼選擇ANSIimage

再另存一次,名為Unicode,編碼選Unicode
image

再次打開這二個檔案,比較一下,沒有差別對吧。

CheckBox和CheckBoxList的使用範例

這邊利用CheckBox來製作調整控制項配置方式的選項按鈕,也順便介紹了HTML時代沒有的控制項CheckBoxList有哪些現成的配置屬性供修改。

再來是CheckBoxList 的使用,並從選取過程中抓出使用者勾選了哪些資料。

◎以上程式範例AspNet14.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

以下為程式碼及解說

2012年7月4日 星期三

密碼再次驗證的範例

在建立會員機制,讓使用者建立密碼的時候,最好二次驗證,double check,因為密碼在輸入時是遮罩掉避免有心人士從旁觀看,所以有可能使用者建立密碼時按錯鍵自已也不清楚。

◎以上程式範例AspNet13.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

底下是程式碼:

Button 每按一下就累加1的探討

不知道要如何命名比較好
這篇是一個ASP.NET技術:「ViewState」的討論
覺得很是重要,因為常常在抓取控制項的數值時出了錯,報錯常見和ViewState相關
所以特別拿出來研究研究
當然也不是自已的成果啦
只是把高手們的資料看看自已測試一下

先把結果寫出來,有興趣的再往下看吧

結果:

◎以上程式範例AspNet12.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

Partial Class AspNet12
    Inherits System.Web.UI.Page
    Dim i As Integer

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' ===== 關於Viewstate:按鈕之後,數值累加1 =====
        ' 以下二個結論:
        ' 1、在使用時可以發現
        ' http 是一個 stateless(無狀態) 的協定
        ' 用最原始的response來做是不能累加的,因為
        ' 當傳遞完值後就關閉和server的連接
        ' 而ASP.NET不同處在於在值傳遞過程,都會紀錄每個「控制項」的狀態(viewstate)

        ' 2、如果把button1_click()裡的事件改放到Page_Load()裡
        ' 不管按下什麼控制項,都會發現Page_Load都會被觸發
        ' 這是Page_Load的特性
        ' 是以往傳統程式一個項一個事件,不按就沒有事件被執行的觀念不同
        ' 所以我們常在每個Page_Load裡面寫一段判別式,如下:

        'If Not Page.IsPostBack = True Then
        ' 這邊就是指第一次開啟web應用程序
        ' else
        ' 這邊的敘述句就是指第二、三、四、五…次讀取頁面
        'End If

        If Not Page.IsPostBack = True Then
            ' 也因為控制項的狀態被紀錄過一次了,所以可以用Page.IsPostBack來判定
            ' 就算重新載入了,該控制項的「屬性」還是會被保留住
            Me.Label1.ForeColor = Drawing.Color.Red
            Me.Label1.Text = 0
        End If
        ' 不給初始值=0的話,後面累加1的時候會報錯,即便vb這麼青菜,還是不給加字串的,所以
        ' 我們給他「方便」辯識用,初始值給他設定為 0,讓VB自動把這個「值」當成是「數字」。
        ' c# 就不可以這樣做了,c#較嚴謹,需要設定好每個變數的型別
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 用最原始的response來做是不能累加的
        ' i = i + 1
        ' Response.Write(i)
        ' 而用控制項的話,因為viewstate的關係,就能累加
        ' 底下用的Cint來將值轉化成int整數,是比較正式的寫法,不寫也行
        Me.Label1.Text = CInt(Me.Label1.Text) + 1
    End Sub
End Class

ASP.NET網頁生命週期

之前在 MSDN 有看過介紹一般網頁生命週期的文章
覺得還蠻專業的

不知道什麼時候又多了這麼一張圖
也太清楚了吧
這下子很多問題都可以解決啦
容dnowba把圖截下來貼起來做個筆記
image

圖片來源:http://msdn.microsoft.com/zh-tw/library/ms178472.aspx

2012年7月3日 星期二

For 迴圈在ASP.NET的應用

◎以上程式範例AspNet11.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

2012年7月2日 星期一

用ListView做一個搜尋引擎webform

本來下的標題是「用ASP.NET寫一個搜尋引擎網頁」
後來想想…好像沒有自已手動「寫」
都是靠Visual Studio軟體中的控制項自動生成的…
命名上還是老實點好了,題外話。

既然Visual Studio幫我們把繁雜的程式碼給生出來了
不好好地看一看這些程式碼怎麼對得起它呢?

◎以上程式範例AspNet39.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

以下就大致上講一下利用ListView控制項製作搜尋引擎網頁的方式

2012年6月30日 星期六

利用GridView、DetailView製作Master-Details 主表明細

Master-Details (主表明細、主細表) 是每個系統(購物系統、新聞系統、進銷存系統…)都會用到的功能,這篇文章主要是說明利用Visual Studio 2010 現有的控制項來完成簡易的主細表。

範例如下:Master主表用來顯示標題title,按下該欄位最右方的select選取按鈕,就可以看見該篇文章的詳細內容。

◎以上程式範例AspNet38_1.aspx,如在頁框下不能操作,請開新視窗操作
◎如果有問題歡迎您提出,dnowba很需要有人和我一起討論

ASP.NET GridView上刪除欄位資料時,出現confirm box 確認視窗

DNOWBA在 ASP.NET webform上加上JavaScript對話框 已經寫過一個簡單的方法,是把刪除的確認視窗寫在html原始碼裡,如果是使用像GridView這類的控制項,在產生每個欄位的時候,就會自動調整GridView裡的小控制項。

如果要更靈活的和客戶端「互動」,把刪除哪份資料也在confirm 視窗裡頭提示,如下圖,在按下刪除按鈕的時候,顯示的confirm box會帶出刪除哪一篇文章的訊息(反白的文字就是標題),這樣的話更可以知道自已到底是按了哪個刪除按鈕,刪除資料前會更有保障。
image

那麼,我們可以把script寫在後置程式碼裡來完整控制。不過,愈是要「完整控制」,牽涉的程式碼愈複雜,我想這是免不了的,不過也因為這樣,我們可以學習更多的控制項內容…蠻有趣的。

2012年6月28日 星期四

ASP.NET webform上加上JavaScript對話框

dialog box 對話框(對話視窗/對話盒)是用來顯示特殊訊息,觀看者需要作出回應後才可繼續操作。JavaScript內有三類對話方式,windows上分別使用三個method:
window.alert( ) window.confirm( ) window.prompt( )

上面是我們在以前程式設計知道的,在ASP.NET裡頭也有運作的方法,這邊先以一般的html狀況來做複習,探討什麼時機用什麼樣的對話框,最後再提到ASP.NET裡使用的方法。

image

image

2012年6月26日 星期二

在GridView上按下button時,畫面固定位置

這個範例很難用言語解釋
我也很不會說這個功能到底是什麼
建議大家實際測試一下

先圖解一下好了:

GridView 已經在視窗的很下面(瀏覽器旁邊已經出現捲軸橫桿)的時候,我們按下「Select」按鈕
image

結果畫面一重整,視窗就跳回畫面最上方了,必須把畫面拉到下方才能看到選取的欄位,很不方便
image

如果是要編輯這個欄位的時候,那麼這個狀況就要排除,要避免這個問題,解決方式就是在HTML原始碼的page指示詞上,加上 MaintainScrollPositionOnPostback="true" ,程式碼如下:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="AspNet36.aspx.vb" Inherits="AspNet36" MaintainScrollPositionOnPostback="true" %>

如果要實際測試的話,可以試試
(1) http://dnowba.somee.com/AspNet35.aspx 這個是沒有加上MaintainScrollPositionOnPostback
(2) http://dnowba.somee.com/AspNet36.aspx 這個是加上MaintainScrollPositionOnPostback

這個屬性的命名,字面上的意思也很清楚,意思就是
「維持捲軸位置當postback時」
所以當然也不是只有GridView上的commandfield命令欄位可以使用啦
只要有觸發postback條件的控制項都可以用這個來維持畫面位置

Related Posts Plugin for WordPress, Blogger...
// Dnow Function