2008年12月25日 星期四

網頁離開前跳出確認視窗

當 USER 點選瀏覽器的關閉視窗 X 時,若要詢問 USER 

是否確定要離開,可以透過javascript用以下方法來完成。


window.onbeforeunload



完整 範例參考:


<HTML>
<HEAD>
<TITLE> 輕鬆一下 </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--//
window.onbeforeunload = function confirmExit(){
return '有尚未儲存的資料,確定要離開嗎?'; //自訂提示
}
//-->

</SCRIPT>
</HEAD>
<BODY >
<P>本程式在<b>關閉</b>之後,會有一個警示畫面產生。</P>
</BODY>
</HTML>


補充:

在ASP.Net 使用這方法時,因ASPX頁面會存在許多會觸發 post back 的 server control,當其中一個 server control 觸發 post back 之後,依據上面的範例,就會跳出警示畫面。我們只是希望當User點選離開(X)時才跳出警示畫面,而非任何控制項都是如此。所以可以更進一步去改良我們的程式。

confirmExit() 是一個內建函式,如果在函式內加上 return 'OOOOO';  就會在警示視窗中出現 'OOOOO'的字眼,但如果只是 return ; 則就不會跳出警示視窗。

所以可以透過一個變數來決定是否要觸發警示視窗。如下所示:



<script language="javascript" type="text/javascript">
var shouldConfirm = true;
window.onbeforeunload = function confirmExit(){
if(shouldConfirm)
return '離開即會放棄基準設定,確定要放棄嗎?'; //自訂提示
else
return ;
}
</script>

如此,假如 ASPX頁面有個控制項叫做 btnSave,我們並不希望壓下 btnSave觸發警示視窗,則可以在btnSave 的 OnClientClick 加上 shouldConfirm=false; ,如此 btnSave 就不會觸發警示視窗。

javascript 錯誤處理


撰寫 javascript 時,如果發生javascript錯誤,會在瀏覽器上直接丟出

錯誤訊息。如果想要避免直接將錯誤丟出來,可以透過

window.onerror

去欄。






做法如下:

<script language="jscript" type="text/jscript">    

    function handleError() {    

     alert('遇到錯誤了');

     return true;  

    }

    

     window.onerror = handleError;

</script>





設定 window.onerror ,並指定對應的處理方法(handleError)。

參考 http://www.chunkysoup.net/basic/breakingjs/







2008年12月23日 星期二

在showModalDialog 裡使用 location.href

在showModalDialog 裡使用 location.href 






遇到一個情況,當我在一個 showModalDialog 視窗使用 javascript 執行
location.href = ' http://ooo.xxx' 之後,很討厭的就開啟了一個新的視窗。
雖然在這個 showModalDialog 頁面的 <head></head>裡有加了一行
<base target="_self" />
但仍然無效。

於是在網路上找到ㄧ篇能解決問題的文章,真的蠻不錯的。

於是,我將自己原本的程式,改成 

<script>   
  window.name="__self";   
  window.open("yoururl","__self")   
</script>

就可以了。

2008年12月9日 星期二

重點新聞

看到 NowNews  的新聞頭條功能,覺得蠻有趣的。看了一下他的程式碼,蠻簡單的。

主要,是將圈起來的地方,讓他能夠定時去做更新的動作。
將程式的寫法整理入下面的連結。

2008年11月21日 星期五

DataView To DataTable

在 .Net 2.0 提供了 SqlDataSource 簡化了存取 SQL Sever 的操作。但對於回傳值的使用,常見的是 DataView 與 DataReader。但如果我們需要對所回傳資料進行資料的異動處理時,DataView真的就很不方便了。

還好,在 .Net 2.0 之後的 DataView 有強化了其功能,增加一個方法 DataView.ToTable ( ) ,可以讓你輕鬆的轉型為 DataTable。

2008年11月11日 星期二

showmodaldialog 檔案下載沒有反應

最近發現使用 showmodaldialog 時,雖然在 header 裡面有放 <base target="_self" /> 來處理 postback 的事件,但只要遇到有檔案下載的時候,不管怎麼點選都沒任何反應。可是改成 FireFox 就正常。另外,不使用 showmodaldialog 而是直接開啟那頁,又正常。

在網路上剛好找到一位跟我同病相憐的人,他介紹了一個完美的解決方法。


而我也修改了自己的程式如下:



<asp:HyperLink ID="lnk_File" Target="ifrTarget" runat="server"

NavigateUrl='<%# MakeURL(DataBinder.Eval(Container.DataItem,"ga_id")) %>'

Text='<%# Eval("ga_filename") %>'></asp:HyperLink>



<iframe name="ifrTarget" id="ifrTarget" width="0" height="0"></iframe>

主要,是在原先下載的鏈結裡,設定 target ,並指向自定的一個空的 iframe 。這樣就可以正確的執行我想要的下載功能了。

2008年11月7日 星期五

GrideView 實現跨欄作法

一個透過 GridView 達到跨欄效果的方法:
書名作者備註
Name1Author1跨欄資料
Name2Author2
Name3Author3
Name4Author4
Name5Author5


在 aspx 頁面,放置一個 GridView


<asp:GridView ID="gv" BorderColor="black" runat="server" AutoGenerateColumns="False" OnRowDataBound="gv_RowDataBound">
<Columns>
<asp:BoundField DataField="BookName" HeaderText="書名" />
<asp:BoundField DataField="Author" HeaderText="作者" />
<asp:BoundField HeaderText="備註" />
</Columns>
</asp:GridView>


定義自定的類別,以供 GridView 當資料來源


public class CBook
{
private string _BookName = string.Empty;
private string _Author = string.Empty;

public string BookName
{
get { return _BookName; }
set { _BookName = value; }
}

public string Author
{
get { return _Author; }
set { _Author = value; }
}
}


.cs 的程式


ArrayList alBook = new ArrayList();

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitBookData();
gv.DataSource = alBook;
gv.DataBind();
}
}

private void InitBookData()
{
CBook cb = null;

for (int i = 0; i < 5; i++)
{
cb = new CBook();
cb.BookName = string.Format("Name{0}", i + 1);
cb.Author = string.Format("Author{0}", i + 1);
alBook.Add(cb);
}
}

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TableCellCollection tcc = e.Row.Cells;
if (e.Row.RowIndex == 0)
{
tcc[2].RowSpan = 5;
tcc[2].Text = "跨欄資料";
}
else
{
tcc.Clear();
tcc.Add(new TableCell());
tcc[0].Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem,"BookName"));
tcc.Add(new TableCell());
tcc[1].Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Author"));
}


}
}

2008年11月6日 星期四

User Control

User Control 與 Server Control 提供了程式的可重複使用性,但是兩者的開發成本上,卻是有著蠻大的差距。使用 UserControl 可以讓程式設計師保有拖拉物件的習慣與WYSIWYG(所見即所得)的便利性,入門上的門檻其實是比較低的。然而 Server Control的開發,則必須對 .Net 事件的觸發及基本類別的幾個重要屬性或方法有一定了解,才會比較能夠用起來得心順手。Server Control的確在跨專案也可使用的特性下獨具優勢,不然你看外面 third-party 所賣的元件,絕大多數都是包成 dll 讓你直接呼叫就可使用,很少是提供 User Control 來給你 copy-past 使用的。但並非少了跨專案可直接使用的特性,就會讓 User Control 失去舞台,相反地,只要你掌握住幾個 User Control 的關鍵要點, 相信使用起來就會非常的方便。

目前常會採用 User Control 的情況如下:
1.整個專案中重複出現的功能,如每頁上方的功能列
2.很多地方會重複出現的區塊

而自己遇到這種情況時,都會優先考慮採用 User Control 來達成。

回到剛剛所提到,要掌握住哪些 User Control 的要點呢?

要點一、ASPX 呼叫或設定 User Control 裡面的方法或屬性
自訂的User Control 裡,可能會定義了一些公開的方法或屬性,希望日後被某個 ASPX 頁面引用時,可以在 ASPX 的頁面裡直接呼叫 User Control 裡所定義的這些方法或屬性。

參考: http://paladinprogram.blogspot.com/2008/04/user-control.html

要點二、ASPX 攔截 User Control 裡的物件觸發事件
自訂的User Control 裡,我們可能加入了一些按鈕。而當這個 User Control 被某個 ASPX 頁面引用時,當網路使用者壓下自訂 User Control 按鈕時,希望也能夠讓 ASPX 頁面攔到是這個按鈕所觸發的事件,並在這事件裡頭寫些程式。
參考:http://paladinprogram.blogspot.com/2008/11/raise-usercontrol-event-to-main-page.html

相信這幾點釐清後, User Control 與你的距離,會拉近不少。

2008年11月5日 星期三

Blog 文章中貼程式碼

在網路上找了好久,
終於找到一篇看的懂,而且也可以有效的文章了。

我的目的,是希望自己在部落格所貼的程式碼能夠正確顯示出來。
不需要老是為了排版而傷腦經,現在,終於有個替代方案囉。


http://grandsights.twbbs.org/2007/04/blogger.html

在網頁範本裡加上下面這一段:


