顯示具有 練習心得 標籤的文章。 顯示所有文章
顯示具有 練習心得 標籤的文章。 顯示所有文章

2008年6月14日 星期六

不使用 SqlDataSource 的 GridView 排序(6.14)

排序是個很簡單的東西嘛 ~ 常常在使用 GridView 的人都知道,
不就是把「AllowSorting」的屬性設成「True」,
以及將對應的欄位「SortExpression」屬性,設為該欄位名稱

沒錯!若是使用 SqlDataSource 的話,的確這樣就可以輕易達到排序的功能。
但,如果您的資料來源(DataSource),不是指定「DataSourceID ="某SqlDataSource 控制項"」
而是使用資料表(DataTable、DataView)來當資料來源的話

若單純如此設定,可是會踢到鐵板的喲~~




必須還要另外引發一個事件 Sorting



程式碼檢視

2008年6月12日 星期四

快速的檢查所有的欄位 (6.12)

不知各位有否曾經何時寫過類似如此的判斷句:


if ( TextBox1.Text != "" && TextBox2.Text != "" && ...)

我想,這是一般在檢查必填欄位時,會用到的判斷語句吧~


我們來假設一下,
若現在這個網頁有30個 TextBox 的控制項,且,希望全部都是必填欄位
又或是,由於目前 SQL Injection 與 XSS 的盛行,想要對每個欄位進行檢查過濾字元
如果是採用原先的寫法,這樣,可能會寫的很累。


或許,您可改寫成這種方式會讓您省事許多:



可利用「Panel」將全部的元件包起來,並以迴圈的方式檢查 Panel 裡所有的TextBox

當 .Net AJAX 遇上 Frame (6.12)

適用了 .Net 包裝的 AJAX 一些時間後,發現,真的是「水能載舟,亦能覆舟」。

在使用前,只知道 AJAX 的優點,衝著它的優點去使用它,
卻沒想到,它也是個會另人頭痛的東西呀~~


目前有個專案,由於必須即時更新資料,所以,想到用使用 AJAX 套件的 UpdatePanel ,
讓它局部更新就好,畫面就不會一直閃。有了這個前題,開始著手製作這簡單的功能。


沒錯,它的確很簡單,所以三兩下就可以完成,且也在本機測試正常,可以即時更新資料;
但是,當我把它放上「測試區環境」時,居然發現,只要滑鼠點了一下(不管左鍵,右鍵),
馬上跳出個 「JavaScript」的錯誤,錯誤上顯示著「存取失敗」

天吶 ~ 發生了什麼事,且是莫名奇妙的發生,對我這 AJAX 的初學者來說,可是個大問題。
明明在本機端不是正常嗎?怎麼到了測試區就壞了?

既然本機正常,測試區故障,那就即有可能是環境的問題。立即檢視了一下環境,
並且馬上再上 Google 尋找問題點,及解決方案,後來,總算是發現問題了。

看來這問題,並不是只有出現在我身上,已有許多前輩遇到,並也提出了解決方案。
真的太好了!現在,就來看看發生了什麼問題吧~

原來問題是出在「Frame」呀~若只是一般的框架,就還沒事,但若是遇到框架內,
左右(或是上下什麼的)網頁的來源路徑處於不同的主機時,
很抱歉,JavaScript 會出來跟您 聊個天,告訴您「存取失敗」。


那這是什麼原因呢?為什麼不同主機時,就會壞掉。經過網路前輩的分享,
得知原來問題就出在 .Net AJAX 的套件中,有個 MicrosoftAjax.debug.js 檔案,

裡面有部份語法是這樣寫的:

var offsetL = w.screenLeft - top.screenLeft - top.document.documentElement.scrollLeft + 2 ;

如果 Frame 的網頁路徑在不同主機上,使用了「top」當然會有問題(算是Bug吧),
但由於,這些程式,已經由 .Net 包起來了,無法直接去修改,
所以,我們便必須另外下載「Microsoft AJAX Library 」來用。

解壓縮後,將其,放在您的「虛擬目錄」底下,接著,
修改一下 ScriptManager 的內容:





再來,修改程式「MicrosoftAjax.debug.js 」中


case Sys.Browser.InternetExplorer: 到 case Sys.Browser.Safari:


修改成:





之後呢? ScriptManager 就會依照您給的路徑去執行該修改過的檔案。


參考來源:黑暗執行緒

2008年4月8日 星期二

TreeView 的 CheckBox (4.8)

在使用 TreeView 的時候,很簡單地,大家都知道,
只要將其「ShowCheckBox」的屬性設為「True」,在該節點上,
就會產生「CheckBox」型的節點。

另外發現它也有個「TreeNodeCheckChanged」的事件,
其事件的意義就是一如往常的,只要有「勾選/取消」的動作,就會觸發。
很好,那我們便很自然地去找「AutoPostBack」的屬性…

啊?居然沒有~~那也許是程式自己已經是預設「AutoPostBack=True」了吧。
於是執行程式,可是…
它居然沒有執行「TreeNodeCheckChanged」事件底下的程式???

原來,這就是很多人指出 TreeView 的 CheckBox 半殘的地方。
因為還要另外自己再加入些程式碼(JavaScript)才行。

//要加入這個,才能引發TreeView的OnTreeNodeCheckChanged事件
function doCheck()
{
//設定「o」為產生click的來源元素(物件)
var o = window.event.srcElement;

//下條件判斷:屬於checkbox的物件,才產生postback
if (o.tagName == "INPUT" && o.type == "checkbox")
{
__doPostBack("","");
}
}

並把該「TreeView」物件,加一個「onclick="doCheck()"」的事件。

2008年3月26日 星期三

取得網頁的HTML原始碼(3.26)

圖一
圖二
圖三


案例:
在Google Patents搜尋(圖一)中,鍵入:「Patent:XXXXXX」,可以取得與此相關的專利(列表)(圖二)。
但目前有個需求是希望在自己的網頁中,建立一個UserControl,來取代「Google Patents」(圖一)的畫面
此UserControl裡放置了「TextBox」、「Button」各一個,希望能在使用者輸入「專利號」
就可以馬上連結到該專利的網頁(圖三),而非「一個列表(圖二)」。


問題來了,要連到專利的網頁(圖三),必須要知道該專利的id(由google的url得知)
但是,id是存在google他們的資料庫呀,我們如何知道呢?


其實,在列表中的超連結,已有專利的id可見,所以只要利用「WebRequest
攔截列表的html,再找出該專利的id,這樣就可以自己串連到專利網頁的URL了。




// 設定request
System.Net.WebRequest request = System.Net.WebRequest.Create(pageUrl);
//設定TimeOut的時間(怕網路速度過慢,資料不完全)
request.Timeout = timeoutSeconds * 1000;

// 從request接收資料
System.Net.WebResponse response =request.GetResponse();
System.IO.Stream streamReceive = response.GetResponseStream(); System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("utf-8"); System.IO.StreamReader streamRead = new System.IO.StreamReader(streamReceive, System.Text.Encoding.Default);

// 取得原始碼
String HTML =streamRead.ReadToEnd();

2008年1月10日 星期四

.Net 2.0 CallBack機制 (1.10)

寫久了.net,也該受夠了PostBack的罪。無奈在.net的領域中,PostBack又太為重要,沒有了PostBack,Server端與Client端的資料如何傳遞呢?
所以為了不PostBack,必須要仰賴到JavaScript,自己在網頁上,加上許多JavaScript的語法來達到目的,如今,.net終於正式和JavaScript合作了(自己說的),因為在.net 2.0上,多了個CallBack的機制,可以不用PostBack可以傳遞資料,也不會看畫面在那閃丫閃的,也大大的增加了網頁的效能,現今最為流行的AJAX就是使用CallBack的方法喲!!

學習CallBack不可不知的三個重點
1 GetCallbackEventReference //用來產生JavaScript的CallBack指令
2 GetCallbackResult//處理要回傳給Client端的值
3 RaiseCallbackEvent//處理從Client端傳來的值

範例:
**點一下按鈕,在不postback的情況下,取得日期

後端處理(.cs)
//需繼承「System .Web .UI .ICallbackEventHandler 」
public partial class callback : System.Web.UI.Page,System .Web .UI .ICallbackEventHandler
{
protected void Page_Load(object sender, EventArgs e)
{
string cbReference="";
cbReference =ClientScript .GetCallbackEventReference (this,"''","ReceiveServerData","");
//由於沒有要處理的資料,所以第二個引數為空字串
btn_callback.Attributes["onclick"] = cbReference; //註冊CallBack的JavaScript
}
public string GetCallbackResult()
{
return DateTime.Now.ToShortDateString (); //傳回時間
}
public void RaiseCallbackEvent(string abc)
{
//由於沒有要處理運算(處理)的值,所以目前沒有程式
}
}

