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());