CODE, .code {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://polin2005.googlepages.com/BG_CODE.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;max-height:200px;
line-height: 1.2em;
}
CMD, .cmd {display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
color: #ccc;background: #000 url(http://polin2005.googlepages.com/BG_CMD.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
line-height: 1.2em;
}

使用方式:

<pre class="code" > XXXX </pre >


除此之外,我還看到可以顯示顏色的ㄟ,
不知道有沒有好心人也可以教一下。
要如何弄出有顏色的程式碼。

如何將ArrayList 的資料繫結到 GridView

有時候,我要的其實不多。


如果有一個簡單的ArrayList,想直接當成 GridView資料來源,要如何
實作呢?


ArrayList 可以允許我們塞入物件類別,所以我需要事先定義一個類別,
裡頭必須包含公開的屬性,方便日後 GridView裡頭的欄位需要指定繫結
欄位來源時有所依據。


範例如下:


首先,先建立一個自定的類別。

public class cDateCombine
{
string _Date = string.Empty;
public string Date
{
get { return _Date; }
set { _Date = value; }
}

public cDateCombine(string strDate)
{
_Date = strDate;
}
}



在這個類別裡,我只定義了一個公開屬性 Date,
並且寫了一個可以自動將字串帶入的建構程序。


接著,在程式裡加上設定 GridView 資料來源的程式碼。


string strDate = "20080101,20090101,20090505";
string [] arrayDate = strDate.Split(',');

ArrayList alDate = new ArrayList();
for (int i = 0; i < arrayDate.Length; i++)
{
if (arrayDate[i].ToString().Length > 0)
alDate.Add(new cDateCombine(arrayDate[i]));
}

gv.DataSource = alDate;
gv.DataBind();

最後附上 Aspx 的頁面控制程式

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField HeaderText="日期" DataField="Date" />
</Columns>
</asp:GridView>





另外,有篇寫的蠻完整的文章,可以參考。


參考文章
http://www.akadia.com/services/dotnet_arraylist_datagrid.html

將字串陣列進行排序

剛好有需要將字串陣列進行排序的功能,
也順便將不錯的 Code 記錄下來。

在 .Net 2.0 有提供一個 Array.Sort(  ) 方法,
很容易完成排序功能。

範例:

        string strTest = "C,S,A,B";
        string[] testArray = strTest.Split(',');
        Array.Sort(testArray);

2008年11月4日 星期二

透過 JavaScript 去抓 select 的值

常常會用到透過 JS 去抓 select 控制項裡目前被挑選的項目,
剛好有一篇 BLOG 介紹的蠻詳細的。

可以參考參考。



Raise UserControl event to Main Page


[詳細連結←跨加啦]

當寫好一個 User Control 後,接著就會放到一個 aspx 頁面讓他有表現的機會。
可是,如果我們自訂的 UserControl 裡有Button 控制項,也希望在 aspx 頁面
能夠可以攔到使用者壓下 UserControl 裡的 Button 被觸發的事件時,該怎麼做ㄋ?

以下介紹三種方法:

第一種,正規作法:

參考了 Chirag Darji 部落格文章。
他在介紹 delegate 時,順便也把我的問題給解決了。真是舉手之勞啊!


第二種,特殊作法:
參考了 Mr. Puma Chih Cheng Kuo 部落格文章。
他同樣也是使用 delegate 來解決,但是他提到了自定事件參數的概念。以往我們在事件
參數傳遞,預設都是使用 EventArgs e
若想要自定事件參數時,則要事先去定義自己的EventArgs,Puma 則自己定義了 MyEventArgs。


第三種,懶人作法:
參考了 Thea 部落格文章。
真是酷斃了!如果你只是單純的想要在aspx頁面攔到 UserControl 裡的事件,用這個就對了。


心得,不管你用哪一種方法,在 aspx 頁面一定要去將 UserControl 裡的事件加入你的 EventHandler。
而且有個地方要注意,你不能將註冊 EventHandler 的程式寫在 !IsPostBack ,因為在每一次頁面
PostBack 時,都必須重新註冊一次。

2008年10月29日 星期三

GrideView 加入自訂 Button 出錯

今天在 GrideView 裡加入自訂 Button ,在網頁執行時點選該 Button,就會出現下面錯誤。 雖然有人直覺的建議關閉 enableEventValidation,但在XSS攻擊盛行的當下,實在不是個
好方法。

------ Error Message -----

無效的回傳或回呼引數。已在組態中使用 <pages enableEventValidation="true"/>或在網頁中使用<%@ 
Page EnableEventValidation="true" %> 啟用事件驗證。基於安全性理由,這項功能驗證回傳或回呼引數是來自原本呈現它們的伺服器控制項。如果資料為有效並且是必需的,請使用 ClientScriptManager.RegisterForEventValidation 方法註冊回傳或回呼資料,以進行驗證。 


-------------------------

花了幾個小時後,發現原來是自己在 Page_Load(  ) 裡,不分是否為  IsPostBack 都去重新Bind( ) 那 GrideView,但我也的確需要在 Button 被觸發後,重新去 Bind( ) 過 GridView,在進退維谷之際,想到還有一個 OnPreRender( ) 可以用,所以我將 Bind( ) GridView 的動作搬到 OnPreRender( ) 之後,就正常了。真沒想到,一時的疏忽,竟衍生出這麼難找的 BUG。

PS:還好目前的專案有用VSS控管,所以在找錯誤時,可以放心的砍掉其他不相關的程式,才得以順利找到問題。待找出真正的問題點後,再將專案復原簽出就可以了。



另外,可以參考:
http://paladinprogram.blogspot.com/2010/08/imagebutton-repeaterdatalistgridview.html

2008年10月27日 星期一

__LASTFOCUS的漏洞

近來透過 watch files 掃描站台的安全性,發現會出現 __LASTFOCUS 的問題,在網路上也看到蠻多人也遇到同樣的狀況。

原來這是微軟 .Net 2.0 上的漏洞,需要在 Web AP 上更新修正檔來解決。

2008年10月21日 星期二

Remote Post



在一般的登入網頁,使用者必須輸入帳號密碼,再壓一個確認按鈕,來
進行登入動作。

上述這些行為,有沒有辦法可以不透過該系統而是用自己寫的一支程式
來自動完成動作?

以下就介紹 Remote Post 來完成我們的懶人計畫。

以前在寫ASP的時候,可以在 form 裡面選擇 Action ,也就是指定當
這個頁面被 submit 之後,要執行的程式是誰。可是在ASP.Net並沒有
提供這個方法讓我們直接使用。因為 XX.aspx  ,當他 submit 之後,
預設就是給 XX.aspx.cs 去執行。

所以,可以自行去創建一個新的 form ,並手動的去指定它的 Action 是誰。

[未完,詳細內容請看:詳細網址連結]

[參考網址]: Posting form data from ASP.NET page to another URL (建議下載作者原始檔回來練習一下,大有斬獲)

2008年10月16日 星期四

抓網路上的圖片

如果想要抓網路上的圖片下來,推薦一個不錯的類別:WebClient
下面範例,是將網路上的圖片抓下後,另存到 D 槽 的2.jpg


using System.Net;
using System.IO;

WebClient   oWebClient   =   new   WebClient();
oWebClient.DownloadFile( "http://bks4.books.google.com/book.jpg" , "d:\\2.jpg"); 
oWebClient.Dispose();

在 SQL 實作分頁效果




declare @pagesize nvarchar(20) 
declare @pageindex nvarchar(20)
set @pagesize='10' --每一頁呈現的資料筆數
set @pageindex='2' --要查詢的頁面索引(從0開始)

declare @sql nvarchar(2000)

-- 在 SQL 2005 提供了 ROW_NUMBER 函數,自動產生序號,如果是 SQL 2000,則需自行產生相類似的功能 (如註一)

select ROW_NUMBER() OVER(ORDER BY com_empno DESC) AS 'Row_Number',* 
into #tmp from common..comper 

set @sql='select Top '+@pagesize+' * from #tmp '
set @sql=@sql+'where Row_Number NOT IN ( '
set @sql=@sql+'select Top ('+@pagesize+'*'+@pageindex+')  Row_Number from #tmp )'

print @sql
exec (@sql)

select count(*) from common..comper 

drop table #tmp



-- 列印出 剛剛所執行的 SQL 語法

select Top 10 * from #tmp 
where 
Row_Number NOT IN 
( select Top (10*2)  Row_Number from #tmp )


#tmp 是我們自行整理過含有自動編號的資料集合
假如每個頁面要顯示10筆資料,一共有10個頁面,目前要顯示第3頁。
NOT IN (  )  這個括弧裡面所存的資料,是前2頁的資料, 
NOT IN (  )  正表示著要剔除前2頁的資料,
select To 10 ,則是剔除前2頁資料後,取最前面的10筆,也就會抓到我們所謂的第3頁資料。


會如此自討苦吃部是沒有原因的,當所要查詢的資料量很龐大時,不管是使用 DataGrid 還是 GridView,
都會直接將所查詢到的大量資料回傳到 Web AP,然後再將資料整理成USER所要看的HTML傳到USER的
瀏覽器。此時,除了等待之外,就是把頁面關掉,或上YAHOO新聞看看政經八卦了。

透過 SQL 自己實作分頁,可以大幅縮短使用者檢視大量查詢結果的時間,蠻有助益的。





註一: 
如果是在 SQL 2000,可以透過 IDENTITY(int,1,1) 來自動產生序號
select IDENTITY(int,1,1) AS 'Row_Number',* 
into #tmp from common..comper  ORDER BY com_empno DESC

在SP中接其他SP的回傳資料結果

一直都認為,在SP(Store Procedure)中若要去取得另一支SP的執行結果是件很困難的事。後來發現其實沒這麼難啦,只要事先建好一個暫存資料表,再把另一支 SP 的結果傳進暫存表即可。

以下是程式範例:

--建立暫存表
create table  #tmp(
com_cname nvarchar(20),
com_empno nvarchar(20),
com_empdept nvarchar(20),
com_empext nvarchar(20)
)

