2007年8月29日 星期三

當我的兒子是 iFrame 的時候

當我的網頁裡頭有使用到 iFrame,而我又想要去改變或取得這iFrame的東西時,該怎麼辦?

目前有兩種方式,但使用的時機各不相同。
第一種:document.getElementById(“ifr”);
第二種:window.frames[“ifr”];

如果我們想要改變的,只是iframe的src,border,scrolling時,就要使用第一種方式。

如果我們想要改變的,是整個iframe裡的DOM階層,也就是要存取iframe裡的某一樣東西時(如txtbox的值),就要使用第二種。

然而,當你所存取的 iframe 頁面尚未完全下載完成時就要呼叫使用它,是會出錯的。所以,我們自己要去處理這個錯誤。最簡單的方法,就是先去檢查我們要呼叫的物件是否已經存在,如果不存在,就等他一下,然後再繼續做我們要做的事。

我用了 setTimeout( ) 的方式來處理。


function CallIFrame()
{
 var ob=window.frames["ifDraft"];
 var iobject=ob.document.getElementById("txtTest");
 if(iobject)
 {
  iobject.value="三趨一";
 }
 else
 {
  setTimeout("CallIFrame()",100);
 }

}

iFrame裡的網頁呼叫父網頁

當你使用了iFrame之後,如果想要叫用他的父親,該如何進行?

ex:
parent.location.href='http://www.kimo.com.tw'

只需要加上 parent 就可以了

2007年8月28日 星期二

破解XP Adminstrator密码

Windows XP凭借极高的 安全性和稳定性,赢得了广大用户的青睐。我们可以通过建立个人账户、设定密码来保护自己的个人隐私,还可以用Administrators(超级管理员) 的身份任意设置账户,为每一个账户设置不同的权限,可以说拥有至高无上的权利,也拥有系统的“生杀大权”,享有系统最高级别的安全保障。
  但是,如果我告诉你,我能不费吹灰之力就可以将你这个Administrators给废掉,
取 而代之的是我成为Administrators,你信不信?呵呵,你不信?好,我们来试一试:   步骤一 重新启动计算机,在出现启动菜单时按F8键进 入高级选项菜单,选择“安全模式”进入系统;   步骤二 打开“控制面板”,找到“用户和密码”选项,看看是不是账户中包括 Administrators?好,现在将Administrators账户删除,重新创建一个Administrators,或是更改原来的 Administrators账户密码;   步骤三 重新启动计算机后,只有输入新的密码才能登录Windows XP。  为什么会出现这种问题呢? 原因很简单:Windows XP真正的超级管理员账号应该是在安全模式下的Administrators,并不是在正常模式下的 Administrators。在默认情况下,安全模式下的Administrators密码为空。无论用户在正常模式下将Administrators 密码设置得多么复杂,安全性多么高,如果没有设置安全模式下的Administrators密码,你的电脑将毫无秘密可言。  现在,你是不是对 Windows XP的安全性有些担忧了?那怎么办?这还不简单:赶紧进入安全模式,设置Administrators密码,将自己提升为真正的 Administrators!当然,这次设置的密码要记牢了,否则下次你就真的无法进入Windows XP了!安全模式下的 Administrators,的确厉害!
但是最厉害的还是1、用DOS启动盘进入纯DOS
2、进入系统目录下的system32目录 (cd system32)
备份logon.scr、cmd.exe两文件 (copy …… ……)
删除logon.scr (del logon.scr)
并将cmd.exe改名为logon.scr (ren cmd.exe logon.scr)
3、重启进入Windows,出现登陆画面等一会,一般会进入屏保logon.scr(此时已为cmd.exe)
4、可以在DOS下一展身手了,可用net 修改密码再输入explorer,进去了!!!
所以说赶快设置上你的 bios 才是硬道理

原文參考

2007年8月24日 星期五

存取 MasterPage上的物件

當要存取 MasterPage 上的物件時,例如: lbMasterTitle

可以在目前的 Content 裡面下 Master.FindControl("lbMasterTitle")

2007年8月20日 星期一

呼叫 .Net 2.0 SqlDataSource 的 Connection 字串

在 .Net 2.0,提供新的連結資料庫的元件-SqlDataSource。

他會在 Web.Config 裡加入一段



<connectionstrings>



<add name="engagedbConnectionString" connectionString="Data
Source=SQLT,5555;Initial Catalog=gage;User ID=pub_pre_XXXX;Password=XXXX"
providerName="System.Data.SqlClient"></add>



</connectionstrings>

這跟我們以前寫在 AppSetting 的語法有點不同。既然有了新的物件,那我們要如何去呼叫他裡頭的設定呢?

可以透過下面方式:


ConfigurationManager.ConnectionStrings[ "engagedbConnectionString" ].ConnectionString

2007年8月9日 星期四

當SQL語法有用到 CURSOR 時

當用 ASP 寫連結資料庫的程式時,如果有用到 CURSOR, 會出現錯誤:(描述如下)

當執行 SQL Command 1 時,會出現 「當物件關閉時,不允許操作」的問題,
但是 執行 SQL Command 2 就不會。

是不是 執行 rs1.open 的時候,有參數要設定?

================================== SQL Command 1 ==================
declare @ShipperID int;

select * into #tmp from Shippers


DECLARE rsCursor CURSOR FOR
SELECT ShipperID FROM #tmp;

--開啟指標
OPEN rsCursor;

-- --移動指標到第一筆, 並將資料欄位填入變數中
FETCH NEXT FROM rsCursor INTO @ShipperID;

WHILE @@FETCH_STATUS=0
BEGIN
--更新資料表
Update #tmp set Phone='555' where ShipperID=@ShipperID
--移動指標到下一筆, 並將資料欄位填入變數中
FETCH NEXT FROM rsCursor INTO @ShipperID;
END

--關閉指標
CLOSE rsCursor;
--釋放指標
DEALLOCATE rsCursor;

select * from #tmp

drop table #tmp
======================================================================================




================================== SQL Command 2 ==================
select * from Shippers
====================================================================



rs1.open strSQL, conn, 3, 1


錯誤類型:
ADODB.Recordset (0x800A0E78)
當物件關閉時,不允許操作。
/SSOTest/test.asp, line 58
 

 

解決方法,是在SQL 語法裡面加上

SET NOCOUNT ON

參考網址:http://csdn.eyeah.cn/3116/1118/1126/232617673.html

據網址所言,是因為 odbc 與 oledb 資料集不同所造成。

Reporting Services匯出成 PDF 中文字都會變成亂碼

Q:用 Reporting Service ,

但是卻發現在匯出成 PDF 格式時,

所有中文字都會變成亂碼。



A:到 VS.NET 2003 修改該欄位成中文字形(明體)

就可以正常輸出

取出物件的所有公開屬性

現在介紹的方法,可以用來取出某個類別裡面所有公開的屬性。另外,他也可以取出 webForm 上面物件的屬性。



public
class MyControl


{


private
string _text;


private
int _itemCount;


public
string Text


{


get{return
_text;}


set{_text=value;}


}


public
int ItemCount


{


get{return
_itemCount;}


set{_itemCount=value;}


}


}


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


private
void Button2_Click(object
sender, System.EventArgs e)


{


MyControl ctrl=new
MyControl();


ctrl.Text="New Times";


ctrl.ItemCount=25;


 


PropertyDescriptorCollection props=TypeDescriptor.GetProperties(ctrl);


foreach(PropertyDescriptor
prop
in props)


{


Response.Write(prop.Name+": "+prop.GetValue(ctrl));


Response.Write("<BR>");


}


}


HtmlTextWriter

要透過 HtmlTextWriter 實作 Render ,會用到 RenderBeginTag,
RenderEndTag,AddAttribute,AddStyleAttribute ...

我以超連結的範例來說明:

















<a style="font-size:18pt" href="http://www.kimo.com.tw LinkToKimo </a>
RenderBeginTag( ) AddStyleAttribute( ) AddAttribute( ) Write( ) RenderEndTag( )

RenderBeginTag( ):用來產生 <a>, <Table>,<TR> ... 等等Html標籤格式


AddAttribute( ): 用來設定 HTML標籤內的值


AddStyleAttribute( ):用來設定標籤的樣式,如style


Write( ):將字串直接秀在Browser上


RenderEndTag( ):產生HTML標籤的結束符號,如 </a> , </table> ...

Writing HTML contents to client

撰寫 Server Control,當我們想要呈現 UI 物件時,會想要將 HTML 語法丟到瀏覽器上面。這時候,有兩種方法讓我們來實作 Rendering。

1.直接將 HTML 語法丟到瀏覽器。直接實作 Write
2.使用多用途的方法(utility methods)。

這兩種方法的差別,在於如果我們使用 utility methods ,可以不用去擔心使用者的瀏覽器是哪一種類型(IE、NetScape、WinCE、PDA),.NET自動會幫我們作轉換的動作。

當我們想透過 Render來呈現UI時,主要是透過我們所繼承的 Control物件,並 override其中的 Render( )來完成的。所以在程式中,別忘了記得去作繼承的工作。

Add Server Control by Visual Studio .Net

當我們開啟一個新專案的時候,除了會有一個專案名稱之外,在最上層還會有一個名為 Solution的東西。在同一個 Solution 下,可以有很多的專案名稱(Project)。而我們所要用來建立 Server Control 的專案型態應該是 Windows Application。建立之後,我們可以開始在這個專案下寫程式。在程式撰寫當中,有時會遇到 Web.UI沒有定義的問題,這時候我們可以看看 Solution Explorer,在我們的專案下,展開 References,看看是否有 System.Web,(預設是沒有的),如果沒有,可以按右鍵點選 Add Reference,在 .Net 分頁頁籤裡面,挑選 System.Web即可。