前端網頁(.aspx)










了解了後,接下來就可以應用到其它更深度的地方去~~慢慢探索吧

2007年12月10日 星期一

利用Telnet測試郵件

在撰寫發送郵件的程式時,由於沒有設定SMTP Server的緣故,所以無法正常地發送郵件。

以下是使用Telnet測試郵件格式的方法:


1 執行「命令提示字元」程式
2 輸入「telnet 127.0.0.1 25」,再鍵入「Enter」-->開啟telnet的畫面
3 輸入「helo XXX」再「Enter」。-->「XXX」表示可以隨便打,只是讓系統識別用
4 輸入「mail from : XXX@XXX.XXX.XX」再「Enter」。-->是由誰寄的
5 輸入「rcpt to : YYY@YYY.YYY.YY」再「Enter」。-->寄給誰
6 輸入「data」再「Enter」-->告訴系統要開始輸入信件的本文了
7 本文輸入完畢後,再「Enter」。-->當然,內容可以加入許多格式
8 加入一個「.」的符號表示結束
9 最後下「quit」離開








當沒有設好SMTP Server時,信一定寄不出去,
所以可以到「C:\Inetpub\mailroot」觀看信件的狀況,及編譯的格式



mailroot的目錄:


Badmail用來放SMTP Svc寄不出的退信


Drop是被丟棄的信


Mailbox則用來存放寄給本機使用者的信



  • (MS SMTP Svc其實有收信功能的,只要Domain Name設對了,user@yourSmtpDomain.com的信就會被放到這裡)

Queue、Route、SortTemp都是傳送過程中暫存信件用的。



  • 如果信件卡住沒送出去,則可以在Queue中看到大排長龍

SMTP設定

選擇「存取頁籤中的轉接」鈕,設定成如下圖-->將127.0.0.1加入允許Relay的IP清單

2007年12月5日 星期三

DataList 的分頁功能

ASP.Net只有DataGrid有分頁功能,而其它的需要自行製作
使用「PagedDataSource」達到分頁功能的製作方法:

DataTable dt=new DataTable (); //宣告一個新的「DataTable」物件
PagedDataSource Pgds =new PagedDataSource (); //宣告一個新的「分頁」用物件
(適用於DataTable)
dt=ds.Tables [0]; //將資料丟給DataTable(此來源資料是DataSet)
Pgds.DataSource =dt.DefaultView ; //將dt的資料丟給分頁的物件
Pgds.AllowPaging =true; //設定分頁功能開啟
Pgds.PageSize =2; //每頁顯示的數量

DL_Prototype.DataSource =Pgds; //把分頁物件的資料丟給DataList


Pgds.CurrentPageIndex=0; //此屬性用來控制顯示哪一頁的(第0頁開始)

其它的,再自行應用…

2007年11月16日 星期五

SQL效能的技巧

假設遇到以下情形:(執行SQL更新語法)

update dbo.pre_case
set
pc_handle_ext=(select com_telext from common..comper cc
      inner join common..orgcod co on cc.com_orgcd=co.org_orgcd
      inner join common..depcod dp on cc.com_deptid=dp.dep_deptid
      where com_empno=@handleno),

pc_service_ext=(select com_telext from common..comper cc
      inner join common..orgcod co on cc.com_orgcd=co.org_orgcd
      inner join common..depcod dp on cc.com_deptid=dp.dep_deptid
      where com_empno=@handleno),

pc_service_dept=(select dep_deptname from common..comper cc
      inner join common..orgcod co on cc.com_orgcd=co.org_orgcd
      inner join common..depcod dp on cc.com_deptid=dp.dep_deptid
      where com_empno=@handleno)
where pc_no=@id

發現有三部份相同的Select語法,
建議可改成:

declare @pc_handle_ext nvarchar(20);
declare @pc_service_ext nvarchar(20);
declare @pc_service_dept nvarchar(20);