--將另一支SP (esp_comper_query ) 的執行結果存到暫存表
insert into #tmp
exec esp_comper_query '526278'

select * from #tmp

drop table #tmp

=====================
補充: 20090306
=====================
如果你採用這方式,但有另一支sp也是透過你寫的sp並傳回結果,則會出現
An INSERT EXEC statement cannot be nested.
所以要避免發生巢狀使用的方式。

2008年10月15日 星期三

取得 SP參數資料及型別

取得 SP 裡的輸入、輸出參數資料及型別。



關鍵字:

SP
Store Procedure 
SqlCommandBuilder.DeriveParameters
SqlParameter 

取得 DB 所有 SP 的名稱

SELECT name
FROM sysobjects
WHERE type = 'P' 

2008年10月8日 星期三

透過url去抓網頁資料回來

提供一段程式,可以透過 url 去將 url 所指定的網頁將網頁抓回並存成字串。
可以針對這回傳字串進行文字分析處理以取得我們想要的資訊。
#region Retrieves the HTML from the specified URL.
/// <summary>
/// Retrieves the HTML from the specified URL.
/// </summary>
/// <param name="pageUrl">URL of the web page to retrive HTML.</param>
/// <param name="timeoutSeconds">The timeout for the http request.</param>
/// <returns>Returns the retrived HTML.</returns>
public string GetPageHTML(string pageUrl, int timeoutSeconds)
{
 System.Net.WebResponse response = null;

 try
 {
     // Setup our Web request
     System.Net.WebRequest request = System.Net.WebRequest.Create(pageUrl);
     request.Timeout = timeoutSeconds * 1000;

     // Retrieve data from request
     response = request.GetResponse();

     System.IO.Stream streamReceive = response.GetResponseStream();
     System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");
     //System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("big5");
     //System.IO.StreamReader streamRead = new System.IO.StreamReader(streamReceive, System.Text.Encoding.Default);
     System.IO.StreamReader streamRead = new System.IO.StreamReader(streamReceive, System.Text.Encoding.UTF8);



     // return the retrieved HTML
     return streamRead.ReadToEnd();
 }
 catch (Exception ex)
 {
     // Error occured grabbing data, return empty string.
     //MessageBox.Show(this, "An error occurred while retrived the HTML content. " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     return "";
 }
 finally
 {
     // Check if exists, then close the response.
     if (response != null)
     {
         response.Close();
     }
 }
}
#endregion

// for test
protected void btnGet_Click(object sender, EventArgs e)
{
 string AA=GetPageHTML(txtURL.Text.Trim(), 100);
 txtResult.Text = AA;
}

關鍵字:
streamReceive
GetResponseStream
encoding
streamRead

參考:透過 HTML Agility Pack 抓網頁資料

Google Calendar 時區

最近在分析 Google Calendar 匯出 *.ics 時,發現裡面的時間,如:

DTSTART:20081006T230000Z

都跟實際的行事曆時間不同,事後發現,原來 Google 是使用 UTC 時間。而台灣的時區為 UTC+8,所以從Google所抓出的時間要加上8小時,才會是我們真正想要取得的時間。

註1:UTC+8 比協調世界時快8小時的時區

註2:協調世界時,又稱世界標準時間,簡稱UTC,從英文「Coordinated Universal Time」而來。

2008年10月7日 星期二

SQL語法 的 print

今天跟 lillian 找了一整天的 store procedure 與 EZ-Flower (真的一點都不Easy!),某一支 sp 特別奇怪,當單單執行這一支 sp 時,就沒問題,但透過別人來呼叫他,就會莫名的中斷程式執行,實在很火大。所以就在這支 sp 每一行都設了一個寫 Log 的指令。舉例來說,我一共設了10個寫 Log 的偵測點,如果這支 sp 正常完成執行,就會得到 10 個 Log 記錄,如果是出現在第6個 Log 之後就沒下文,可以推測實際上是在第6到第7個 log 之間發生了問題。我也是逼不得已才用這種笨方法的,無奈啊!


結果告訴我,程式竟然在 print 'xxxx' 出錯。原先在這支 sp ,充斥著古老前為了測試而留下來的 print 語法,沒想到今天卻成為兇手,但這結果真的很訝異。但在人證物證一應俱全的情況下,我也只能屈服了。真的是你,print。

2008年9月30日 星期二

清除資料庫 log

清除資料庫 log 的指令:

[dbname]:表示資料庫名稱

dump tran [dbname] with no_log

2008年9月3日 星期三

寬度設為零,firefox 瀏覽器卻還會顯示出來

在 firefox 或 Chrome 瀏覽器,如果將一個 Button 的 width 設為 0 (ex: width:0px),在IE 會正常的看不到東西,可是在 firefox 或 Chrome 卻老是多留了一些尾巴出來。這問題主要是因為 border-width 與 width 在 IE 與 firefox 或 Chrome 的解讀不同。一般說來,只要設定 width=0 ,IE 就會看不到任何東西了。但對 firefox 或 Chrome而言,卻有著兩個重要設定影響著畫面呈現:width 與 border-width。

在 firefox 或 Chrome 中,如果你設定 width=0,實際上還是有長度的。因為他預設是有填塞空白的,這裡不能將這填塞空白與 border-width 畫上等號,反到要視為 padding的概念。所以,如果你是希望呈現 width=0 的效果,除了設定width外,還要加上 padding:0 。

另一個容易忽略的地方,則是 border-width。因為 firefox 或 Chrome 對於 border-width 都有預設值,而且是 2 不是 0 ,若是忽略不去設定,則外框還是會跑出來的。

範例:

<input id="btnNone" style="width: 0px; padding:0;border-width:0px" onclick="return

false;" type="submit" value="btnNone" />


關鍵字:隱藏、hidden、visible

2008年8月20日 星期三

SQL 中文排序結果

在 SQL 查詢結果做排序時,如果排序欄位的內容為中文字,運氣不好時會發現,不見得是根據筆畫比較少的來排。這問題,極可能是跟 DB 的定序預設值有關,也就是說,他的排序方式並非我們所認為的筆劃排序。這時,可以透過轉換定序的方式來解決。

convert(nvarchar(max), code_valuedesc) COLLATE Chinese_Taiwan_Stroke_CS_AS tech_domain_name

利用 convert 搭配指定定序 即可完成。

2008年7月28日 星期一

如何輸入多筆後再一起記錄到DataBase

拜讀 AllenKuo所精心製作的教學介紹,實在不忍直接偷貼過來,還請看官移駕到原網站欣賞。他在介紹影片中所使用的是 .Net 1.1 GrideView + CollectionBase 來解,但在後面的留言中提到,.Net 2.0 可以利用泛型的類別來完成他。所以自己也笨笨的練習了一下,並將幾個在實作中出槌的小地方註解了一下。

AllenKuo 教學網址

個人心得筆記網址

泛型排序需求

關鍵字:
序列化,RowDeleting,泛型 List<t> ,排序


2008年7月23日 星期三

Professional ASP.NET 2.0 AJAX


程式碼下載網址:[Wrox]
勘誤表:[Wrox]
作者 Dan Wahlin 的 部落格一 部落格二


這本書在Chapter 4 的範例有許多不正確的地方,可以參考作者程式碼中的範例。

延伸閱讀:
01. 在 Dan 的部落格提到 Silverlight 2.0 蠻不錯的介紹。[網址]
02. 免費的 ASP.Net 2.0 介紹。[網址]
03. Silverlight 2.0 安裝注意事項。[網址]
04. 其他相關 Silverlight 功能介紹。[網址]

處理在 GridView 自定控制項觸發事件無法執行的問題

在GridView裡,常常會透過 ItemTemplate 放一些我們所需要的控制項。舉 DropDownList 為例,我們可能會在這個 DropDownList 裡放兩個值,A 與 B 。假設每次的選擇都會需要觸發 PostBack 以利我們做後續動作,所以除了將這個 DropDownList 的 AutoPostBack 設為 True 之外,還會在 .cs 程式裡寫 :



protected override void OnPreRender(EventArgs e)

{
if (!IsPostBack)
{
gv_coorgcd.DataSource = (DataTable)ViewState["tmpTable"];
gv_coorgcd.DataBind();
}
base.OnPreRender(e);
}