接下來,我們要設定整個專案的屬性。選擇 Project -> Properties,在 Common Properties 裡選擇 General,在右邊的選單中的 Output Type 選擇 Class Library。

The difference between User Control and Server Control

User Control與 Server Control 都是可重複使用的程式碼,但是 User Control 定義完之後,往往只是適用於目前所開發的專案,當有另一個專案要開發時,我們只能重新修改 User Control 或是做 Copy-Past 的工作。然而 Server Control 定義完之後,我們每一個專案在開發時,都能夠直接使用,不需額外修改。

在效能方面,early bound Server Control 比 late bound ASP/COM(+)/VBScript Object 速度快三倍,但是 Server Control 會額外花費一些時間在 UI 介面的呈現與 PostBack 訊息處理上。所以,當你發現 Server Control 的效能低落時,就必須要檢查 Rendering 與 PostBack 這兩個地方有沒有寫好。

StringBuilder 的效率問題

如果宣告一個 string 變數,並重複著透過 stringVar+="xxxx" 的方式去組字串,其實是
蠻沒有效率的。因為每一次呼叫 stringVar+= 就會從新配置一塊記憶體去儲存組合結果,
如果你在回圈裡重複次數很多時,執行效能就會明顯被影響。

這個狀況,要透過 StringBuilder 來克服,宣告了StringBuilder之後,會重複的使用同一塊
記憶體空間,能夠節省因為重新配置記憶體而所需額外耗費的系統資源。

Try Catch 的效率問題

許多文章建議避免使用 Try Catch 語法,主要是他會耗費較多的資源(時間)去做錯誤的攔截。
如果在一個網頁裡面使用個幾次 Try Catch 語法,其實是沒有多大影響的。但是當您是在大量
迴圈中使用,那 Try Catch 則會嚴重影響到效能。並非不能去使用 Try Catch,而是在用的時
候,必須衡量呼叫 Try Catch 的次數是否會多到影響到效能。

動態產生按鈕及觸發事件

當有需要動態產生按鈕時,我們會考量幾個狀況,第一是畫面編排,第二則是按鈕 click 後觸發事件的處理。在畫面編排裡,由於按鈕

是屬於 WebControls 的物件之一,他必須要放在 Form裡面。所以我們可以事先在畫面上拉一個Panel,用他來擺放待會要動態產生的

按鈕物件。另外,為了能讓按鈕擺放能夠更美觀,所以會增加<Table>標籤來完成。


在ASPX頁面,範例程式如下所示:


<body>

            <form id="Form1" method="post" runat="server">

                        <asp:Panel id="Panel1"  runat="server"></asp:Panel>

            </form>

</body>


在ASPX.CS 頁面,範例程式如下:

private void Page_Load(object sender, System.EventArgs e)
{
//用來自動產生項目的資料來源
string [] oAL=new string[]{"kimo","pchome","google"} ;
//宣告 Table 物件
Table oTable=new Table();
//宣告 TableRow 物件
TableRow oTR=new TableRow();
//宣告 TableCell 物件
TableCell oTC;
//宣告 動態產生的 按鈕 物件
Button oB;

//動態產生按鈕的迴圈
for(int i=0;i<oAL.Length;i++)
{
//實體化一個 TableCell
oTC=new TableCell();
//實體化一個按鈕
oB=new Button();
//設定按鈕的物件識別編號
oB.ID="Btn"+oAL[i].ToString();
//設定按鈕的Text屬性
oB.Text="Btn"+oAL[i].ToString();
//設定按鈕click的觸發事件,oB_Click 指的是click後對應的事件名稱
oB.Click+=new EventHandler(oB_Click);
//將動態產生的 Button 加到 TableCell 裡面
oTC.Controls.Add(oB);
//設定 TableCell的邊寬為 1 px
oTC.BorderWidth=Unit.Pixel(1);
//將動態產生的 TableCell 加入到 動態產生的 TableRow
oTR.Cells.Add(oTC);

}

//將動態產生的 TableRow 加到 動態產生的 Table
oTable.Rows.Add(oTR);

//將動態產生的 Table 加入到 Panel1
Panel1.Controls.Add(oTable);

}

public void oB_Click(object sender, System.EventArgs e)
{
string strComeFrom=string.Empty;

//取得呼叫者的 ClientID
strComeFrom=((Button)sender).ClientID;

Response.Write(strComeFrom);
}


為何要將整個動態產生的程式碼寫在Page_Load()事件裡,而且不放在 !IsPostBack 區段,
主要是因為當按鈕被觸發之後,如果把動態產生的物件寫在 !IsPostBack 裡,會找不到原先
所建立的動態物件。所以我們把這段程式放在 Page_Load(),並讓每一次的PostBack都重新
去執行一次。

check box list 被清掉的問題

CheckBoxList 的 webcontrol 如果將 enable 設成 false, 當畫面觸發 postback 時,會將原先 CheckBoxList 的資料的勾選項目都清掉。
為了避免這問題發生,我們就必須在每一次的 PageLoad 事件中,重新 Bind 一次資料。

區分編碼型態來取得字串的位元長度

.Net 裡面對於字串(string)會提供 String.Length 屬性來取得該字串的長度,但是這個屬性並不會區分中文字或英文字,也就是一個英文字
的長度算 1 ,而一個中文字也算是 1 。如果我們要將中文字長度算成 2 時,這種中英文雜處的字串就不能夠單純的使用 String.Length 來
處理了。

這時候,我們可以使用下面的方法解決:

private string TruncateByUserDefine(string strOri,int iCharLength)
{
Byte [] byteOri = System.Text.Encoding.Default.GetBytes( strOri );
if( byteOri.length< iCharLength)
iCharLength = byteOri.length;
char [] charTrans= System.Text.Encoding.Default.GetChars( byteOri, 0, iCharLength);
string strResult=new string(charTrans);
return strResult;
}

說明一下這個函式,strOri 是我們準備要用來判斷的字串來源,而 iCharLength 則是我們所需要取出的字元長度。
我們先將來源字串轉成 Byte 的格式,再透過 GetChars 將裡面的字元一個一個讀到陣列裡頭,最後,我們就將只需
要取出所要長度的字元陣列即可。

顯示幣別格式的字串

如果要顯示幣別格式的字串,如三位一撇的格式,我們需先將要轉換的資料先確定為 int或 decimal 格式,然後再透過 ToString("#,###") 就可以轉換成幣別格式。如果還要支援小數點,則要寫成 ToString("#,###.00") 。同樣是 ToString( ), 但 string 與 int 就會有不同的 支援程度。也就是說, 如果是 string 格式,是不支援轉幣別的方式,需先將string 轉換成 int 或 decimal 後,再行轉換。

SQL Server 安裝主機變更主機名稱後的處理

開啟 Query Analyzer
--Step01
--顯示目前的區域伺服器(Local Server) 之名稱
select @@ServerName
--Step02
-- 刪除目前的區域伺服器名稱
-- 這裡所指的 LocalServerName,就是剛剛執行 select @@ServerName的結果
exec sp_dropserver 'LocalServerName', 'droplogins'
-- 若是沒辦法刪除,請先執行 sp_dropremotelogin,來卸除與本機登入對應的遠端登入後,再執行 sp_dropserver
exec sp_dropremotelogin 'LocalServerName'
 
-- Step03
-- 重新建立區域伺服器,使用目前最新的伺服器名稱,必須搭配 LOCAL 參數
exec sp_addserver 'New_Name', 'local'
 
-- Step04
-- 將SQL Server 關掉,重開,再度執行以下指令,看看是否已經有所改變
select @@ServerName

汽車測試二期VSS專案建置步驟

1.先建好 VSS DB
2.開啟 Visual Studio .Net,開啟舊的專案,選取 Source Control -> Add Solution to Source Control ->
直接加在 $/ 下面,並將 *.root 的 .root 去掉
 

FreeSMTP.dll拒絕存取的問題

發現使用FreeSMTP的時候,會出現拒絕存取的問題。為了避免這問題,可以在 .Net Configuration 1.1裡面的組件快取,加入FreeSMTP.dll 即可解決。

加入別人提供的ASP.NET專案

常常發生客戶所做的Mockup,拿來安裝時,卻發生因為站台名稱命名跟客戶的Mockup站台不一樣,而無法開啟專案。解決方法如下。

首先先在IIS服務管理員,新增Mockup站台。

再將客戶專案檔中的project.csproj.webinfo開啟,編輯



<VisualStudioUNCWeb>

<Web URLPath = "http://localhost/CarTest2Mockup/cartest.csproj" />

</VisualStudioUNCWeb>



將 Web URLPath 的值更改為剛剛建立的站台名稱,接著在Visual Studio .net 新增一個空白的 Solution,加入舊的現有專案即可

產生 BarCode 的方法

產生BarCode比較常見的方式,是透過 third-party提供元件來產生
居多,但是會根據不同的開發工具而有個別對應的BarCode產生元件
。當然,比較有彈性的方法,就是自己寫,缺點就是要花時間。日前
我在藍色小舖找到一篇不錯的文章,其作法可供為參考。