select @pc_handle_ext=com_telext ,@pc_service_ext=com_telext ,
@pc_service_dept=dep_deptname
from common..comper cc
inner join common..orgcod co on cc.com_orgcd=co.org_orgcd
inner join common..depcod dp on cc.com_deptid=dp.dep_deptid
where
com_empno=@handleno

--先將要修改的值存於SQL變數中,不用跑三次,一次就解決

update dbo.pre_case
set
pc_handle_ext=@pc_handle_ext,
pc_service_ext=@pc_service_ext,
pc_service_dept=@pc_service_dept 
where pc_no=@id

之後再執行一次SQL更新的語法,將@變數值存入欄位裡即可

2007年10月22日 星期一

設定 dropdown 的預設值注意事項(10.22)

當你要設定 dropdown 的預設值時,請勿直接用

dropdown.SelectedValue = xxx 的方式

因為當你所指定的 xxx 並不存在於 dropdown.items 裡面時,反而會出現錯誤。
比較好的方式,是透過 foreach 方式


foreach (ListItem it in dropdown.Items)
{

if ( it.Value== "xxx" )

{ it.Selected=true; }

else

{ it.Selected=false; }


}

2007年9月21日 星期五

SqlDataSource設定回傳參數的Parameter(9.21)

在SQL裡,我們常會用到「回傳型態」的預存程式,但是在ASP.Net,該如何取出回傳值呢?



**設定回傳參數的使用方法:


Parameter abc= new Parameter();   //abc為自訂變數


abc.Direction = ParameterDirection.Output; //設定為「回傳式」的參數


abc.Name = "identity"; //「identity」為SQL預存程式裡使用的回傳變數名稱


abc.Type = TypeCode.Int64; //設定此參數的型態


//(如果是字串的話,需另外設定Size的屬性大小,以免被截斷。例:abc.Size=50。最高到100)


SqlDataSourcePlan_attfile.SelectParameters.Add(abc);



**取得回傳參數的使用方法:(在SqlDataSourceSelected事件中)

int xyz= e.Command.Parameters["@identity"].Value;

2007年9月11日 星期二

showModalDialog的三個問題?(9.11)

Q1 不能另開視窗

A1 在超連結的部份,須要加入Target

Q2 IE會自動儲存網頁,以致不能更新最新網頁

A2 在網頁前端加入「< % Response.Expires = 0; % ><% Response.Expires = 0; %>」 ,讓該網頁不儲存










Q3 結束彈出視窗後,資料未異動 (在彈出視窗已更新資料庫資料,母畫面未更新)

A3 在window.showModalDialog( )完後,加入一行window.location.reload();








2007年9月7日 星期五

無法存取 IIS Metabase(9.7)

由於XP預設沒有安裝IIS,而如果已經先安裝好了.NET Framework 2.0之後才安裝IIS
那麼再開啟ASP.NET 2.0的網頁時就會遇到以下的訊息

「無法存取 IIS Metabase」

解決方法:

1. 開啟「Visual Studio 2005 命令提示字元」
2. 執行「aspnet_regiis -i 」,.NET Framework進行初始化

2007年8月22日 星期三

SSIS資料轉換圖解教學(8.22)

新增「資料流程」
拖曳「OLEB DB來源」元件
設定「資料來源」
拖曳「緩時變維度」元件
建立二元件的關聯
設定「目的地資料表」及「索引鍵」,對應「欄位」
設定「變更屬性」
勾選「異動時變更」
勾選「推斷設定」(預設)
轉換結構圖
執行封裝
執行結果




2007年8月17日 星期五

多載使用(8.17)

在C#若要使用多載的話,不用特別宣告為overload,只要直接宣告sub,寫參數就行

取得AD帳號(8.17)

User.Identity.Name可以取得登入的使用者完整名稱
經由字串處理可以取得名字的部份

可以這樣測試
ADTest.aspx


string fn = User.Identity.Name; 可得到「主機(網域)名\帳號」
int p = fn.LastIndexOf("\\");
Response.Write(fn.Substring(p+1));
可得到「帳號」

ADTest.aspx放在任何一個NT整合驗證的虛擬目錄(就是以匿名帳號存取)

2007年8月13日 星期一

取得虛擬網頁路徑(8.13)


this.Request .CurrentExecutionFilePath :取得虛擬網頁路徑