protected void gv_coorgcd_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Control ctl=null;
ctl = e.Row.FindControl("ddl_orgtype");
if (ctl != null)
{
DropDownList ddl_orgtype = (DropDownList)ctl;
ddl_orgtype.SelectedIndexChanged += new
EventHandler(ddl_orgtype_SelectedIndexChanged);
}
}
}

protected void ddl_orgtype_SelectedIndexChanged(object sender, EventArgs e)
{
int rowindex = ((GridViewRow) (((DropDownList) sender ).NamingContainer )).RowIndex;
}

這程式裡隱含了很大的問題,但不容易被發現。從 覆載 OnPreRender( ) 來看,只有在第一次進入這個頁面時,才會去執行 gv (GrideView) 的資料繫結,並執行到 gv_coorgcd_RowDataBound(),也因此為 ddl_orgtype 註冊了 SelectedIndexChanged 事件。

然而,當 USER 觸發下拉清單 ddl_orgtype 觸發了 PostBack 後,這次並不會再執行 gv_coorgcd.DataBind(),也不會註冊 SelectedIndexChanged 事件,所以你會發現,ddl_orgtype_SelectedIndexChanged 根本就不再有機會被呼叫。

要解決這問題,目前有兩個方法,分別介紹一下:

方法一:
比較簡單直接。就是將註冊 ddl_orgtype 的 SelectedIndexChanged 事件,改由 .aspx 去寫,而不是原先的 .cs 。 所以,我們可以在 aspx 中寫入以下的程式:

<asp:GridView ID="gv_coorgcd" runat="server" AutoGenerateColumns="False"
OnRowDataBound="gv_coorgcd_RowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="ddl_orgtype" runat="server" AutoPostBack="true"
OnTextChanged="ddl_orgtype_SelectedIndexChanged" >
<asp:ListItem Text="院內" Value="1" Selected="true"></asp:ListItem>
<asp:ListItem Text="院外" Value="2" ></asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

注意囉!就是 OnTextChanged="ddl_orgtype_SelectedIndexChanged" 。我們直接將這事件註冊在這個物件的預設宣告裡,就不用在 .cs 透過程式動態去新增了。

方法二:
雖然在第二次進入頁面時(IsPostBack)沒有再重新繫結 gv_coorgcd,但卻可以知道這次的 PostBack 是由誰所觸發。我們可以據此來決定後面所要執行的動作。

所以,可以在 OnPreRender( ) 事件加上下面的程式:
protected override void OnPreRender(EventArgs e)
{
if (!IsPostBack)
{
gv_coorgcd.DataSource = (DataTable)ViewState["tmpTable"];
gv_coorgcd.DataBind();
}
else
{
string post_target = Request.Form["__EVENTTARGET"];
if (post_target != null)
{
if (post_target.Contains("ddl_orgtype"))
{
//Do something about ddl_orgtype SelectedIndexChanged
}
}
}
base.OnPreRender(e);
}

透過 Request.Form["__EVENTTARGET"] 就可以取得觸發 PostBack 的始作俑者了。

當然,個人是偏好第一種方法,簡單實用又大方。

2008年7月16日 星期三

最後的演講

摘要:
  • 別忘了準備對別人有利的方案,這樣別人才會更願意跟你打交道。
  • 只要把聰明的人講過的話自己拿來講一遍,就能夠讓自己看起來也很聰明。
  • 專注於當下,不去想未來那些負面的事情。我們如果每天都把時間花在為明天提心吊膽,這樣是沒有幫助的。
  • 有太多人都經常抱怨自己人生中的各種問題。我向來認為,你如果願意把抱怨的力氣拿出十分之一用在解決問題上,一定不免大吃一驚,發現事情原來沒有你想像的那麼糟。
  • 你如果沒有得到你想要的東西,至少得到了經驗。失敗不但是可以接授的,而且經常還是人生不可或缺的要素。
  • 你如果比別人花更多時間工作,那麼你在多做的這些時間裡就會對自己的工作更加精通。這樣一來,你就可能變得更有效率、更有能力,甚至更快樂。付出努力就像是銀行的複利,你獲得的獎賞會累積得很快。
  • 想要什麼東西,開口問就是了。不用怕,獲得肯定答案的機會,一定比你想像的還要頻繁。
  • 布魯克斯定律:一項軟體專案的時程如果已經落後,增加人力只會造成落後程度更嚴重。

在 GridView 的內容呈現三位一撇的樣式

如果在 GridView遇到金錢格式的內容,可以直接在 GrideView 的 裡面直接設定就可完成。只需將上 DataFormatString="{0:#,##0}" HtmlEncode="False"

如果只有設定 DataFormatString 是沒有效果的,所以別忘了加上 HtmlEncode="False"

<asp:BoundField HeaderText="計畫經費(仟元)" DataFormatString="{0:#,##0}" HtmlEncode="False"
DataField="org_ordinaryl_fee2" ></asp:BoundField>

參考網址:網址一

補充[20090422]:
如果是使用 ItemTemplate 且使用 Bind 的方式繫結資料,也可以採用資料格式設定方法。



//取到小數第二位
<ItemTemplate >
<asp:Label ID="lb_estipower" runat="server" Text='<%# Bind("pp_estipower3","{0:#.00}") %>' ></asp:Label>
</ItemTemplate>

在 DataView 裡新增一筆紀錄的方法

在 DataView 裡新增一筆紀錄的方法的範例:


DataView dv_emper = (DataView)ds_emper.Select(new DataSourceSelectArguments());
dv_emper.AllowNew = true;
DataRowView newRow = dv_emper.AddNew();
newRow["pem_id"] = "0";
newRow["pem_emper"] = dv_emper[0]["pp_planer"];
newRow["pem_empdept"] = dv_emper[0]["pp_planer_dept"];
newRow["pem_empext"] = dv_emper[0]["pp_planerext"];
newRow["pem_sign_right"] = dv_emper[0]["pp_sign_right"];
newRow.EndEdit();

避免URL網址後面被亂塞資料

偵測頁面的參數,是否存在惡意程式碼,如: 符號 %

透過 Request.Params.Count 取得畫面所有參數,
這些參數,包含著URL後面所串接的所有資訊。
可以寫個簡單的迴圈,去查每個參數是否包含了惡意程式碼符號。

protected void Button2_Click(object sender, EventArgs e)
{
bool bAlert = false;

StringBuilder str = new StringBuilder();
for (int i = 0; i < Request.Params.Count; i++) { str.Append(string.Format("{1}:{0} ",Request.Params[i].ToString(),i)); if (Request.Params[i].ToString().Contains("%")) bAlert = true; } Label1.Text=str.ToString(); if (bAlert) { Label1.Text = Label1.Text + " 偵測到惡意程式碼!"; } } PS:可以將這判斷方法寫成一個類別,並讓每一個頁面去繼承這個類別。
程式碼參考
特殊字元參考

2008年7月14日 星期一

__doPostBack 出不來?

想要透過 javascript 直接去產生 postback 效果,可以直接呼叫 __doPostBack來完成。但我們有時會發生javascript錯誤:必須要有物件。
這會讓我們很困擾,頁面上有時會自動產生 __doPostBack,有時則不會,是根據心情的嗎!? 網友有提供一個方法,保証可以產生出 __doPostBack ,就是:GetPostBackEventReference( )

舉例說,我的頁面有一個控制項,就用最沒什麼用的 Label 好了,只要在 page_load 事件裡,加上

this.GetPostBackEventReference(this.label_name);

保証會讓你偷笑。

參考網址:網址一

2008年7月8日 星期二

javascript 判斷GridView的資料筆數

GridView的特性,是有值的話,就會 Render 到網頁上,我們就可以用一般的方法去存取它。但如果沒有值,他就不會 Render到網頁上,所以這個物件就會是 NULL。於是,當我們想透過 javascript 去操作時,需要特別去處理沒有值的情況。


<script language="javascript" type="text/javascript">
function CheckItem(obj)
{
 var o = document.getElementById(obj);
 if(o)
 {
  var oCount=o.rows.length;
  alert(oCount);
 }
 else
  alert('No data');


 return false;
}
</script>


//呼叫判斷 GridView 是否有值

Button1.OnClientClick = string.Format("return CheckItem('{0}'); ",
GridView1.ClientID);


如果想要取出 DataGrid的值,可以用下面方法:


alert(document.all.GridView1.rows(1).cells(3).innerText);

參考來源一

參考來源二

參考來源三

2008年6月26日 星期四

silverlight 在 windows server 2003 的問題

當要部署 silverlight 在 server 2003 時,發現作品都無法出來,畫面一片漆黑,見鬼了,明明是可以執行的,卻這樣子冷冷的不回應。

原來,是 server 2003 預設是不支援 .xaml 檔案的 MIME 格式。所以,就要手動去 IIS 上設定了。

到 IIS->預設網站->內容->HTTP 標頭->MIME 類型->新增

在副檔名、MIME類型 欄位都填入 .xaml 即可。


參考網址:
1. silverlight question
2. panda & polly 的努力

2008年6月12日 星期四

Store Procedure 的預設值

如果想要在 Store Procedure 裡面使用預設的參數,可以在參數宣告後用 = 號來指定。如此,日後呼叫這支 Store Procedure 時,就可以省略一些參數的輸入或是只需要輸入幾個特定參數就可以。