他主要作法,是先安裝BarCode字型,當USER輸入文字後,將這些文字
轉換成對應的BarCode字型,然後將這些BarCode以繪圖的模式輸出成
圖形檔。而我們在畫面中,則是利用<img>的方式,將BarCode圖檔秀
出來。

藍色小舖資料來源如下:

網頁上的即時條碼產生--->使用VB.Net
類別 :
ASP.NET ,
摘要 :
即時產生條碼的程式

Response.Expires = 0
Dim BMP As Bitmap = New Bitmap(320, 250, Imaging.PixelFormat.Format32bppPArgb)
Dim G As Graphics = Graphics.FromImage(BMP)
Dim 來源影像 As Image = Image.FromFile(Request.PhysicalApplicationPath + "logo.jpg") ' 讀取背景影像進來
G.DrawImage(來源影像, New Rectangle(0, 0, 320, 250), New Rectangle(0, 0, 210, 60), GraphicsUnit.Pixel)
Dim 字型 As Font = New Font("IDAutomationHC39M", 25) <--- 這行是重點, 自行到網路上抓取該條碼字型吧
Dim 筆刷 As Brush = New SolidBrush(ColorTranslator.FromHtml("Gold")) < --- 這裡是條碼顏色
G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
G.DrawString("123456", 字型, 筆刷, 50, 15) < --- 印出條碼
BMP.Save(Response.OutputStream, Imaging.ImageFormat.Jpeg)

想要顯示條碼的部分, 加上這段就可以囉
另外, 需
Imports system.drawing




改成C#後的程式如下:


using System.Drawing;
using System.IO;



 
private void Button1_Click(object sender, System.EventArgs e)
{

Bitmap BMP=new Bitmap(420, 100, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
Graphics G=Graphics.FromImage(BMP);
System.Drawing.Image IMGSource= System.Drawing.Image.FromFile( Server.MapPath("images/logo.jpg"));

/* 預先要準備一張空白畫面的背景圖,範例中是指 logo.jpg */
G.DrawImage( IMGSource, new Rectangle(0, 0, 420, 100), new Rectangle(0, 0, 210, 30), GraphicsUnit.Pixel);
System.Drawing.Font F=new Font("IDAutomationHC39M", 14);

/* 指定所要選用的字型,也就是 BarCode 字型,以及字型大小 */

System.Drawing.Brush B= new SolidBrush( ColorTranslator.FromHtml("Black")) ;

/* 設定字型顏色 */
G.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
G.DrawString( string.Format( "*{0}*",TextBox1.Text),F,B,30,15);

/* 指訂要轉換成BarCode的內容,在字首字尾須加星號(請參考BarCode - Code39的規範) */


BMP.Save( Server.MapPath("images/kk.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg );

/* 將結果輸出成圖片,檔名為 kk.jpg */
/* 另一種呈現方式,只需要一張暫存圖片。 */

Byte[] bf =new byte[10];
ReadBinaryFile(ref bf,Server.MapPath("images/kk.jpg"));
Session["BarCode"]=bf;
IMGSHOW.Src="ShowPic.aspx";
}
private bool ReadBinaryFile(ref Byte[] buffer,string FilePath)
{
//System.IO.File MyFile;
System.IO.Stream FileStream;
if(!File.Exists(FilePath))
return false;


FileStream=File.OpenRead(FilePath);
buffer=new Byte[FileStream.Length];
FileStream.Read(buffer,0,Convert.ToInt32(FileStream.Length));
FileStream.Close();
return true;
}
 
 
public class ShowPic : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
Response.BinaryWrite((byte[])Session["BarCode"]);
Response.End();
}


}

避免 Button 被使用者連續 click 2次以上

有時使用者可以透過鍵盤或是滑鼠,快按兩次以上造成觸發兩次的事件。為了防止這樣的情況發生,可以利用 javascript 的方式,當使用者按下第一次的按鈕後,就將按鈕 disable。這樣就有充分的時間去處理我們 click 事件了。

sample code:private void Page_Load(object sender, System.EventArgs e)

{

b1.Attributes["onclick"]=@"

this.disabled=true;

"+this.GetPostBackEventReference(this.b1);

}

將flash設為通透,讓Menu列可以正常顯示


當我們的頁面有提供功能列時(會有子項目顯示),如果頁面上再擺上 Flash,那我們的功能列就會被 Flash 遮蓋。這時候,可以在 Flash 上面加上

參數設定即可。


<param name="wmode" value="transparent">


完整設定:


<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"

codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=4,0,2,0"

id="index" width="500" height="345">

<param name="movie" value="index.swf">

<param name="bgcolor" value="#FFFFFF">

<param name="quality" value="high">

<param name="wmode" value="transparent">

<param name="allowscriptaccess" value="samedomain">

<embed type="application/x-shockwave-flash"

pluginspage="http://www.macromedia.com/go/getflashplayer"

width="500" height="345"

name="index" src="index.swf"

bgcolor="#FFFFFF" quality="high"

swLiveConnect="true" allowScriptAccess="samedomain"

></embed>

印尼Flash

</object>

DateTime轉String的國別設定

當我們使用了一個DateTime 物件,雖然他預設會去抓系統預設的國別,但有時我們希望他採用我們指定的國別設定,例如希望將
時間的"上午"改成"AM"來表示。以下面例子來作解釋:
using System.Globalization;

DateTimeFormatInfo myEn = new CultureInfo( "en-US", false ).DateTimeFormat;

DateTimeFormatInfo myCh = new CultureInfo( "zh-TW", false ).DateTimeFormat;

DateTime dt=DateTime.Now;

string aa=dt.ToString("yyyy/MM/dd tt hh:mm:ss",myEn); // 會秀出 "AM" or "PM"

string bb=dt.ToString("yyyy/MM/dd tt hh:mm:ss",myCh); // 會秀出 "上午" or "下午"

PS:
hh : 12 小時制
HH:  24 小時制

把ASCII轉成對應的十進位數字

透過 ASCIIEncoding的GetBytes可以達成。而 GetString則勢將10進位數值轉為 ASCII

範例:
char [] CharArray=txt1.Text.ToCharArray();

ASCIIEncoding ascii=new ASCIIEncoding();

string strResult=string.Empty;

if(txt1.Text.Length>0)

{

Byte[ ] encodingByte=ascii.GetBytes(txt1.Text);

strResult=ascii.GetString(encodingByte);

string test=encodingByte[0].ToString();

Response.Write(strResult);

Response.Write(encodingByte[0]);

}

執行JavaScript與PostBack的順序

在ASP.NET高階技巧與控制項實作一書,看到一句話,「我們所看到的前端、後端,其實所有後端都是用前端模擬出來的結果」。實際上都會
轉換成我們在網頁檢視原始碼時所看到的結果是一樣的。這句話應該要銘記在心,蠻受用的。於是我們都可以透過JavaScript來完成要求,
只是看你功力夠不夠高,想不想寫的複雜一點。
我先分析一下,使用:
Button1.Attributes["OnClick"] 與
this.RegisterStartupScript("s",scriptString); 這兩種區別。
如果我們使用的 Button1 是一個Server Control,不管我們在Button1.Attributes["OnClick"]後面接什麼,最後都會再執行一次PostBack。
因為這個宿命已經在 event-handle就決定了。所以我們在 ["OnClick"]後面所接的JavaScript指令會優先被執行。
但是如果我們採用 this.RegisterStartupScript("s",scriptString); 方式,則會先執行我們Server Control的觸發事件裡面的動作,
最後再執行RegisterStartupScript裡面的JavaScript。
所以簡單說,這兩個用法的差別,就是執行順序不同。
然而,如果你要產生 postback - run javascript -postback ,有可能嗎?
可以的,舉裡來說:
Button1.Attributes["OnClick"]=this.GetPostBackEventReference( btnAdd ) + ";alert('ggg');";
Button1是一個Server Control,根據上面的語法,會先觸發一個我們所自定的PostBack,然後再執行
JavaScript。最後,因為他本身是一個Server Control,所以還會在觸發一次他自己的PostBack。
注意,這裡的JavaScript語法前面有加個";" ,主要是為了區別上一個PostBack所產生的語法。

列印時分頁

這是第一頁



<div style='page-break-before:always'>



這是第二頁

列印畫面

有時User會希望能將目前畫面上的資料列印出來,尤其是查詢結果,但是又不想將畫面上的查詢條件或其他跟結果無關的畫面
印出。這時,除了重新去湊出結果的方法之外,還有一個解法。
我們知道,透過 javascript 的 window.print() 就可以將畫面印出了。但現在要處理的,如何將某些畫面隱藏起來。我們可以透過
document.all.SomeObject.style.display='none'的語法來達成。此外,還有一個方法是用
document.all.SomeObject.style.visibility='hidden'。但這個方法有個缺點,就是雖然物件被隱藏了,但他還是站著同樣的版面,
有站著茅坑不拉屎之嫌。所以還是推薦 display的方法。此外,由於我們所使用的Button是一個 webcontrol,也就是按下去會觸發PostBack。所以當我們透過javascript去調整畫面(隱藏某些
物件)後,執行列印功能,可以達到我們想要的結果。而隨之而來的PostBack,會將整個頁面又帶回初始的狀況(即那些被隱藏的物件
都又顯示出來了)。

visibility: 'hidden' / 'visible'
display: 'none'/ ''

將DB的資料轉出成Excel

為了將DB裡面查詢結果輸出成 Excel 格式,介紹一個透過 DataGrid 來完成的方法。因為我們已經知道了如何由DataGrid轉成 Excel,
所以只要將查詢結果轉出到 DataGrid,就可以完成我們的目的。
首先,我們必須先在 WebForm 中新增一個DataGrid,由於我們希望透過DataGrid來存放查詢結果,而將來所產生的的Excel模樣又跟這
DataGrid有關係,也就是這裡的DataGrid樣子長怎樣,將來的Excel就會長怎樣。然而,有可能不希望這DataGrid出現在使用者的眼前,
這簡單,只要我們在程式的最後面將 DataGrid的 Visible 設成 false 就可以解決。範例如下:

private
void Button1_Click(object
sender, System.EventArgs e)


{


System.Configuration.AppSettingsReader app =
new
System.Configuration.AppSettingsReader();


string
ConnectionString=(
string)app.GetValue("DBConnectionString",typeof(string));


string sql=@"


 


select * from Customers;


";


SqlConnection conn = new
SqlConnection(ConnectionString);


SqlCommand sqlCmd = new
SqlCommand(sql, conn);




conn.Open();


DataSet ds=new
DataSet();


SqlDataAdapter oDataAdapter = new
SqlDataAdapter(sqlCmd);


oDataAdapter.Fill(ds, 0, 0, "Table1");


conn.Close();


 


 


dg1.Visible=true;


dg1.DataSource=ds;


dg1.DataBind();


 


Response.Clear();


Response.AddHeader( "Content-Disposition",
"attachment;filename=VisitReport.xls" );


Response.ContentType = "application/vnd.ms-excel";


Response.ContentEncoding=System.Text.Encoding.GetEncoding("Big5");


Response.Write("<html><body>");


ResponseReportOnly(dg1 );


Response.Write("</body></html>");


Response.End();


dg1.Visible=false;


 


}


private
void
ResponseReportOnly(System.Web.UI.WebControls.DataGrid dg)


{


dg.HeaderStyle.CssClass="TblHeader_Prn";


dg.ItemStyle.CssClass="TblOddRow_Prn";


dg.AlternatingItemStyle.CssClass = "TblEvenRow_Prn";


TextWriter tw=new
StringWriter();


HtmlTextWriter hw = new
HtmlTextWriter( tw );


tw.Write( "<div align=center>" + "2005 ADOC Week" + "</div>");


dg.RenderControl( hw );


// 用來自動產生 Excel 檔,如果 User 不希望自動產生,可以拿掉



string
newFilePath=Server.MapPath("tt.xls");


FileStream fs=new
FileStream(newFilePath,FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);


StreamWriter sw=new
StreamWriter(fs,System.Text.Encoding.Default);


 


sw.Write(tw.ToString());


sw.Close();


fs.Close();


Response.Write(tw.ToString());


}


將DataGrid內容輸出到Excel

當我們想要將DataGrid的內容輸出成Excel格式時,可以透過DataGrid這個WebControl的RenderControl方法,將要輸出的內容
導到一個StringWriter裡,再將StringWriter的內容Response到Excel頁面。
範例:
StringWriter sw = new StringWriter();

HtmlTextWriter tw = new HtmlTextWriter(sw);

DataGrid1.RenderControl(tw);

Response.Clear();
Response.AddHeader( "Content-Disposition", "attachment;filename=VisitReport.xls" );
Response.ContentType = "application/vnd.ms-excel";
Response.Write("<html><body>");
Response.Write(sw);
Response.Write("</body></html>");

讓 label 也能觸發 click 事件

當我們開啟檢視原始碼時可以發現,所有的Web控制項都是透過網頁上的同一個doPostBack含式來處理PostBack動作,
而該函式利用「eventTarget」參數,來判斷引發該PostBack動作的是哪一個Web控制項,此外透過「eventArgument」
傳入其他額外的參數。
private void Page_Load(object sender, System.EventArgs e)
{
lbcal.Attributes["OnClick"]= this.GetPostBackEventReference(this.Button3);

if(Request.Form["__EVENTTARGET"]==Button3.UniqueID)
UserDefineEvent();

btnNewWindow.Attributes["OnClick"]="window.open('http://www.kimo.com.tw')";
}

private void UserDefineEvent()
{
Response.Write("I got it!");
}
我們首先定義了一個label物件叫做 lbcal,然後透過lbcal.Attributes["OnClick"]去實作觸發OnClick時的事件。
另外,GetPostBackEventReference( )是用來告知這次的PostBack是由那個物件所觸發的。在範例中,我們指定按下
lbcal標籤時,告知系統這是Button3所觸發的(當然,我們也可以用this.lbcal來代替,只是現在是用"借刀殺人")。

在Page_Load事件中,我們還有透過Request.Form["__EVENTTARGET"]來抓取到底是誰觸發這次PostBack的資訊。

用javascript把物件隱藏

先用 <div> 或 <span> 將物件包起來,之後再使用 javascript 來設定隱藏屬性

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<script>
function hiddenText()
{
list2.style.visibility="hidden";
}
</script>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" method="post" action="">
<span id='list2'>
<input type="text" name="textfield" id="textfield">
</span>
</form>
<p>&nbsp;</p>
<input type="submit" name="Submit" value="Submit" onclick="hiddenText()">
<p>&nbsp; </p>
</body>
</html>

將資料序列化存入ViewState

先建立自己定義的類別:
[System.Serializable()]
public class _InfoStudent
{
public ArrayList Name;
public ArrayList Status;

public _InfoStudent()
{
Name=new ArrayList();
Status=new ArrayList();
}
}
完成後,將序列化的資料指派給ViewState
_InfoStudent InfoStudent=new _Infostudent( );
ViewState["test"]=InfoStudent;
 
從ViewState取資料
InfoStudent=(_InfoStudent)ViewState["test"];

將javascript的值傳給.net

要讓javascript與.net後端溝通,需要透過 hiddent 欄位來作橋樑。
我們需要先建立一個 hiddent 欄位
<input type="hidden" id="HTest" name="HTest" value="My Secrete">

將javascript運算的結果,存入hiddent欄位中

<script lang="JavaScript">
function show()
{
document.Form1.HTest.value="KKBOX";
alert(document.Form1.HTest.value);
}
</script>

最後我們在.net 後端,就可以透過下面方法將hiddent的值取出來

Request.Form["HTest"]

動態指定 WebService 的URL

使用WebService 的時候,可以動態去指定WebService的來源。
舉例來說,我們使用了DebugWeb這個WebService,但是想要動態
改變提供來源的路徑時,就可以使用 Url 來指定即可。

WebReference1.DebugWeb oD=new test01.WebReference1.DebugWeb();
oD.Url="http://10.10.188.6:8088/materialweb/DebugWeb.asmx";

Session Timeout 的設定

要設訂 Session Timeout 的值,要在 web.config 裡面的 <sessionState >

將 timeout 的值作修改即可。

取得目前client端瀏覽器的版本

用到System.Web.HttpContext 這個物件
在程式中,我們可以叫用
this.Request.Browser.Boroser 取得瀏覽器種類
this.Request.Browser.MajorVersion.ToString()取得主版本編號
this.Request.Browser.MinerVersion.ToString()取得次版本編號

Script Debug

對網頁的Script語言除錯的方法。
1.先將IE的 工具-網際網路選項-進階 停用指令碼除錯 的勾選方塊取消
2.在Visual Studio 的 Debug-Process , 選擇所要除錯的網頁(這網頁需事先開啟)(某個Iexplore.exe),
執行 Attach,再對所選定的項目執行 Break
3.執行網頁上可疑的行為,可在Visual Studio的程式碼中設定中斷點,讓Script單步執行

不發出 PostBack 的方法

有時為了避免發出 PostBack,卻要透過Server端存取資料時,可採用下面的作法。
有兩種ActiveXObject可使用,Msxml2.XMLHTTP.4.0的版本,提供較好的MultiThread的作法,
缺點是用戶端的瀏覽器需下載更新軟體才能使用。而
Microsoft.XMLHTTP則是他的前一個版本,
效能可能不如4.0版的好,但是客戶端瀏覽器不需額外安裝更新檔案。



var

oHttp=new
ActiveXObject("Msxml2.XMLHTTP.4.0");



// or for MSXML 3.0 IE5.5



//
var oHttp=
new
ActiveXObject("Microsoft.XMLHTTP");


 


 


 


<SCRIPT language="JScript">

<!--


var retVal=null;

var oHTTP=null;


 


 


function GetCheck(arg)


{


 


        oHTTP= new
ActiveXObject("Microsoft.XMLHTTP");


        oHTTP.onreadystatechange =
oHTTP_onreadystatechange;
  //event handle


       


        var url =
arg+"?ConsignorNO="+Form1.txtConsignorNo.value;


       


 


        try


        {


                oHTTP.Open("GET", url,
false);
//false:同步  true:非同步


                oHTTP.Send();


        }


 


        catch(e)


        {


                //for Debug Only


                alert(e);


        }


}


 


function oHTTP_onreadystatechange()

{


     if (oHTTP.readyState == 4)


     {         

        retVal = oHTTP.responseText;

     }


}



 //-->

 </SCRIPT>


這裡所指定的url,是去開啟一個aspx的檔案,在這個檔案裡的 OnPageLoad()屬性中,我們會寫程式去資料庫抓取我們想要的資料。
我們最後會將資料透過 Response.Write()的方式,寫到頁面上。因為我們採用 GET() 的方式,所以這頁面上的資料都會被我們取回
來。另外,在.aspx的HTML裡,除了codebehinde那一行留著,其他都要刪掉。在Response.Write()執行完之後,也要用Response.End()
當結尾,避免後面被塞了一些垃圾標籤。

把1 format成0001

string aa=string.Format("{0:0000}",1);

補充:20110728

在 GridView 裡,也常常會遇到需要顯示金額得情況,三位一撇、或需要到小數第二位。假如在 GridView 裡是使用:<%#Eval("money") %> 來繫結金額,那可以改成以下寫法來達到三位一撇、到小數第二位的效果:

<%#Eval("money","{0:N2}") %>

N2: 是指到小數第二位
N3: 到小數第三位
N0:則是不顯示小數

另外,
<%#DataBinder.Eval(Container.DataItem,"money","{0:N2}") %>
也是有同樣的效果。


參考:
01.Asp.net中DataBinder.Eval裡String Format用法的總結
02.ASP.NET string.Format 格式參數

FileField控制項

使用 FileField控制項時,會自動在右邊產生一個"瀏覽"的控制項。如果是要將所選擇檔案的內容上傳,記得要加上

<form id="selector" method="post" enctype="multipart/form-data"
runat="server">。



enctype是用來確保檔案的內容會被送出,而不是完整路徑。

把某個控制項設為聚焦

方法一:



private void
Page_Load(object sender, System.EventArgs e)


{



 



string clientScript="";


clientScript=string.Format(@"


<script language='javascript'>


<!--


document.Form1.{0}.focus();


//-->


</script>",txtName.ClientID);


this.RegisterStartupScript("SS",clientScript);


}


方法二:


如果是要在 pageload 的階段就設為具焦,可以寫在

<body onload="document.Form1.TextBox1.focus( );">


如果是要在某個按鈕被觸發之後,才設為具焦,可以先將

<body id="Body1" runat=server> 設為 在 server 端執行的物件

然後在事件觸發之後,寫

Body1.Attributes["onload"]="document.Form1.TextBox1.focus( );";



 

判斷所抓的值在SQL Server中是否為 NULL

要透過 System.DBNull.Value

明明只是警告,卻無法編譯成功

有時候會發現,只是宣告了某個變數沒去使用,這樣的警告也會造成編譯失敗。解決的方法,是在 Project Setting。
選擇 Project-> 專案名稱 Properties:
在左邊的是窗,選擇 Configuration Properties->Build
在右邊的視窗,選擇 Treat Warnings As Errors,將這個屬性設成 false 就可以了

讀取 XML 檔案

Ori.xml  程式碼:
-------------------------------------------------
<Root>

<Book>

<BookID>1</BookID>

<BookName>Good More</BookName>

<BookPrice>38</BookPrice>

<BookSale>40</BookSale>

</Book>

<Book>

<BookID>2</BookID>

<BookName>Good Better</BookName>

<BookPrice>55</BookPrice>

<BookSale>60</BookSale>

</Book>

<Book>

<BookID>3</BookID>

<BookName>Good Peace</BookName>

<BookPrice>25</BookPrice>

<BookSale>30</BookSale>

</Book>

</Root>
 
讀取 XML 的範例:
  private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
DataSet ds=null;
string xmlFilename=null;
if(!IsPostBack)
{
try
{
xmlFilename=Server.MapPath(".")+"\\ori.xml";
ds=new DataSet();
ds.ReadXml(xmlFilename);
DataGrid1.DataSource=ds.Tables["Book"];
DataGrid1.DataBind();
}

catch
{
}

finally
{
if(ds!=null)
ds.Dispose();
}
}
}

操作 Repeater 內的控制項

以下是在 Repeater 控制項的 ItemDataBound 方法內,利用FindControl找到我們所要的控制項,並決定他的相關屬性
private void rpPollution_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if (e.Item.ItemIndex < 0)
{
return;
}

CertificatedLetter cl = new CertificatedLetter(artcDB, artcCmd);
Control ctl = null;
double weight = 0.0;

ctl = e.Item.FindControl("btnDelete");
if (ctl != null)
{
Button btnDelete = (Button)ctl;
btnDelete.Attributes["PollutionId"] = Guid.NewGuid().ToString();
}

ctl = e.Item.FindControl("btnCopy");
if (ctl != null)
{
Button btnCopy = (Button)ctl;
btnCopy.Attributes["PollutionId"] = Guid.NewGuid().ToString();
}

}

如果要找 DataGrid 裡面的每一項, 就用 foreach(DataGridItem it in myGrid.Items)
如果要找 Repeater 裡面的每一項, 就用 foreach(RepeaterItem it in myRepeater.Items)
如果要找 DataView 裡面的每一項, 就用 foreach(DataRowView it in myDataView)

讓 DataGrid 跨欄的方法

<table id="table1" cellSpacing="0" rules="all" border="1" <tr>

<tr>

<td align="middle" rowSpan="2">書籍編號</td>

<th rowSpan="2">書籍名稱</th>

<th colSpan="2">定價機制</th>

</tr>

<tr>

<th>進價成本</th>

<th>銷售價格</th>

</tr>

<tr>

<td>1</td>

<td>Good More</td>

<td>38</td>

<td>40</td>

</tr>

<tr>

<td>2</td>

<td>Good Better</td>

<td>55</td>

<td>60</td>

</tr>

<tr>

<td>3</td>

<td>Good Peace</td>

<td>25</td>

<td>30</td>

</tr>

</table>





private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Header)
{
TableCellCollection tcl=e.Item.Cells;
tcl.Clear();

tcl.Add(new TableCell());
tcl[0].Attributes["align"]="center";
tcl[0].RowSpan=2;
tcl[0].Text="書籍編號";
tcl.Add(new TableHeaderCell());
tcl[1].RowSpan=2;
tcl[1].Text="書籍名稱";
tcl.Add(new TableHeaderCell());
tcl[2].ColumnSpan=2;
tcl[2].Text="定價機制</th></tr><tr><th>進價成本</th><th>銷售價格";
}
}

Crystal Report 的列印

.Net 所附贈的Crystal Report,它的列印功能只能印到連接Server的那台印表機,所以非常不方便。
為了能讓user在他的電腦上列印,所以才會需要將列印文件轉換成 word、或 pdf 檔。

Server Control生命週期

在開發 Server Control的過程中,深刻瞭解到,一定要先搞懂它的生命週期。因為在每一次的PostBack事件中,
常常需要去記錄上一次的狀態,所以我們會透過 ViewState來儲存。但千萬要記得,你要存的資料,一定要在
執行Rener Contents之前執行,否則,你的資料將不會被保存下來。



以下是附上ASP.NET 元件的生命週期,以茲比較。


自訂浮點數

在double.ToString(string format,System.IFormatProvider provider)可提供轉換
如:

double dvalue=12.12345;
string strtest=dvalue.ToString(("f2",null); // strtest -> 12.12 (小數第二位)
double aa1=double.Parse(dvalue.ToString("f2",null)); // 將string 轉會為 double

日期格式

在DataGrid,有時候某個欄位會需要展示特定的日期格式,例如要將2004/1/1號轉為2004/01/01。我們可以利用DataGrid所提供的 Property Builder,
將該欄位的Data formatting expression設定為{0:yyyy/MM/dd}即可。相關其他格式請參考 hana 的「ASP.NET string.Format 格式參數」。
如果不是在DataGrid,而是一般欄位,那我們可以將日期轉成DateTime 類別,再用DateTime.ToString(string format)去轉換。
如:
DateTime dDate=DateTime.Parse("2004/1/1");
Somefield.Text=dDate.ToString("yyyy/MM/dd");
這樣,就可以順利轉換成功了。

控制項的 ClientID

每一個控制項,都會有一個ID以供辨識
下面範例介紹列出所有控制項ID
void Page_Load(object sender,EventArgs e)
{
Response.Write("Control_ClientID Sample");
// Get the list of all controls.
IEnumerator myEnumerator = Controls.GetEnumerator();
Response.Write("Enumerating Controls Collection");
while(myEnumerator.MoveNext())
{
Control myControl = (Control) myEnumerator.Current;
// Display the ClientID property
Response.Write("The ClientID property of Control : " + myControl.ClientID);
}
}

.net 版本問題

我將.net程式部署到另一台機器時,當程式執行會出現需要重新安裝或執行 aspnet_regiis 的話面,有可能是該電腦上同時有.net 1.0 與 1.1版本共存所致,目前已知的解決方法,是執行下面指令:

aspnet_regiis -i

aspnet regiis -r

如果想要讓不同版本共存,那可以採用下面方法:
假希望讓某個 RUN .net 1.0專案共存於 .net 1.1 的機器上,可以在 C:\windows\Microsoft.Net\Framework\v1.0.3705下面執行

Aspnet_regiis.exe -s W3SVC/1/ROOT/WebApplication1

WebApplication1 是我們專案的目錄
-s 代表讓整個目錄包含子資料夾都用 .net 1.0
-sn 則是代表只有主目錄採用 1.0 而子目錄則採用 預設的

javascript關閉視窗

<input type=button value=關閉視窗 onclick="window.opener='meizz';window.close()">


如果我直接下window.close()會出現警告訊息: "網頁正在試圖關閉視窗,是否關閉"

改用上面語法後就不會了。

使用 thread

// Global.asax.cs



using System;

using System.Collections;

using System.ComponentModel;

using System.Web;

using System.Web.SessionState;

using System.Threading;



namespace test

{

/// <summary>

/// Summary description for Global.

/// </summary>

public class Global : System.Web.HttpApplication

{

/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.IContainer components = null;





//記錄 thread 每次會去設定的變數

public static string strKeep;



//宣告我們所要產生的 thread

public static Thread checkThread;





//宣告讓 thread 等待的時間

static TimeSpan waitTime = new TimeSpan(0, 0, 10);//hh,mm,ss





public Global()

{

InitializeComponent();

}



protected void Application_Start(Object sender, EventArgs e)

{r>


//start a thread to do AddKeep( ) method



ThreadStart threadDelegate = new ThreadStart(AddKeep);

checkThread = new Thread(threadDelegate);

checkThread.IsBackground = true;

checkThread.Start();

}

 

protected void Session_Start(Object sender, EventArgs e)

{





if(!checkThread.IsAlive)

{

ThreadStart threadDelegate = new ThreadStart(AddKeep);

checkThread = new Thread(threadDelegate);

checkThread.IsBackground = true;

checkThread.Start();

}







}



protected void Application_BeginRequest(Object sender, EventArgs e)

{



}



protected void Application_EndRequest(Object sender, EventArgs e)

{



}



protected void Application_AuthenticateRequest(Object sender, EventArgs
e)

{



}



protected void Application_Error(Object sender, EventArgs e)

{



}



protected void Session_End(Object sender, EventArgs e)

{



}



protected void Application_End(Object sender, EventArgs e)

{r>


}



public static void AddKeep()

{

while(true)

{

try

{

strKeep=string.Format("{0}",int.Parse(strKeep)+1);

}

catch

{

strKeep="0";

}



Thread.Sleep( waitTime );

}



}



#region Web Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{   

this.components = new System.ComponentModel.Container();

}

#endregion

}br>
}

 