/* Store Procedure 範例 */

CREATE PROCEDURE [dbo].[pr_test]
@p1 nvarchar(20) = '11',
@p2 nvarchar(20) = '22',
@p3 nvarchar(20) = '33'
AS
Begin
print @p1
print @p2
print @p3
SELECT * FROM mytable
End


/* Store Procedure 呼叫方式 */


-- 1.不傳任何參數
exec pr_test

-- 2.只想改變第2個參數[這時,就需要透過 default 關鍵字來填不想改變的部份了]
exec pr_test default,'我是好人',default

-- 3.透過指定的方式
exec pr_test @p2='我是好人'

參考網址:
http://www.dotblogs.com.tw/ajun/archive/2008/04/01/2397.aspx

2008年6月4日 星期三

PageRequestManager

每一個使用 ASP.NET AJAX 的 .aspx 頁面都會放一個 ScriptManager 控制項。這控制項裡存放著控制 UpdatePanel 所需的 javascript 函式。不管是 ScriptManager 還是 UpdatePanel ,背後都還有一個老闆在監督著,這就是 PageRequestManager。

擔當非同步處理的 PageRequestManager,也是有所謂的生命週期。他共有5種:

Event 順序Event 說明
1. initializeRequestRaised before processing of the asynchronous request starts. You can use this event to cancel a postback.
2. beginRequestRaised before processing of an asynchronous postback starts and the postback is sent to the server. You can use this event to set request headers or to begin an animation that indicates that the page is processing.
3. pageLoadingRaised after the response from the server to an asynchronous postback is received but before any content on the page is updated. You can use this event to provide a custom transition effect for updated content.
4. pageLoadedRaised after all content on the page is refreshed, as a result of either a synchronous or an asynchronous postback. You can use this event to provide a custom transition effect for updated content.
5. endRequestRaised after an asynchronous postback is finished and control has been returned to the browser. You can use this event to provide a notification to users or to log errors.



攔PageRequestManager5種生命週期的方法:

<script type="text/javascript">
var prm=Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(initializeRequest);
prm.add_beginRequest(beginRequest);
prm.add_pageLoading(pageLoading);
prm.add_pageLoaded(pageLoaded);
prm.add_endRequest(endRequest);

function initializeRequest(sender, initializeRequestEventArgs)
{
alert('initialize function');
}

function beginRequest(sender, beginRequestEventArgs)
{
alert('beginRequest function');
}

function pageLoading(sender, pageLoadingEventArgs)
{
alert('pageLoading function');
}

function pageLoaded(sender, pageLoadedEventArgs)
{
alert('pageLoaded function');
}

function endRequest(sender, endRequestEventArgs)
{
alert('endRequest function');
}
</script>

[程式參考]

2008年5月30日 星期五

觸發 post back 固定畫面位置

除了使用 SmartNavigation="true" 來達到這個目的外,
另外一個就是自行撰寫 JS 來處理。

介紹一個網路上常被推薦的方法,但要特別注意,.Net 2005 webform 預設產生的 DOCTYPE html PUBLIC 是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
這新的定義,不支援 onscroll 事件,導致程式不能正確保留目前 scroll bar 的位置,所以沒辦法呈現我們想要的效果。

於是,我們要將
DOCTYPE html PUBLIC 改成舊的
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

另外將整理過的程式放在連結中,請參考連結。

程式連結

這個範例不需要再去 aspx 頁面手動建立一個隱藏物件,也不需要去設定 Body ,只要複製貼上到你的 .cs 就可以了。並將觸發事件放在 onPageLoad( )




2008年5月27日 星期二

字母字串遞增

英文字母遞增,例如: A -> B
如果只有限定一個字母,這情況是比較簡單。
但如果需要 Z - > AA, EE-> EF 情況時,就要考慮到進位。

進位的設計方式,我是透過 ArrayList 的類別,因為它可以讓我插入新的元素到任何位置,所以當從 n 位數 增加到 n+1 位數情況時,就可以比較方便。


將測試的可行程式整理如連結所示:

詳細連結

2008年5月26日 星期一

SqlDataSource 使用 web.config 的 appSettings

SqlDataSource 預設會使用 Web.Config <connectionStrings > 裡的設定,但在過去 .Net 1.1,有許多的習慣是將資料設定在 < appSettings > 裡面。如果也想要在 SqlDataSource使用 < appSettings > 的資訊,則可以透過
<%$ appSettings:CNContract %>
來完成。

舉例來說,原先是叫用 connectionStrings
ConnectionString="<%$ ConnectionStrings:engagedbConnectionString %>"
現在可以改成叫用 appSettings
ConnectionString="<%$ appSettings:CNContract %>"

2008年5月14日 星期三

透過 ThreadPool 執行 FreeSMTP 發信

透過 Thread 可以協助我們更有效率的處理耗時的工作,但每次都要因此去建立並維護自己的 Thread,不僅增加了程式碼的複雜度,有時還會有用大砲打小鳥的嫌疑。

在.Net 1.1 開始,就提供了 ThreadPool 的類別,讓 .Net 透過自己事先建立好的 Thread 並依據工作佇列自行去安排每個 Thread 要執行的功做。尤其是只做一次的工作,透過 ThreadPool 來完成會更有效率。

以下介紹利用 ThreadPool 來執行 FreeSMTP 的發信功能。

先建立一個收集發信資訊的類別:

public class MailObj
{
public string mail_From = string.Empty;
public string mail_To = string.Empty;
public string mail_Content = string.Empty;
public string mail_Subject = string.Empty;
public string mail_SMTP = string.Empty;

}


而發信的動作如下:
public void ThreadProc(Object stateInfo)
{

MailObj oM = (MailObj)stateInfo;

EmailMessage mail = null;
SMTP smtp = null;


mail = new EmailMessage();
//寄件者
mail.From.Email = oM.mail_From;

//收件者
mail.Recipients.Add(oM.mail_To, "收件人", RecipientType.To);

//主題
mail.Subject = oM.mail_Subject;

//mail 編碼
mail.CharsetEncoding = System.Text.Encoding.GetEncoding("BIG5");

//內容
BodyPart oBody = new BodyPart();
oBody.Body = oM.mail_Content;
mail.BodyParts.Add(oBody);

//SMTP
smtp = new SMTP(oM.mail_SMTP);


//執行發信
try
{
smtp.Send(mail);
}
catch (Exception ex)
{
//攔截錯誤訊息
}
}

最後,加上USER點選送信按鈕後觸發的事件:
protected void MailThread_Click(object sender, EventArgs e)
{
//將 thread 所需要的資訊存到一個物件 MailObj
MailObj oM = new MailObj();
oM.mail_From = txtComeFrom.Text;
oM.mail_To = txtTo.Text;
oM.mail_Content = txtContent.Text;
oM.mail_Subject = txtSubject.Text;
oM.mail_SMTP = txtSMTP.Text;



//指定要加入的工作
WaitCallback workItem = new WaitCallback(ThreadProc);

//將工作加入到 ThreadPool

// QueueUserWorkItem 的第一個參數,是指定要執行的方法名稱
// 第二個參數,則是用來設定傳值物件

if (!ThreadPool.QueueUserWorkItem(workItem, oM))
{
HttpContext.Current.Response.Write("錯誤訊息:無法排入 Thread Pool!");

}

}

詳細程式參考

2008年5月9日 星期五

javascript 數字字串三位一撇

function moneyFormat(str)
{
if(str.length<=3) return str; else return moneyFormat(str.substr(0,str.length-3))+","+(str.substr(str.length-3));
}


詳細程式:http://docs.google.com/Doc?id=dfs2h99g_55gpws2969

參考:http://blog.blueshop.com.tw/abgne/archive/2005/12/12/15492.aspx

javascript 把數字轉為字串

a = a+'' // This converts a to string
b += '' // This converts b to string

參考:http://www.javascripter.net/faq/converti.htm

javascript 中 outerHTML 、innerHTML、innerTEXT 三者的區别


參考網址:http://blog.52z.com/post/304.html

2008年5月7日 星期三

RadioButtonList 小細節

除了透過 RadioButtonList 產生 Radio 選項群組之外,
我們也可以透過 許多 RadioButton 組合起來達成同樣
的目的,只是要在每個 RadioButton 設定共同的 GroupName。

當使用多個RadioButton時,如果你同時又設定了某個RadionButton
的預設選取為 True 時,這時你如果在程式過程中也去改變RadioButton
的選取,則會發生最後呈現的結果並非是你程式所要求的,反而變為
最初的預設選取項目了。

這原因,是因為我們所設定的預設值,執行的時機點比我們程式中觸發
的時間還要晚,造成最後永遠呈現為最初的預設值。

為了避免這現象發生,在程式中先行去更改每個 RadioButton,並將他的
選取狀態都改成 false。

程式參考

2008年5月4日 星期日

ASP.NET AJAX Extensions 1.0

一改過去專注於 server 端的功能,微軟在 .net 2.0 開始加強與 client 端的整合。為了讓開發人員更有效率的開發 Ajax 程式,ASP.NET AJAX Extensions 1.0 封裝了相關開發套件,讓開發人員像是往常使用 Server Control 般的使用這些新元件。