TextBox在MultiLine的狀況下,設定最大輸入字元

TextBox裡面的 MaxLength屬性,只適用於 singleline 或 password,所以在 MultiLine的情況下,所設定的 MaxLength 會失效。這時,我們可以透過JavaScript或是自訂的驗證控制項來解決這個問題。下面列出的是我們自訂的驗證控制項。

// 寫在 .ASPX 的 javascript宣告裡面
function CheckLength(src,args)
{
  if(document.activeElement.id == "btnOK" )
  {
    var getElement = document.getElementById("txbAbstractShort").value;

    if(getElement.length > 255)
    {
      args.IsValid=false;
    }
  }
  return args.IsValid;
}


<asp:customvalidator clientvalidationfunction="CheckLength" controltovalidate="txbAbstractShort" display="Dynamic" errormessage="上首頁摘要最大字元長度不可超過256" id="custCheckLength" runat="server">
</asp:customvalidator>

補充:20110706
另外提供 jQuery 的寫法,比較起來,似乎更精簡了。
<script>
    $(function () {
        $("textarea[id*=tbx_changereason]").blur(function () {            
            if ($(this).val().length > 255) {
                alert('最大字元長度不可超過255');
                $("textarea[id*=tbx_changereason]").val($(this).val().substring(0, 255));
            }
        });
    });
</script>

使用時,只需要將 tbx_changereason 修改成自己的控制項 id ,而 出現3次的數字255,則是允許最大的輸入長度。

參考:
01:TextBox 在 MultiLine 模式時無法使用 MaxLength 屬性
02:textbox的属性设置成TextMode="MultiLine" 后maxlength就没起作用了??怎么办?
03:textbox的textmode取為multiline時,其maxlength不起作用 解決方法

讓網頁固定時間自動更新

<meta http-equiv="Refresh" content="10;" url="IWT.aspx">

content : 更新間格秒數

url:要更新的網址

使用 StreamReader 的注意事項

一般在 Visual Studio asp.net 都會將編碼設為 utf8。當使用 StreamReader 時,要注意所要讀入的檔案是不是 utf8格式。一般我們所建立的文字檔預設並非utf8格式,所以會出現讀不到資料的情況。這個時候,我們必須手動將這份要讀入的文件轉成utf8格式,建議可使用 ultra-edit

抓aspx 檔案內某個控制項的值

.aspx


<input type=text size=6 name="tbTB006"
value='<%#
DataBinder.Eval(Container.DataItem, "ERP_Spec") %>'>


.cs


Request.Form.GetValues("tbTB006")[i].ToString();


如果 tbTB006 存在於DataList或是DataRepeat中,可透過 [i]來指定要存取字串陣列中的哪一項資料


注意,value 的值一定要設,這是用來區別的判斷項目

Call by reference ( ref )

Example

// cs_ref.cs

using System;

public class MyClass

{

public static void TestRef(ref char i)

{

// The value of i will be changed in the calling method

i = 'b';

}



public static void TestNoRef(char i)

{

// The value of i will be unchanged in the calling method

i = 'c';

}



// This method passes a variable as a ref parameter; the value of the

// variable is changed after control passes back to this method.

// The same variable is passed as a value parameter; the value of the

// variable is unchanged after control is passed back to this method.

public static void Main()

{



char i = 'a'; // variable must be initialized

TestRef(ref i); // the arg must be passed as ref

Console.WriteLine(i);

TestNoRef(i);

Console.WriteLine(i);

}

}




Output

b

b

 

INFO: ASP.NET Code-Behind Model Overview

http://support.microsoft.com/default.aspx?scid=kb;EN-US;303247

Code Behind就是所謂的代碼分離,自從Microsoft公司推出了ASP.NET以後,Code Behind就是一個熱門的話題。在一般的ASP.NET檔中,Code Behind主要是用二個檔來創建一個ASP.NET的頁面,其中一個是設計檔,一般以.aspx或者.ascx做為副檔名,而另外一個是程式碼檔,一般以.vb或者.cs做為副檔名,其程式設計語言主要是VB.Net或者是C#。

用過ASP編過程式的人都知道,ASP程式是把介面設計和程式設計混合在一起的。因此當程式設計人員要修改應用程式介面佈局的時候,就往往需要更改大量與介面無關的代碼,對於一個小程式,工作量不是很大,如果對於代碼量很大的程式,就是一項工作量不小的事情。而Code Behind把介面設計代碼和程式設計代碼以不同的檔分開,對於代碼的重複使用,程式的調試和維護都是革命性的。還有一點是,當你發佈你的網站的時候,你就可以利用這種技術來有效的保護你的代碼。這對於程式的安全性是一個提高。

Asp.net轉Excel中文亂碼問題

要將CrystalReport資料轉成Excel時,轉出後的中文字會變成亂碼。下面為先前會造成亂碼的程式:


Response.Clear();

Response.AddHeader( "Content-Disposition",
"attachment;filename=VisitReport.xls" );

Response.ContentType = "application/vnd.ms-excel";


Response.Write("<html><body>");

ResponseReportOnly(dgReport );

Response.Write("</body></html>");

Response.End();


其實,只要多加一行,就可以解決


Response.Clear();

Response.AddHeader( "Content-Disposition",
"attachment;filename=VisitReport.xls" );

Response.ContentType = "application/vnd.ms-excel";


Response.ContentEncoding=System.Text.Encoding.GetEncoding("Big5");


Response.Write("<html><body>");

ResponseReportOnly(dgReport );

Response.Write("</body></html>");

Response.End();


 


另一個解法,(比較好): source ~   http://www.neo.com.tw/archives/000243.html



因為從 Windows 2000 之後的作業系統在檔案處理採用Unicode ,所以 .Net 的檔案處理也是預設為 Unicode
,但是文字檔大多還是以 ANSI 儲存,而且裡面的編碼還是用 Big5,所以才會造成中文亂碼的狀況,也就是在讀取檔案的時候就要指定編碼的樣式。


本來會造成亂碼的語法如下:


Dim reader As StreamReader =

New StreamReader(FileName)


但是問題來了,System.Text.Encoding 裡面一堆,ASCII、UTF-8 等等的,要選哪個好?


其實很簡單,用 System.Text.Encoding.Default 告訴 StreamReader 目前作業系統的編碼即可。


[VB .Net] 的寫法


Dim reader As StreamReader = _

New StreamReader(FileName, System.Text.Encoding.Default)


[C# .Net] 的寫法


StreamReader reader = _

New StreamReader(FileName, System.Text.Encoding.Default)


Session State的探討

Reference ms-help://MS.VSCC.2003/MS.MSDNQTR.2003OCT.1033/cpguide/html/cpconSessionState.htm

讓DropDownList元件自動根據內容長度增加寬度

先檢查DropDownList元件是否被你無意中設定了寬度,如果有,那就將寬度的限制拿掉。因為DropDownList預設就會根據內容大小自動調整寬度。

SQL Server 分大小寫(定序)方法

ALTER DATABASE aaa
COLLATE Chinese_Taiwan_Stroke_BIN

系統登錄檔的讀寫

要額外using的有: Microsoft.Win32
 

寫入登錄檔
RegistryKey key=Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("ADONETDB");
key.SetValue("cnstr",text1.Text);

讀取登入檔
RegistryKey key=Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("ADONETDB");
text1.Text=key.GetValue("cnstr").ToString();
 

擴權的用法

如果我們有一支程式是要存取該台Server上的某個非虛擬目錄或站台裡的資料夾,並將所得到的結果展示給我們的網頁。我們可以在某個導向指令
http://MyProject/call.aspx?access.aspx

這樣就會先去執行access.aspx去存取Server上的資料,待處理完後將結果回傳給call.aspx

sln絕對路徑修改

當我們有很多人同時開發案子時,在建立一個Solution時,可能會同時包含有許多個project。而我目前就遇到這樣的情形,為了要使用分頁元件,所以要額外加入兩個chipsoft的專案。但這次在加入專案時,不知為何會將這兩個專案的實體路徑寫入solution中,這樣使得每一個開發案子的同仁都必須根據這些實體路徑來擺放程式。更慘的是有人的NoteBook上並沒有D槽,但實體路徑又剛好設在D槽,使得別人無法正常取得整個案子的程式碼。

為了將每個project的路徑都改為相對路徑,必須去修改.sln這個檔案。我的作法是開啟Visual Source Safe,將 .sln檔案 check out,再用UltraEdit去修改,改完之後再將該檔案check in。

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChipSoft.Data.DataSourceInfo", "D:\program\Nano\ChipSoft.Data.DataSourceInfo\ChipSoft.Data.DataSourceInfo.csproj", "{3AFF2543-9DE2-47CB-8F35-4F7AB560A3B1}"

改成 ->

Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChipSoft.Data.DataSourceInfo", "ChipSoft.Data.DataSourceInfo\ChipSoft.Data.DataSourceInfo.csproj", "{3AFF2543-9DE2-47CB-8F35-4F7AB560A3B1}"

 

SccProjectUniqueName2 = D:\\program\\Nano\\ChipSoft.Data.DataSourceInfo\\ChipSoft.Data.DataSourceInfo.csproj

改成 ->SccProjectUniqueName2 = ChipSoft.Data.DataSourceInfo\\ChipSoft.Data.DataSourceInfo.csproj

SccLocalPath2 = D:\\program\\Nano

改成

SccLocalPath2 = .

Add Reference

如果要在 SolutionAdd Reference,可以使用 add from projects,這樣只要元件有更改,那參照也會跟著改。如果是add from .Net,則是參照dll檔而已,下次當元件有更改時,就無法找到對應的版本了。

JavaScript 注意事項

如果在.Net中有 include JavaScript的檔案時,要注意編碼的問題。如果目前的專案是Unicode,必須確認 include 進來的檔案也是 Unicode。通常在 create javascript檔案時,預設都會是 Big5,所以必須把他存成 Unicode的格式。可以使用 File/Advance Save Options / Unicode without singnature

讓 hidden欄位經過postback後還能保留

過去在asp的程式裡面,會用hidden來保存一些值,但是在asp.net裡面,這些hidden欄位的值經過postback之後,就會消失。原因,在於我們在宣告hidden欄位的時候,預設並不會將他設成 runat=server,也就是說,我們必須手動去加上 runat=server 這一串,才能讓我們的hidden欄位經過postback 之後還能夠保留資料。

<%# %>

如果要在程式中使用<%#  %>的語法,記得要在 page load裡面加入 DataBind( )

把字串轉型為enum型態

using System;
enum DayOfWeek:byte {Mon=1,Tue=2};
class EnumExample
{
public static void Main()
{
DayOfWeek day=(DayOfWeek)(byte)1;
Console.WriteLine(day);
Console.WriteLine( Enum.Parse(typeof(DayOfWeek),"Tue") );
}
}

抓目前Web執行的目錄名稱

Request.ApplicationPath

抓目前Web的IP

Request.ServerVariables["SERVER_NAME"]

開啟檔案

這個方法,不用擔心所要開啟的檔案是否存在於網站的根目錄下面。

Response.Clear();
Response.AddHeader( "Content-Disposition", "attachment;filename=woman.mp3" );
Response.WriteFile("d:\\woman.mp3");
Response.End();

 

換行

當在 TextBox 中要換行時,要輸入 \r\n


string str="ggg\r\nddd";

tB1.Text=str;

JavaScript Includes

雖然你可以將 javascript 直接放在目前正在開發的網頁裡,

但是這不會是比較好的方式。接下來介紹的是將 javascript

統一放到一個頁面,這樣至少會有兩個好處:



1.透過更新一個檔案,就可以將所有的頁面同步更新

2.可以將程式瘦身。每一個頁面不需要重新再下載

javascript。



把 JavaScript嵌入的語法:

<script src="../quirksmode.js"></script>



避免出錯的方式:

*不要將 <script> 標籤寫到要用來放 JavaScript 的檔案裡頭,

只需要在裡面放純的 JavaScript 程式碼即可。


ref:
http://www.quirksmode.org/js/placejs.html

javascript eval

javascript eval( ) 函式,會執行括號內所寫的腳本語言。
透過這個功能,我們可以動態組出 javascript 語法,
最後再透過 eval( ) 去執行。

JavaScript return false

當執行 javascript 時,如果我們在最後面加上了
" return false; ",就會停止程式繼續執行下去。
而且在前端瀏覽器就會結束,不會執行到Server端。
所以,user 就不會感受到畫面會閃一下。

JavaScript 取出 radio 裡面所選擇的值

js example:


function show()

{

    var s_result;



    for( var i=0 ; i< document.all.rbl.length ; i++)

    {

        if(document.all.rbl[i].checked)

        s_result=document.all.rbl[i].value;



    }



    alert(s_result);



}

JavaScript 另開新視窗

<a href="javascript:window.open('http://www.kimo.com.tw','')"> ... </a>;

如何在網頁上傳大檔案



在web.config加上這一行,代表可以上傳20M
這方法只支援 .net 1.1

ps: 要加在 裡面

JavaScript 執行複製、貼上、剪下功能

透過 javascrip 去實作瀏覽器的複製、貼上、剪下  功能。目前介紹的語法,適用於 IE 5.0 以上。


複製:將某個 textbox 或 textarea 的內容複製。


<script language="JavaScript" type="text/javascript">

<!--

function addMyClipboard()

{

var r=document.Form1.txtClipboard.createTextRange();

r.execCommand("Copy");

}

//-->

</script>


其中的 txtClipboard 是畫面上的一個控制項。

<INPUT TYPE="text" id="txtClipboard">


除了使用 text 之外,也可適用於 textarea


當然,為了提高程式再利用率,可以將上述的程式更進一步寫成函式。


function addMyClipboard( obj)

{

    var r=obj.createTextRange();

    r.execCommand("Copy");

}


貼上:


首先,必須先將游標移到所要貼上的文字物件上,

我以一段 javascript 語法來說明:


document.Form1.TextBox1.focus();

document.execCommand("Paste");


剪下:


則將程式修改如下:


function cutMyClipboard(obj)

{

var r=obj.createTextRange();

r.execCommand("Cut");



}


 


參考:


作者: jeffwang (---.adsl.seed.net.tw)

日期: 07-24-05 21:33



剛剛在別的網頁(http://www2.cyut.edu.tw/~s9154610/jscript.html)

找到可以將text裡面的內容複製到剪貼簿裏面



<script language="JavaScript" type="text/javascript"> <!--

function addClipboard2(obj) {

 var r = obj.createTextRange() ;

 r.execCommand("Copy") ;

}

//--> </script>



<input type="text" id="address" onClick="addClipboard2(this)">



不過這是需要需要按enter鍵

是否有方法是不用按enter鍵

而可以將一個變數var裡面的字串存入剪貼簿中

因為我已經可以將網頁上選取的文字儲存起來到變數中

而我想將這個變數中的字串存到剪貼簿中

不用透過事件觸發 例如滑鼠點兩下、按enter鍵...



function getSelectionHTML()

{

var h = document.selection.createRange().htmlText;

document.jeff.T1.value=h;

return document.selection.createRange().htmlText;

}

請多指教

謝謝

 

JavaScript 切換網頁

location.href='www.kimo.com.tw';

將Table整個Row隱藏

如果要隱藏<Table>裡面的某一個Row的內容,光將Row裡面的元件的Visible屬性設為False是不夠的.因為在畫面上還是會出現多一條框線,很醜.為避免這個問題,可以用以下的方法:



<Table>

    <TR>

        <TD></TD>

        <TD></TD>

    </TR>

</TABLE>



改成:



<Table>

    <TR id="RowName"  runat="server">

        <TD></TD>

        <TD></TD>

    </TR>

</TABLE>



當我們在Design部分做完這些修改後,於 .cs檔中會多出一行於開頭附近:

protected System.Web.UI.HtmlControls.HtmlTableRow RowName;

接著,我們就可以在 .cs中透過 RowName來控制該 <Row>的 Visible

避免PostBack後,密碼欄位消失

如果畫面上有一個存放密碼的欄位,當其他控制項觸發PostBack之後,會造成原先的密碼欄位被清空。為了保留原先的密碼設定值
,可以採用下面方法:

private void Page_Load(object sender, System.EventArgs e)
{
TextBox1.Attributes.Add("value", TextBox1.Text);
}

Empty Page

如果要執行JavaScript指令,可以搭配 RegisterStartupScript( ),可避免造成背景一片空白.

ex : String scriptString = @"

<script language="JavaScript">

<!-- begin

alert('日期格式不正確') ;

//end -->

</script>

";



this.RegisterStartupScript("s",scriptString);

ViewState

在 .Net 的 WebControl,如果不是輸入控制項,則預設都會自動維護狀態資訊(ViewState).在Call Back環境下,這些ViewState可以為我們保留重要資訊.當然,使用ViewState會讓系統效能變差,如要關閉這項功能,可以將屬性 EnableViewState 設為 False 即可.

如果不想用到 UI來紀錄資訊,也可以在 .cs中直接使用 ViewState 這個指令,他會像使用 Session一樣,為我們保留所需要的資訊. ex: ViewState["aa"]="dddddd"

dll version problem

當遇到dll檔版本問題時,先將產生dll檔專案的bin與obj子目錄下的檔案殺掉.接著在 User Web Control 上移除原有的元件,再新增元件,即可解決版本衝突所造成的問題

此外,還有個問題,如果將產生dll的專案與我們目前專案整合在同一個solution下面,每當我們對solution重新編譯時,他除了將我們目前的專案重新編譯外,還會將dll專案重新編譯過一次.如此,就可能會讓dll檔的版本序號改變.解決方法,是將dll專案上的AssembltInfo.cs的

[assembly: AssemblyVersion("1.0.*")]

改成 [assembly: AssemblyVersion("1.0.0")]
將他的序號固定住就可以,不過,還有一個比較好的方法

我們可以在 solution 的屬性中, 找到 Configuration Property, 把dll專案的 Build 選項取消掉,這樣每次在重件整個solution時,就不會將dll專案也一同重新編譯.

在 SQL 2000 實作 split 的功能

在 SQL 2000 裡並未提供類似 split 的含式,但目前已經知道 SQL 2005 開始內建這個函式了。
如果在不支援 split 的環境下卻仍要實作這功能,可以參考下面作法。

他是將 split 的功能註冊在 SQL 2000 的「使用者自訂函數」裡頭。如果你不想這麼做的話,當
然也可以將他抽離出來,獨自加到你自己的 SQL 語法裡。



CREATE FUNCTION split
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(

Id int identity(1,1),
Value nvarchar(100)
)
AS
BEGIN

While (Charindex(@SplitOn,@List)>0)
Begin

Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End

Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))