但這項新功能,並非在你安裝完 VS2005之後就有,需要到 ASP.Net Ajax 網站去下載,
網址為:http://www.asp.net/ajax/downloads/

當下載並安裝完 ASP.NET AJAX Extensions 1.0 ,日後當你執行【加入】-【新網站】時,會多一個 【ASP.NET AJAX-Enabled Web Site】,你的每個 WebForm 新頁面,在設計頁面就會多一個 ScriptManager 控制項。我們可以將這個 ScriptManager視為所有 Ajax 技術會使用到的相關 JavaScript 定義集合。也就是因為這是個定義集合,所以需要將它放置在整個頁面的最前面,如此當後面有叫用 Ajax 方法時,才能夠找到對應的函式。如果您沒注意到這個小地方,那你會得到一個下面的錯誤訊息:

The control with ID 'UpdatePanel1' requires a ScriptManager on the page. The ScriptManager must appear before any controls that need it.

當然,在實際的開發專案裡,可能原先並沒有一開始就採用 【ASP.NET AJAX-Enabled Web Site】,而是一般的 【ASP.Net 網站】。如果想加入 Ajax 功能,則需要留意下面幾點:

1.Copy 3個 Ajax dll 檔並設成參考。Web.Config 會增加三個 assembly。這3個檔案是安裝 ASP.NET AJAX Extensions 1.0 時,自動產生在您的電腦上,可以透過Windows的【程式集】找到他們。

AJAXExtensionsToolbox.dll
System.Web.Extensions.Design.dll
System.Web.Extensions.dll

2.Web.Config 修改:[放大檢視] ← Copy 專用,避免複製到網頁的控制碼

在 <System.web></System.web>區間加上:

<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>

這資料可以參考【ASP.NET AJAX-Enabled Web Site】的 web.config 設定檔。如果您在 Web.Config 沒有加上這設定,會出現
'Sys'未被定義 的 javascript 錯誤訊息。

2008年5月2日 星期五

GridView Header 的折行

當 GridView 的 Header 文字太長,需要折行時,會發現有時候用 <BR>有效,有時候卻無效。細究原因,要注意該欄位是否為 TemplateField 或是 BoundField。如果是 BoundField,則會完完整整的呈現 HeaderText 內容。相反的,TemplateField 則是會支援 HTML 語法,也就可以透過 <BR> 呈現強迫折行的效果。

.Net 2.0 SqlDataSource 使用 StoreProcedure 注意事項

雖然在 .Net 2.0 提供了一個好用的 SqlDataSource 元件,但實際開發的經驗裡發現,當資料來源使用的是 StoreProcedure時,如果所傳入的參數為空白,則會自動被轉成 NULL。當 SQL Server 收到時,會自動忽略掉這個指令而被去執行,同時也不會發出任何的錯誤訊息。

為了防止這現象發生,在 .Net 的 SqlDataSource 呼叫 StoreProcedure 時,於加入參數的地方多一段程式來解決:

SqlDataSource_Do_import.SelectParameters.Clear();
SqlDataSource_Do_import.SelectParameters.Add("senos", str_senos);
SqlDataSource_Do_import.SelectParameters.Add("keyinEmpno", sso.empNo);
SqlDataSource_Do_import.SelectParameters.Add("keyinEmpname", sso.empName);

//將所有空字串都設成不轉為NULL
for (int iPa = 0; iPa <>
SqlDataSource_Do_import.SelectParameters[iPa].ConvertEmptyStringToNull = false;

SqlDataSource_Do_import.Select(new DataSourceSelectArguments());

2008年4月29日 星期二

checkbox 全選或取消

介紹一個將 checkbox 全選或是取消的方法。
關鍵的 js 語法如下:




function chkall(input1,input2)
{
var objForm = document.forms[input1];
var objLen = objForm.length;
for (var iCount = 0; iCount < objLen; iCount++)
{  
if (input2 == true)  
{   
if (objForm.elements[iCount].type == "checkbox")
{  
objForm.elements[iCount].checked = true;  
}  
}
else
{  
if (objForm.elements[iCount].type == "checkbox")  
{
objForm.elements[iCount].checked = false;
}
}
}
}

這方法的優點,是會將 form 名稱當參數傳入。在ASP.Net 2.0可以發現,如果你有使用 MasterPage時,預設的 form 名稱會變成 aspnetForm。 缺點是,這是會影響目前畫面上的所有 checkbox,如果你的畫面上出現的都是你想要變更的 checkbox,那就無妨,否則還需要作一些加工才能符合需求。

詳細程式碼:[Here]


在這個範例中,分別用了2個 GridView,其中一個採用 預設的 checkbox ServerControl ,另一個則是 Html checkbox,當畫面上有個觸發 PostBack 的按鈕執行後,只剩下 ServerControl 依然能夠維持目前所勾選的狀態。

2008年4月26日 星期六

image 出現手指的游標

<image> 是個很簡單的物件。有時候我們可能只是放一個按鈕圖示而已。但希望當滑鼠游標移到按鈕上頭時,要能變成手指的圖示,這時候,可以透過 javascript去設定 onmouseover的屬性來達成。


ex:

img.Attributes.Add("onmouseover", "style.cursor='pointer'");

在 IE 4/5 版本,是支援 "style.cursor='hand'" 當作是『手指』的游標符號。但後來 W3C 公佈的標準裡採用 pointer 當作手指的符號,所以IE 6 以後的版本也可使用 pointer 來指定手指游標。目前的 FireFox 或 Google 瀏覽器則都是採用 pointer。

附上常見 游標符號:



CSS 樣式顯現結果
{ cursor: crosshair; }
滑鼠游標圖案是 crosshair
{ cursor: pointer; }
滑鼠游標圖案是 pointer
{ cursor: text; }
滑鼠游標圖案是 text
{ cursor: move; }
滑鼠游標圖案是 move
{ cursor: wait; }
滑鼠游標圖案是 wait
{ cursor: help; }
滑鼠游標圖案是 help
{ cursor: progress; }
滑鼠游標圖案是 progress
{ cursor: not-allowed; }
滑鼠游標圖案是 not-allowed
{ cursor: no-drop; }
滑鼠游標圖案是 no-drop
{ cursor: no-vertical-text; }
滑鼠游標圖案是 no-vertical-text
{ cursor: all-scroll; }
滑鼠游標圖案是 all-scroll
{ cursor: col-resize; }
滑鼠游標圖案是 col-resize
{ cursor: row-resize; }
滑鼠游標圖案是 row-resize
{ cursor: e-resize; }
滑鼠游標圖案是 e-resize
{ cursor: ne-resize; }
滑鼠游標圖案是 ne-resize
{ cursor: n-resize; }
滑鼠游標圖案是 n-resize
{ cursor: nw-resize; }
滑鼠游標圖案是 nw-resize
{ cursor: w-resize; }
滑鼠游標圖案是 w-resize
{ cursor: sw-resize; }
滑鼠游標圖案是 sw-resize
{ cursor: s-resize; }
滑鼠游標圖案是 s-resize
{ cursor: se-resize; }
滑鼠游標圖案是 se-resize

我們也可以自定游標圖案。自定圖案的語法是:
{ cursor: url(圖案網址); }

更新日期:20090701

在 Server Control 裡使用 資源檔

Ref :http://aspalliance.com/articleViewer.aspx?aId=726&pId=-1

以往在設計 Server Control 元件時,常常會為了需要嵌入圖片或是JavaScript檔而煩惱。透過 .Net 2.0所提供的新方法,讓我們在設計自行研發的元件時,更有彈性。

一、如何建立 Server Control。
01.先建立一個測試專案:ServerControlTest

02.在ServerControlTest專案中,建立一個資源檔(Resource) .resx

03.開啟 Resource.resx,選擇加入資源頁籤,並加入你的檔案。可以是圖檔、文字檔。範例中,我同時加入圖片檔(icon-find.gif)、Javascript(jsMMS.js)檔以及字串 test來說明。

04.由於我們希望將圖片、文字檔都能夠包在未來所產生的元件裡,不再需要透過連結方式來存取,所以要記得分別點選方案總管下的Resource資料夾裡的 icon-find.gif、jsMMS.js,將建置動作改為『內嵌資源』。

05.為了讓元件能夠存取資源檔裡所加入的檔案,可以到方案總管,看到專案裡的屬性頁籤資料夾,找到 AssemblyInfo.cs 檔,打開並編輯。

[詳細程式碼]

加入兩行:
[assembly: System.Web.UI.WebResource("ServerControlTest.Resources.icon-find.gif", "img/gif")]
[assembly: System.Web.UI.WebResource("ServerControlTest.Resources.jsMMS.js", "text/js")]

透過WebResource( v1,v2),定義了要去抓取資源檔的位置與檔案型態。
WebResource(v1,v2) 第一個參數,是一個包含完整的NameSpace名稱與資源檔所在路徑與檔名。[NameSpace].[路徑].[檔名],對照目前的範例,就是ServerControlTest.Resources.icon-find.gif。第二個參數則是檔案的型態定義:img/gif、text/js



二、如何使用 Resource。

01.在方案總管裡,我們需要加入兩個參考(Reference):
System.Web
System.Drawing


02.加入一個新的類別 SCTest01.cs [詳細程式碼]
並在其 using 的區塊,新增兩個 :
using System.Web.UI;
using System.ComponentModel;

我們將這個類別(SCTest01.cs)去繼承 Control 物件

03.覆寫 Render方法
protected override void Render(HtmlTextWriter writer)

首先建立一個 Image 物件,而這 Image物件的圖片來源,則是透過事先存在資源檔的圖片當作其來源。抓取資源檔的方法為:GetWebResourceUrl( )。
在這個方法裡,有兩個參數,第一個是要指定資源檔的類型,我們可以傳入 this.GetType()。第二個參數,則是要傳入資源名稱。這裡需特別注意的地方,是要傳入包含完整的NameSpace名稱與資源檔所在路徑與檔名。[NameSpace].[路徑].[檔名],對照目前的範例,就是ServerControlTest.Resources.icon-find.gif

介紹了抓圖檔之後,再提抓資源檔裡的字串方法,以Image.ToolTip為例。這個資源檔裡的字串,就相對簡單些了,只需要透過資源檔變數的屬性,就可以完成設定的動作。
[資源檔變數].[字串名稱]
Resource1.Test

為了讓這個圖示比較完美些,也在程式中加入了一個 onmouseover 的處理,讓游標移到 Image 物件上時,能夠變成『手指』的樣子。

此外,加入了 User 壓下按鈕時會觸發 JavaScript 的事件。

img.Attributes["onclick"] = "showWelcome();";

而 showWelcome() 正是我們事先定義在資源檔裡的 JavaScript。

最後,則是將設定好的 Image 物件加入目前的 控制項物件裡。

三、陷阱。

大部分的Server Control,都是透過覆寫 Render( ) 方法來完成。然而現在所介紹的資源檔,在使用字串、圖片等,都沒有問題。唯一有問題的,是 javascript。如果我們在 Render()方法裡去註冊事先定義在資源檔裡的 javascript,則會發生當 USER 觸發了按鈕而啟動 javascript方法時,因為 javascript尚未產生出來而發生錯誤的現象。為了避免這問題,就需要將註冊 javascript的動作提前,例如範例中,我將註冊的時間點提前在 OnInit( ) 的地方。

ps:可以參考先前 Server Control 生命週期 的介紹

四、使用 Server Control

01.先建立一個網站,MyTestWeb
02.在工具箱裡的一般頁籤,按滑鼠右鍵,點選『選擇項目』。

03.點選『瀏覽』按鈕,並挑選剛剛 Server Control 專案所產生的 dll 檔,確定後,就會在工具箱多了一個我們自訂的元件。

04.將我們自訂的元件,拖拉至 .aspx 頁面,即完成 Server Control 的叫用。


參考程式碼:\\3probe-server\RD2\Document\Program\Server Control\ServerControlTest.rar

2008年4月25日 星期五

呼叫 User Control 所定義的方法

一個 User Control,裡面大多會自己定義了許多的方法,當主頁面加入了這個 User Control之後,並想要呼叫 User Control 的方法,[Professional ASP.NET Server Controls]作者有介紹了一篇不錯的用法:



假設 User Control 定義了:
public string ShowUCMsgWithSomeString(string str)
{
return string.Format("This message is from usercontrol and with some strign :{0}", str);
}

則主頁呼叫的方式為:


// 待會給 MethodInfo 使用
using System.Reflection;

//抓目前頁面上的 UserControl
Control ctl = Page.FindControl("MyUC1");

//取得執行個體的 Type
Type ctlType = ctl.GetType();


//取得已定義的方法
MethodInfo ctlMethod = ctlType.GetMethod("ShowUCMsgWithSomeString");

//取得已定義方法的參數
ParameterInfo[] p = ctlMethod.GetParameters();

//輸入參數宣告
Object[] parameters = new Object[p.Length];
string strPassInfo = "Hello my usercontrol!";
parameters[0] = strPassInfo;

//執行 UserControl 所定義的方法
lbMsg2.Text = ctlMethod.Invoke(ctl, parameters).ToString();

程式參考:
\\3probe-server\RD2\Document\Program\User Control\UCTest01.zip

2008年4月23日 星期三

技能清單

ASP.Net
SQL
  • Store-Procedure
  • Transaction
  • Join
  • String函數

HTML
  • ifreame


JavaScript


Reporting Service
  • Layout Report
  • 透過WebService製作 PDF
  • SubReport


專案管理技巧
專案時程制定與檢視(PDCA:Plan-Do It-Check-Action)
陳頂立的PDCA

無法辨認的組態區段 authentication

最近有個 VS2005的專案,重新 Compiler時會出現
Web.Config【無法辨認的組態區段 authentication】
的錯誤訊息,檢查了該檔案並沒有任何拼錯的地方,
最後試著將IIS上的站台移除,並重新開啟專案,讓
VS2005幫我自動在IIS上重新建立一個虛擬站台,
同時,也將VSS暫時解除繫結,Compiler之後就正常了。

2008年3月21日 星期五

檔案下載或開啟時出現亂碼檔名

常常發現,不管是用 IE 或 FireFox 下載檔案,出現的檔名是亂碼。
下面介紹一個屬性設定,可以試試。

Response.HeaderEncoding = System.Text.Encoding.GetEncoding("big5");

透過設定 HeaderEncoding之後,可以將這問題解決掉。

完整的程式如後:

string strpath = "檔案路徑";
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("big5");
Response.AddHeader("content-disposition", "attachment;filename=" + "中文檔名");
Response.WriteFile(strpath);
Response.End();

Ref:http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/09/05/kb-open-and-download-file-in-chinese-filename.aspx


Ref:http://blog.miniasp.com/post/2008/04/ASPNET-Force-Download-File-and-deal-with-Chinese-Filename-correctly.aspx

[補充 20110920]
參閱保哥[ASP.NET 如何設定強制下載檔案並正確處理中文檔名的問題]這一篇文章,可以正確處理簡繁問題,也提供了不同瀏覽器的處理,非常值得參考。

[補充 20120704]
另一種選擇。
UrlPathEncode 用於檔案下載出現亂碼的問題
http://paladinprogram.blogspot.tw/2012/07/urlpathencode.html

GridView 在Firefox

GridView會自動增加一個 rules="all" 的 HTML 標籤,在 IE 瀏覽器是正常,但在 FireFox 瀏覽器,則會出現黑色框線。

解決之道,在於 GridLines = none ,到 GridView 控制項,找到 GridLines 屬性,並將他設成 none 就可以。

2008年3月18日 星期二

在ASP.NET 取得目前瀏覽器的URL

假設網頁位址為 http://localhost/ProjMngWeb/close/close_Main.aspx?seqsn=543

string strAbsoluteUri = Request.Url.AbsoluteUri;

strAbsoluteUri 的內容則為 http://localhost/ProjMngWeb/close/close_Main.aspx?seqsn=543

string [] arraySegments = Request.Url.Segments;

arraySegments 的內容則為 ["/" , "ProjMngWeb/" , "close/" , "close_Main.aspx"] 共4個維度

Bind DropDownList - SortedList

要繫結 DropDownList,一般可以用 DataSet 來完成。除此之外,可以使用 ArrayList 直當作他的資料來源,但缺點是需要 DropDownList 的 DataTextField 與 DataValueField 是一致。如果 DataTextField 與 DataValueField 真的不一樣的情況發生時,就需要使用 HashTable,然而,HashTable並不提供排序,結果可能不是我們想要的。因此,推薦另一個 SortedList 物件。

SortedList hEnd = new SortedList();
hEnd.Add("A","1");
hEnd.Add("B","2");
hEnd.Add("C","3");

ddlTimeStart.DataSource = hEnd;
ddlTimeStart.DataTextField = "key";
ddlTimeStart.DataValueField = "value";
ddlTimeStart.DataBind();

C#在客戶端和服務端操作Excel文件

REF:\\http://www.wangchao.net.cn/bbsdetail_149286.html

 一、在客戶端把數據導入到Excel文件步驟

  1、創建Excel
application
對象,打開或生成Excel文件

  //服務端創建StringBuilder對象

  
System.Text.StringBuilder sb=new System .Text .StringBuilder ();

   //指定客戶端執行語言

  sb.Append
("<Script Language=VBScript>");

   sb.Append
("<!--\r\n");

   sb.Append
("dim xls\r\n");

   //創建Excel
application
對象

   sb.Append
("Set xls=CreateObject(\"Excel.Application\")\r\n");

   //打開Excel文件

  sb.Append ("xls.WorkBooks.Open(C:\\MyExcel.xls)\r\n");

  2、選定工作表,把數據導入到Excel

  //選定欲操作的Excel

  sb.Append
("xls.Sheets(1).Select\r\n");

  //获得要操作数据表的行、列数

   int rows=dt.Rows.Count,cols=dt.Columns.Count
;

   //按行列将数据写入Excel

   for (int
j=brow+1;j<brow+cols ;j++)

   for (int i=bcol;i<bcol+rows
;i++)

 
 
sb.Append ("xls.Sheets(1).Cells(" +(j-1) + "," + (i)
+ ")=\"" + dt.Rows[i-bcol][j-brow].ToString ().Replace ("\"","'") + "\"\r\n");


   3、显示Excel文件

   sb.Append ("xls.visible=true\r\n");

   4、釋放創建的Excel
application
對象

   sb.Append
("set xls=nothing\r\n");

   sb.Append
("-->");

   sb.Append
("</script>");

  5、將代碼寫到客戶端

  
this.Page.RegisterClientScriptBlock("",sb.ToString ());

  二、在服務端操作Excel文件

  服務端操作Excel文件,是把Excel文件看作數據庫,把Excel工作表當作數據表

  1、創建連接並打開連接

  protected
System.Data .OleDb.OleDbConnection dbcnn;

  cnnstr="Provider=Microsoft.Jet.OLEDB.4.0;Extended
Properties=\"Excel 8.0;HDR=Yes;\";Data Source=C:\\MyExcel.xls”;

  dbcnn=new
OleDbConnection (cnnstr);

  dbcnn.Open
();

  2、創建OleDbCommand對象用來操作Excel文件

  protected
System.Data .OleDb .OleDbCommand dbcmd;

   dbcmd=new
OleDbCommand();

  
dbcmd.Connection =dbcnn;

  3、操作Excel文件

   //获得要操作数据表的行、列数

   rows=dt.Rows.Count
;

  
cols=dt.Columns.Count-1 ;

   //按行列将数据写入Excel文件Sheet1工作表

   for(int i=0;i<rows;i++)

   {

   olestr="
insert into [Sheet1$] values(";

   for(int
j=0;j<cols;j++)

   olestr=olestr+"'"+dt.Rows[i][j].ToString
()+"',";

   olestr+="'"+Convert.ToDecimal
(dt.Rows[i][cols].ToString ())+"')";

  
dbcmd.CommandText =olestr;

  
dbcmd.ExecuteNonQuery ();

   }

  4、釋放OleDbCommand對象、關閉連接

  dbcmd.Dispose
();

   dbcnn.Close
();

  5、可操作的SQL語句

  //建立名為punchdate的工作表,並指明子段類型。

  //創建工作表好處是可指定子段類型,否則都以字符串導出

   CREATE TABLE
punchdate(mno char(5), punchNum float)

   //插入新數據

   Insert into
punchdate(mno,punchNum) values(‘09’,9000)

   //更新數據

   Update
punchdate set punchNum=8000 where mno=’09’

  6、不可操作的SQL語句

  Delete from
punchdate

  7、注意連接子串

  //HDR=Yes
説明工作表第一行為子段名

  
"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel
8.0;HDR=Yes;\";Data Source=C:\\MyExcel.xls”

  //HDR=No
説明工作表沒有含子段名的行

  "Provider=Microsoft.Jet.OLEDB.4.0;Extended
Properties=\"Excel 8.0;HDR=No;\";Data Source=C:\\MyExcel.xls”

  8、注意對Web.config的設置

  刪除以下項目

   <identity
impersonate="true" />

  
或者這樣設置


   <identity
impersonate="false" />

  三、兩種方法的優缺點

  

  操作Excel文件方法

  優點

  缺點

  客戶端

  數據導入到Excel文件時,很靈活,可將數據填入任意指定的存儲格,定位到任意位置

  1、在客戶端生成ActiveX控件,要將站點設置成可信站點或對IE進行安全設置(降低了IE的安全性)

  2、對調用的Excel模板文件,用戶要有權讀寫

  3、在客戶端寫Excel文件速度比較慢

  服務端

  1、對調用的Excel模板文件,只要ASP.NET有權讀寫即可

  2、在服務端寫Excel文件速度比較快

  3、不要對IE進行特別設置

  對操作的文件只能當作數據庫操作,不夠靈活

  四、流输出

  原理:把數據填充到
DataGrid
,然後把DataGrid内容放到一個輸出流裏面,並指定輸出流類型為
Excel

  System.IO .StringWriter
sw =new System.IO.StringWriter();//
字符串流

  System.Web
.UI .HtmlTextWriter hw =new System.Web.UI.HtmlTextWriter(sw);//html

流,用字符串流作參數

  dg.RenderControl(hw);//DataGrid
流變成字符串流。

  Response.ContentType
="application/vnd.ms-excel";//
定義輸出流類型為
excel
流。關鍵語句。

  Response.ContentEncoding=System.Text.Encoding.GetEncoding("Big5");//指定編碼類型為大五碼

  Response.Write(sw.ToString());//輸出流

  Response.End();//結束

2008年3月17日 星期一

使用智慧段落選取-不夠智慧[=白癡]

習慣用【樣式與格式】的方法撰寫 Word 之後,發現有需要更改顏色、對齊方式等需求時, Word 會自動將整份文件都套用剛剛的調整,但我要改的並不是全部啊!

這時,就要拿出摳男的看家本領,在死不要錢的Google上找到解法:

到 工具-選項-編輯-使用智慧段落選取,將打勾拿掉就可以了。

Ref: http://office.microsoft.com/zh-tw/word/HA102362181028.aspx

2008年3月11日 星期二

IE 與 FireFox 開窗 討論

IE 與 FireFox 開窗

經測試,FireFox目前是沒辦法用獨占視窗開啟的。


參考:
http://blog.blueshop.com.tw/ajun/archive/2006/08/29/36797.aspx

使用這種開窗方式,要在 aspx 頁面 或是 Master 頁面加上

<% Response.Expires = 0; %>
不讓IE儲存網頁,不然會讀不到最新版異動

VS2005 document.all.XXX.value 會失效 [在 firefox]

在VS2005在firefox使用 javascript 語法 document.all.XXX.value 時會失效,主要原因是 aspx頁面預設套用的 DOCTYPE html PUBLIC 如下:



這個定義比以前的

更為嚴格。

所以如果要讓程式正常執行,需要改採 document.getElementById,或是更換 DOCTYPE html PUBLIC

Code Snippet titled [Method Stub - Body] failed to load

VS2005:
如果进行override操作时,提示: Code Snippet titled [Method Stub - Body] failed to load. Verify that refactoring snippets are recognized in the Code Snippet Manager and that the snippet files are valid on disk. 那说明指 定的Code Snippet块无法找到,解决办法很简单,只要重新导入Code Snippet块就行了。找到并打开Code Snippet Manager(Ctrl + K,Ctrl + B),然后选择要操作的语言(C#),用Add按钮导入两个默认的文件夹:Refactoring和Visual C#,这两个文件夹一般会在VS2005安装目录下的,如:C:\Program Files\Microsoft Visual Studio 8\VC#\Snippets\1033 ,如果有这两个文件夹,则先删除然后再导入。

轉載自:
http://www.cnblogs.com/ttinfo/archive/2007/04/26/727784.html

2008年3月7日 星期五

文件已儲存,但因儲存空間不足

WORD 存檔出現的錯誤

"文件已儲存,但因儲存空間不足,導致語音辨識資料遺失,不錄音時請務必關閉麥克風,並檢查磁碟可用空間"

解法:
開WORD--工具--選項--儲存--內嵌語言資料,不勾選,按確定重新存一次

2008年3月5日 星期三

SQL將字串欄位轉為Table的方法

SQL裡,將字串欄位轉為Table的方法:


/* -- 傳入參數 -- */

declare @list nvarchar(4000)
declare @delimiter nchar(1)

set @list=@companyAll    -- 將@companyAll 改為待處理字串
set @delimiter='
'   -- 將 @delimiter 改為分隔符號

/* -- END -- */

create table #tmp ( listpos int IDENTITY(1, 1) NOT NULL,str varchar(4000),nstr nvarchar(2000))
DECLARE @pos int,
@textpos int,
@chunklen smallint,
@tmpstr nvarchar(4000),
@leftover nvarchar(4000),
@tmpval nvarchar(4000)

SET @textpos = 1
SET @leftover = ''

WHILE @textpos <= datalength(@list) / 2 BEGIN

SET @chunklen = 4000 - datalength(@leftover) / 2
SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen)
SET @textpos = @textpos + @chunklen
SET @pos = charindex(@delimiter, @tmpstr)

WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT #tmp (str, nstr) VALUES(@tmpval, @tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)

END

SET @leftover = @tmpstr

END

INSERT #tmp(str, nstr)
VALUES (ltrim(rtrim(@leftover)), ltrim(rtrim(@leftover)))


/* 刪除空白資料筆數 */
delete #tmp where len([str])=0
select * from #tmp
/* 清除暫存 table */
drop table #tmp

PS:為何要用㊣來當作區隔,因為在我的現實案例中,逗號已經無法當作唯一辨識了,所以才會選擇㊣。當然,可以根據實際情況來選擇所要區隔的符號。

2008年2月20日 星期三

透過javascript去抓網頁URL傳進來的參數

//透過javascript去抓網頁URL傳進來的參數:


//宣告

var LocString=String(window.document.location.href);

function GetQueryString(str)
{

var rs=new RegExp("(^|)"+str+"=([^\&]*)(\&|$)","gi").exec(LocString),tmp;

if(tmp=rs)
return tmp[2]; return "
沒有這個參數";

}

//使用

var v=GetQueryString('tmp_new_version');
alert(v);