Return
END


select * from split('hello,dd,ssss,ssx',',')

CASE

評估條件清單並傳回多種可能的結果運算式之一。

CASE 分為兩種格式:

  1. 簡單 CASE 函數會比較運算式與一組簡單運算式,以決定其結果。

     
  2. 搜尋 CASE 函數會評估一組布林運算式,以決定其結果。

兩種格式都支援選用的 ELSE 引數。

語法

簡單 CASE 函數:

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END

搜尋 CASE 函數:

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END

引數

input_expression

是使用簡單 CASE 格式時評估的運算式。input_expression 是任何有效的 Microsoft® SQL Server™ 運算式。

WHEN when_expression

是使用簡單 CASE 格式時要比較 input_expression 的簡單運算式。when_expression 是任何有效的 SQL Server 運算式。input_expression 和各 when_expression 的資料型別必須相同,或者必須為隱含轉換。

n

是指出可用多重 WHEN when_expression THEN result_expression 子句或多重 WHEN Boolean_expression THEN result_expression 子句的替代符號 (placeholder)。

THEN result_expression

input_expression 等於 when_expression 評估為 TRUE 時,或 Boolean_expression 評估為 TRUE 時傳回的運算式。result expression 是任何有效的 SQL Server 運算式。

ELSE else_result_expression

是無任何比較運算評估為 TRUE 時傳回的運算式。如果忽略這個引數,且無任何比較運算評估為 TRUE,則 CASE 會傳回 NULL。else_result_expression 是任何有效的 SQL Server 運算式。else_result_expression 和任何 result_expression 的資料型別必須相同,或者必須為隱含轉換。

WHEN Boolean_expression

是使用搜尋 CASE 格式時評估的布林運算式。Boolean_expression 是任何有效的 Boolean 運算式。

結果型別

自 result_expressions 和選用的 else_result_expression 中的一組型別傳回最高優先權型別。

結果值
簡單 CASE 函數:
  1. 評估 input_expression,然後依指定次序評估各 WHEN 子句的 input_expression = when_expression。

     
  2. 傳回評估為 TRUE 的第一個 (input_expression = when_expression) 的 result_expression。

     
  3. 若無 input_expression = when_expression 評估為 TRUE,則在指定 ELSE 子句時,SQL Server 會傳回 else_result_expression;若未指定 ELSE 子句,則傳回 NULL 值。
搜尋 CASE 函數:
  1. 依指定次序評估各 WHEN 子句的 Boolean_expression。

     
  2. 傳回評估為 TRUE 的第一個 result_expression。

     
  3. 若無 Boolean_expression 評估為 TRUE,則在指定 ELSE 子句時,SQL Server 會傳回 else_result_expression;若未指定 ELSE 子句,則傳回 NULL 值。
範例
A. 使用具有簡單 CASE 函數的 SELECT 陳述式

在 SELECT 陳述式中,簡單 CASE 函數只能檢查等式,不可進行其他比較。這一範例使用 CASE 函數來改變書籍目錄的顯示方式,使它們更容易讓人瞭解。

USE pubs
GO
SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO

以下為結果集:

Category            Shortened Title           Price                     
------------------- ------------------------- --------------------------
Business You Can Combat Computer S 2.99
Business Cooking with Computers: S 11.95
Business The Busy Executive's Data 19.99
Business Straight Talk About Compu 19.99

avg
==========================
13.73

Category Shortened Title Price
------------------- ------------------------- --------------------------
Modern Cooking The Gourmet Microwave 2.99
Modern Cooking Silicon Valley Gastronomi 19.99

avg
==========================
11.49

Category Shortened Title Price
------------------- ------------------------- --------------------------
Popular Computing Secrets of Silicon Valley 20.00
Popular Computing But Is It User Friendly? 22.95

avg
==========================
21.48

Category Shortened Title Price
------------------- ------------------------- --------------------------
Psychology Life Without Fear 7.00
Psychology Emotional Security: A New 7.99
Psychology Is Anger the Enemy? 10.95
Psychology Prolonged Data Deprivatio 19.99
Psychology Computer Phobic AND Non-P 21.59

avg
==========================
13.50

Category Shortened Title Price
------------------- ------------------------- --------------------------
Traditional Cooking Fifty Years in Buckingham 11.95
Traditional Cooking Sushi, Anyone? 14.99
Traditional Cooking Onions, Leeks, and Garlic 20.95

avg
==========================
15.96

(21 row(s) affected)
B. 使用具有簡單和搜尋 CASE 函數的 SELECT 陳述式

在 SELECT 陳述式中,搜尋 CASE 函數允許根據比較值來取代結果集中的值。這一範例根據書籍的價格範圍以文字註解來顯示價格 (money 資料行)。

USE pubs
GO
SELECT 'Price Category' =
CASE
WHEN price IS NULL THEN 'Not yet priced'
WHEN price < 10 THEN 'Very Reasonable Title'
WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
ELSE 'Expensive book!'
END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO

以下為結果集:

Price Category        Shortened Title     
--------------------- --------------------
Not yet priced Net Etiquette
Not yet priced The Psychology of Co
Very Reasonable Title The Gourmet Microwav
Very Reasonable Title You Can Combat Compu
Very Reasonable Title Life Without Fear
Very Reasonable Title Emotional Security:
Coffee Table Title Is Anger the Enemy?
Coffee Table Title Cooking with Compute
Coffee Table Title Fifty Years in Bucki
Coffee Table Title Sushi, Anyone?
Coffee Table Title Prolonged Data Depri
Coffee Table Title Silicon Valley Gastr
Coffee Table Title Straight Talk About
Coffee Table Title The Busy Executive's
Expensive book! Secrets of Silicon V
Expensive book! Onions, Leeks, and G
Expensive book! Computer Phobic And
Expensive book! But Is It User Frien

(18 row(s) affected)
C. 使用具有 SUBSTRING 和 SELECT 的 CASE

這一範例使用 CASE 和 THEN 來產生作者清單、書籍識別碼和各作者已經寫過的書籍型別。

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+
RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,
Type =
CASE
WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'
WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'
END
FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id

以下為結果集:

Name                      au_id       title_id Type               
------------------------- ----------- -------- -------------------
Johnson White 172-32-1176 PS3333 Psychology
Marjorie Green 213-46-8915 BU1032 Business
Marjorie Green 213-46-8915 BU2075 Business
Cheryl Carson 238-95-7766 PC1035 Popular Computing
Michael O'Leary 267-41-2394 BU1111 Business
Michael O'Leary 267-41-2394 TC7777 Traditional Cooking
Dean Straight 274-80-9391 BU7832 Business
Abraham Bennet 409-56-7008 BU1032 Business
Ann Dull 427-17-2319 PC8888 Popular Computing
Burt Gringlesby 472-27-2349 TC7777 Traditional Cooking
Charlene Locksley 486-29-1786 PC9999 Popular Computing
Charlene Locksley 486-29-1786 PS7777 Psychology
Reginald Blotchet-Halls 648-92-1872 TC4203 Traditional Cooking
Akiko Yokomoto 672-71-3249 TC7777 Traditional Cooking
Innes del Castillo 712-45-1867 MC2222 Modern Cooking
Michel DeFrance 722-51-5454 MC3021 Modern Cooking
Stearns MacFeather 724-80-9391 BU1111 Business
Stearns MacFeather 724-80-9391 PS1372 Psychology
Livia Karsen 756-30-7391 PS1372 Psychology
Sylvia Panteley 807-91-6654 TC3218 Traditional Cooking
Sheryl Hunter 846-92-7186 PC8888 Popular Computing
Anne Ringer 899-46-2035 MC3021 Modern Cooking
Anne Ringer 899-46-2035 PS2091 Psychology
Albert Ringer 998-72-3567 PS2091 Psychology
Albert Ringer 998-72-3567 PS2106 Psychology

(25 row(s) affected)