2007年4月27日 星期五

將得到的數字取到小數點以下2位四捨五入

'= 將得到的數字取到小數點以下2位四捨五入=============
Dim aa As Double
aa = TextBox1.Text
Label3.Text = FormatNumber(CInt(aa) / 3, 2)

ASP.NET 2.0深度剖析範例集

開啟視窗時視窗放到最大

' ===開啟視窗時視窗放到最大====

<script language="JavaScript">
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
</script>



' ===開啟視窗時視窗放到 640*480 ===

<script language="JavaScript>
self.moveTo(0,0)
self.resizeTo(640,480)
</script>

最新JavaScript與Ajax範例活用辭典

split來拆解日期

'######用 split來拆解 1992/1/21 這種日期格式, 給y1, m1, d1 的三個下拉選單#######
Private Sub Read_Birthday()
Dim cmA3 As New OleDbCommand("select birthday from resume where resume_no ='" & Session("resume_no") & "'", conn2)
conn2.Open()
Dim drA3 As OleDbDataReader = cmA3.ExecuteReader()
If drA3.Read Then
'Dim birth As String = drA3.Item("birthday").ToString '這種寫法會多跑出 時間, 造成程式錯誤
Dim birth As String = drA3.Item("birthday")
Dim birth_ymd() As String
birth_ymd = Split(birth, "/") '用字串陣列去接1992/2/2的這個字串, 以 / 來拆解成三個數字
y1.SelectedValue = birth_ymd(0)
m1.SelectedValue = birth_ymd(1)
d1.SelectedValue = birth_ymd(2)
End If
drA3.Close()
conn2.Close()
End Sub

如何取得當月的總天數呢

#########如何取得當月的總天數呢 ######################


DateTime.DaysInMonth(年, 月)
例如:
DateTime.DaysInMonth(2005, 2)的值是28.

如果Data table的欄位為DBNull時的

'=====如果Data table的欄位為DBNull時的判斷要怎麼下=======

If IsDBNull(dtTableA.Rows(a1).Item("total_record")) = True Then
dtTableA.Rows(a1).Item("total_record") = "0"
End If

把文字檔的某些字給置換掉

'======把文字檔的某些字給置換掉=======
'========先讀出來
Dim file As New System.IO.StreamReader(Server.MapPath("") & "\Files\Test.Text", Encoding.GetEncoding("big5"))
Dim words = file.ReadToEnd()
file.Close()

'========再重新寫回
Dim file1 As New System.IO.StreamWriter(Server.MapPath("") & "\Files\Test.Text", False, Encoding.GetEncoding("big5"))
words = Replace(words, "小明", "大呆") '就是這裡啦~ 會把內容為"小明"的字換成"大呆"
file1.Write(words)
file1.Flush()
file1.Close()

vsnet2005按下Button開新視窗

//===.NET 2005 的Button按鈕按下去後, 會去開啟一個新視窗=====
//=========先在HTML裡加入一段JavaScript=============
<head runat="server">
<title>Button Test</title>
<script language="JavaScript" type="text/JavaScript">

<!--
function openpage(htmlurl)
{
var newwin=window.open(htmlurl,"newWin","toolbar=no,location=no,directories=no,status=no,scrollbars=yes,menubar=no,resizable=yes,top=10,left=10,width=400,height=300");
newwin.focus();
return false;
}
//-->
</script>
</head>

//==在 .NET的Button元件的HTML Tag裡加入用OnClientClick去call JavaScript的 openpage function就搞定了 , 如下:

<asp:Button ID="btnChangePassword" runat="server" Text="修改密碼" class="button01" OnClientClick="return openpage('WebForm1.aspx');"/></td>

e.Item.ItemIndex 在2005風貌

在 ASP.NET 2003的 DataGrid中常用於 DataGrid1_DeleteCommand 或 DataGrid1_DeleteCommand 的 DataGrid1.DataKeys[e.Item.ItemIndex] 來取得 DataGrid 某一行資料列的 "主索引鍵" 值, 在.NET 2005中做了修改, 變成: GridView1.DataKeys[e.RowIndex].Value

HTTP 狀態 401:Unauthorized

用 VS.NET 2005 開發的 WebService, AP或其它WebAP在Call Web Service時出現了 "要求失敗,HTTP 狀態 401 : Unauthorized " 的錯誤訊息, 這問題是有關Security, 解決的方法為: 修改該 Web Service 目錄的安全性, 加入 ASPNET, NetWork Service, IUSR開頭字眼的三個Account就解決了!

觸發母視窗的一個Button

網頁轉向

用HTML來寫 網頁轉向


用.net來寫 網頁轉向
Response.Redirect("NewForm.aspx")

.net AP去call其它AP

用.net AP去call其它AP的指令
Process.Start(路徑 & "檔名.exe")

關閉視窗, 返回時Reload父視窗

在HTML裡用按鈕關閉視窗, 返回時Reload父視窗

隱藏DataGrid的某一個欄位

隱藏DataGrid的某一個欄位

DataGrid1.Columns.Item(i).Visible = False

//--> i 為欄位變數, 1的話就是欄位1, 依此類推

Windows XP一秒關機法

Windows XP一秒關機法
按下組合鍵「Ctrl+Alt+Del」,在彈出的「工作管理員」中按住「Ctrl」鍵,點「關機→關機」或者「關機→重新開機」

記住網址並重導到登入頁面

'--------------------判斷有無登入------------------------------------------
If Session("IsPassed") <> True Then
Session("MyURL") = Request.ServerVariables("PATH_INFO").ToString '用Session記住網址
Session("Params") = Request.QueryString '用Session記住網址列的 ? 後面帶入的參數
Response.Redirect("Login.aspx")
End If

解決 SQL Server 不存在或拒絕存取

一般asp.net開發人員都是在本機裝vs.net和SQL2000來開發, 前陣子要把Web程式安裝到一台WinXP PS2的電腦上(IIS), DB裝在另一台也是WinXP SP2的電腦(SQL2000), 在使用該Web網頁程式時發生了 [ConnectionOpen (Connect()).]SQL Server 不存在或拒絕存取 的Web Server無法存取另一台DB Server的狀況, 所有的程式和設定都check過了, 甚至還在Web Server上裝SQL 2000後用SQL Enterprise Manager 或 Query Analyzer 或 ODBC 去連原本的DB Server都沒問題, 網路段就更不用說了, 通通沒問題, 但就是寫好的.Net程式連不到DB Server, Why? @@....傻眼~! 找不出問題ㄟ....後來在網路終於上發現有一個道友也發生同樣的問題, 請 參考
http://www.programmer-club.com/pc2020v5/forum/showsametitleN.asp?board_pc2020=aspdotnet&id=9684

原來~~ DB Server那台的SQL 2000....要上SP4啦~~ 掯~! 錯誤訊息上面打死也看不出來原來要上SP4, 上完SQL 2000 SP4後, 果然 所寫的ASP.Net 程式立刻飛快的連上資料庫!

可在此處找到及下載 SQL Server SP4
http://download.microsoft.com/download/f/0/a/f0ae2894-f5a4-4393-8dec-ce8d69f5319c/ReadmeSql2k32asp4.htm#_2460_acquiring_analysis_services_sp4_fzpy

或可在此處找到及下載 SQL Server SP4
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=8E2DFC8D-C20E-4446-99A9-B7F0213F8BC5

軟體人員的生涯規劃

今天看到了一篇不錯的文章, 貼來給大家參考:

轉載自 http://www.oreilly.com.tw/column_sleepless.php?id=j025

軟體人員的生涯規劃


生涯規劃,這麼一個嚴肅而重要的主題,似乎應該找學者專家們來發表言論和研究報告才是,沒有我這個年輕人說話的餘地。只是,日昨在報紙上看到許多前職棒明星現今的遭遇之後,感觸良多,我於是寫了這篇文章。

報載,許多前職棒明星,當時月領三十多萬的高薪,現在居然在台北抽水站看守閘門,薪資也變成三萬多。他們接受記者訪問時,都會提到一句:「我一輩子都在打棒球,除了棒球之外,我沒有別的專長。」

這句話激起我的危機意識,我不想在我寫不動程式後,被公司踢出門,然後中年失業,沒有其它專長的我,被親戚介紹去台北抽水站看守閘門。我並不輕視看守閘門的工作,我認為工作只要正當,是沒有尊卑的,何況在台北抽水站看守閘門是一件重要的工作,事關台北地區在颱風時期淹水與否,只是這並不是我想做的工作。

你或許會認為:寫程式沒什麼不好的,你愛寫程式,你不在乎程式員的薪資微薄,你就是想寫一輩子的程式。但是我要對你澆一盆冷水,在年紀漸漸變大之後,你會開始有「力不從心」的感覺,因為你的生理機能正逐漸走下坡,你的體力不容許你熬夜幫公司趕程式,你的記憶力減退,使得你學習新技術的速度緩慢。不管你多麼熱愛寫程式,早晚你還是會遇到這個問題。

想在人生的每個階段都從事自己想做的工作,就得早點進行生涯規劃。對運動員、程式員等職業生涯短的人來說,生涯規劃更是重要。

在不當程式員後,我會做什麼呢?我可能會到資訊出版社當技術編輯,過去程式員的經歷可以讓我對此工作勝任愉快,而且當技術編輯還可以繼續學習資訊新知,所以這是我目前的首選。希望屆時 O'Reilly 台灣分公司還肯接納我。J

我也可能當職業性的技術作家。我很喜歡研究新技術,也喜歡寫文章。我可以當技術作家,將我所研究的一些技術心得寫成一本本的書。如果中文技術書的市場太小,我可以改用英文寫,就可以賣到全世界了。

我可以到處去講課。長期的講課經歷,我已經被訓練得有本事可以在課堂上講得口沫橫飛,也能夠編寫出精采的教材,上過課的學生評價也都還不錯。我可以到教育單位或補習班講課,我也可以自己接受企業包班,或者開教學網站進行線上教學。

我可以當計劃顧問、或計劃的 leader,程式員的經歷使得我具備掌握大型計劃的能力,我不用再親自寫程式,但是我可以帶著年輕的程式員去做計劃,一如當時別人帶著我做計劃一般。

最近我還發現,我的文筆竟然可以很煽情(也不曉得從哪裡學來的),或許,在我以後不寫程式之後,還可以轉行當文藝小說家,寫一些充滿愛恨情仇、亂七八糟的小說,來造福生活平淡但仍存有幻想的婦女族群呢!

我知道現在流行開公司,不過這不在我的生涯規劃之內。像我這種敗家子型的人去開公司肯定沒有好下場,我有自知之明。我可不想找了些好友集資開了一家叫做「eBullshit.com」的網路公司,然後現金在一年內燒完,好友們也因此反目成仇。不!我不開公司。

我的指導教授覺得我這個人沒啥大志向,「老是想到出版社去做書或到教育單位講課賺些小錢」,他認為我有能力做「大事業」。但是我告訴你,生涯規劃是規劃自己想過的生活,而不是別人想過的生活,我才不要人云亦云。幾天前在台北火車站附近看到一個外國人自彈自唱國語歌曲,好聽極了。到異鄉自由地旅行,彈唱賺一些旅費,這是他喜歡的生活方式,有何不可。誰說一定要開名車、娶名模、住豪宅才是成功的生涯。

生涯規劃會隨著年紀增長和生活經驗的累積,以及人生觀的改變而有階段性的差異,所以生涯規劃不宜過於長期。生涯規劃應該以漸進的、多樣的方式來進行。漸進的,才不會好高鶩遠;多樣的,才可以分散風險。而且,生涯規劃要及早,因為有越充分的時間準備,越有可能實現。即使你想瀟灑地背著吉他到異鄉旅行彈唱,你也得好好地練吉他吧!

把握時間朝著你所規劃的生涯邁進!時間過得很快的,浪費不得。你不會希望有一天你在床上醒來,睜開眼後盯著天花板,你發現你已經五十歲了,昨晚五十大壽 birthday party 的宿醉使得你現在頭痛欲裂。你發現這些年來你依舊是渾渾噩噩的度過,生涯規劃依舊只是「規劃」,沒一個實現。你在床上抱頭痛哭,就在你五十歲生日當天。

本文作者:蔡學鏞
張貼日期:8/15/00

編輯 刪除 網頁背景加入自動播放MP3

在網頁上加入一首MP3作為背景音樂,最簡單的方法就是在網頁頂端加入以下的code:

<EMBED src="butterfly.mp3" autostart=true loop=true volume=100 hidden=true>

javascript 中的replace方法

javascript 中的replace方法
第一次發現javascript中replace() 方法如果直接用str.replace("-","!") 只會替換第一個匹配的文字符號.


replace()
The replace() method returns the string that results when you replace text matching its first argument
(a regular expression) with the text of the second argument (a string).
If the g (global) flag is not set in the regular expression declaration, this method replaces only the first
occurrence of the pattern. For example,

var s = "Hello. Regexps are fun.";s = s.replace(/\./, "!"); // replace first period with an exclamation pointalert(s);

produces the string “Hello! Regexps are fun.” Including the g flag will cause the interpreter to
perform a global replace, finding and replacing every matching substring. For example,

var s = "Hello. Regexps are fun.";s = s.replace(/\./g, "!"); // replace all periods with exclamation pointsalert(s);

yields this result: “Hello! Regexps are fun!”

轉貼自 http://www.mikecat.net/blogview.asp?logID=1183

用JavaScript做2個下拉選單內容的連動

用JavaScript做2個下拉選單內容的連動

有2個下拉選單, 分別為 dropdown_1 和 dropdown_2

.
.
.
.

如何做動態grid, 及grid的欄位

動態加入一個DataGrid的方式:
Dim MyDataGrid as New DataGrid
MyDataGrid.DataSource = GetDataSource()
MyDataGrid.AutoGenerateColumns = false
Dim bc1 as new BoundColumn
bc1.DataField = "IntegerValue"
bc1.HeaderText = "Record ID"
MyDataGrid.Columns.Add (bc1)
Dim hc1 as new HyperLinkColumn
hc1.DataTextField = "StringValue"
hc1.DataTextFormatString = "Show details for {0}"
hc1.DataNavigateUrlField="IntegerValue"
hc1.DataNavigateUrlFormatString="details.aspx?ID={0}"
hc1.HeaderText="Show me more"
MyDataGrid.Columns.Add (hc1)
Area.Controls.Add(MyDataGrid)
MyDataGrid.DataBind()

.Net 2.0 的 default button設定

填好畫面上的資料, 按enter鍵時, 會去點選 ID為 btnQuery的按鈕, 在.aspx的內容設定如下:

//從每個頁面的form下手, 如:<form id="form1" runat="server" defaultbutton="btnQuery">

這樣在該頁面按下enter時就會去按id="btnQuery" 的按鈕

.Net 2.0 的 default button設定

填好畫面上的資料, 按enter鍵時, 會去點選 ID為 btnQuery的按鈕, 在.aspx的內容設定如下:

//從每個頁面的form下手, 如:


這樣在該頁面按下enter時就會去按id="btnQuery" 的按鈕

Summary of SQL Queries, SQL查詢摘要

SQL的查詢最多可包含六個字句,但只有前兩個-SELECT 與FROM子句是必要的。子句是以下列的順序來指定:
SELECT .......
FROM table
[WHERE ]
[GROUP BY ]
[HAVING ]
[ORDER BY ]
SELECT子句列出被擷取的屬性或函數
FROM子句指定所有在查詢時需要的關聯(表格),包括合併的關連,但不包括巢狀查詢所需的關聯
WHERE子句指定了從這些關聯裡選取值組的條件,同時視需要加入合併條件
GROUP BY指定群組化屬性
HAVING子句所指定的是群組的選取條件
ORDER BY用來指定查詢結果的顯示順序
查詢最初會被FROM子句先執行,接著是WHERE子句,然後是GROUP BY子句、HAVING及ORDER BY

ASP.NET 2.0 線上教學 及 不錯的程式教學或範例的網站

ASP.NET 2.0 線上教學

http://msconline.maconstate.edu/tutorials/ASPNET20/default.htm

DOB網站建置百寶箱
http://dob.tnc.edu.tw/index.php

日期相減, 算出天數

參考自:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060913100918D18&fumcde=

DateTime STime = DateTime.Parse("2005-11-08"); //起始日
DateTime ETime = DateTime.Parse("2005-12-28"); //結束日
TimeSpan Total = ETime.Subtract(STime); //日期相減

Response.Write(Total.Days.ToString() + "
"); //共幾天
Response.Write(Total.Hours.ToString() + "
"); //又幾小時
Response.Write(Total.Minutes.ToString() + "
"); //又幾分

Response.Write(Total.TotalDays.ToString() + "
"); //總共多少天
Response.Write(Total.TotalHours.ToString() + "
"); //總共多少小時
Response.Write(Total.TotalSeconds.ToString() + "
"); //總共多少分

計算上傳時間

//============C#.NET 計算上傳時間=============
參考自:
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060913100918D18&fumcde=


//上傳開始時間
DateTime StartTime = DateTime.Now;

//上傳程式

//計算上傳時間
Response.Write("上傳時間:" + DateTime.Now.Subtract(StartTime).TotalSeconds.ToString("0.00") + "秒");

一般防止SQL injection的程式寫法

//一般防止SQL injection的程式寫法
Sub GetAuthors_Click(Sender As Object, E As EventArgs)

Dim DS As DataSet
Dim MyConnection As SqlConnection
Dim MyCommand As SqlDataAdapter

Dim SelectCommand As String = "select * from Authors where state = @State"

MyConnection = New SqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes")
MyCommand = New SqlDataAdapter(SelectCommand, MyConnection)

MyCommand.SelectCommand.Parameters.Add(New SqlParameter("@State", SqlDbType.NVarChar, 2))
MyCommand.SelectCommand.Parameters("@State").Value = MySelect.Value

DS = new DataSet()
MyCommand.Fill(DS, "Authors")

MyDataGrid.DataSource=DS.Tables("Authors").DefaultView
MyDataGrid.DataBind()
End Sub

JavaScript 檢查欄位是否為空白及欄位的文字是否為數字

//===========JavaScript 檢查txtAge欄位是否為空白及欄位的文字是否為數字=====

JavaScript 檢查欄位是否為 "數字 逗號 空白"

//=============JavaScript 檢查txtNum欄位是否為 "數字 逗號 空白" =========

計算上傳檔案 或 讀取資料所花的時間, 結果值以秒來顯示

計算上傳檔案 或 讀取資料所花的時間, 結果值以秒來顯示

DateTime StartTime = DateTime.Now;
//...上傳或讀取資料動作
Response.Write(DateTime.Now.Subtract(StartTime).TotalSeconds.ToString("0.00") + "秒";

跳出警告訊息並回上一頁

跳出警告訊息並回上一頁, 範例:

string a = "1";
if (a=="2")
{
Response.Write("");
return;
}

JavaScript的 history.back(); 為回上一頁
另一種做法:(比較好記)
history.go(-1) ← 回上一頁
history.go(-2) ←回上兩頁
history.go(1) ←到前一頁
history.go(2) ←到前兩頁

也可做成html的link
上一頁


參考自:
http://dob.tnc.edu.tw/themes/old/showPage.php?s=489&t=6

抓取網頁URL的Domain

///
/// 抓取網頁URL的Domain, 傳回Domain 如: http://192.168.1.160
///
/// 傳回Domain 如: http://192.168.1.160


public string GetUrlDomain()
{
HttpRequest req = HttpContext.Current.Request;
string sAbsUri = req.Url.AbsoluteUri; //http://someDomain/somePath/somePage.aspx
string[] frgs = sAbsUri.Split(new char[] { '/' });
if (frgs.Length >= 3)
{
return frgs[0] + "//" + frgs[2];
}
else
return "";
}

如果是取得網頁URL的Domain後面的完整程式路徑和request則是用HttpContext.Current.Request.RawUrl , 例如:

Response.Write(HttpContext.Current.Request.RawUrl);

抓取網頁URL去掉"?"後面的所有queryString

///
/// 抓取網頁URL去掉"?"後面的所有queryString
///

/// 傳回Domain 如: http://192.168.1.160/category/mirror/mirror_QueryDel.aspx
public string GetUrlNoneQueryString()
{
HttpRequest req = HttpContext.Current.Request;
string sAbsUri = req.Url.AbsoluteUri; //http://someDomain/somePath/somePage.aspx
string[] frgs = sAbsUri.Split(new char[] { '?' });
if (frgs.Length >= 1)
{
return frgs[0].ToString();
}
else
return "";
}

移除下拉選單的某一筆資料

移除下拉選單的某一筆資料, 下拉選單的ID為 ddl_Master , 移除內容為 0 的 item

ddl_Master.Items.Remove(ddl_Master.Items.FindByValue("0")); //如果不是admin就移掉 substation的選項

撰寫的預存程序從SQL2000連到SQL2005抓資料 出現 "異質性查詢需要為連線設定 ANSI_NULLS 和 ANSI_WARNINGS 選項。

撰寫的預存程序從SQL2000連到SQL2005抓資料, 執行時出現以下的訊息 :

異質性查詢需要為連線設定 ANSI_NULLS 和 ANSI_WARNINGS 選項。這樣才能確保一致的查詢語意。請啟用這些選項再重新提交您的查詢。

解決的方法為:

Set ANSI_NULLS ON
Set ANSI_WARNINGS ON
GO

--這邊才開始CREATE PROCEDURE
CREATE procedure [dbo].[md_get_gdpgvw_byDatePM]
@gdpgvw_startdate nvarchar(20)
AS

抓DataTable的某一筆資料的某一欄位的值

抓DataTable的某一筆資料的某一欄位的值, 語法如下:

myDataset.Tables[0].Rows[3]["first_name"].ToString();

抓DataTable的某三筆資料的first_name欄位的值

在C# ASP.Net抓去 在 .aspx 裡的html元件的值

在C# ASP.Net抓去 在 .aspx 裡的html元件的值 , 如 抓 裡的值 "N"

語法如下:

string aaa="";

aaa = Request.Form["txtIsSubmit"] ;

記得 html的input的name要命名 name="txtIsSubmit" 不然c#裡的 Request.Form["txtIsSubmit"] 會抓不到這個input的元件的值~!

JavaScript 取得整數

JavaScript 取得整數 語法:

Math.floor(5.1)

結果會得到 5

Math.ceil 無條件進位
Math.floor 無條件捨去
Math.round 四捨五入

JavaScript 日期比較

JavaScript 日期比較:

if ((Date.parse("4/21/2007")).valueOf() > (new Date()).valueOf()){
alert('今天比 2007/4/21還小');
} else {
alert('今天比 2007/4/21還大');
}

手動建立 DataTable

//手動產生一個DataSet資料
public DataSet getData2DataSet()
{
DataSet ds = new DataSet();
DataTable dt = new DataTable("supplier");
DataRow dr;

//先訂出DataTable欄位
dt.Columns.Add(new DataColumn("supplier_uniqueno", typeof(string))); //統一編號
dt.Columns.Add(new DataColumn("supplier_name", typeof(string))); //公司名稱
dt.Columns.Add(new DataColumn("supplier_chief", typeof(string))); //負責人
dt.Columns.Add(new DataColumn("supplier_employee", typeof(int))); //公司人數

//新增一筆DataRow資料, 從畫面上取得DataRow的值
dr = dt.NewRow();
dr["supplier_uniqueno"] = txtSupplier_uniqueno.Text;
dr["supplier_name"] = txtSupplier_name.Text;
dr["supplier_chief"] = txtSupplier_chief.Text;
dr["supplier_employee"] = int.Parse(txtSupplier_employee.Text);

dt.Rows.Add(dr); //將資料新增到DataTable

ds.Tables.Add(dt); //將DataTable資料新增到DataSet
return ds;
}

//以下這段是別人寫的, 好像有問題

private void CalcColumns()
{
DataTable table = new DataTable ();

// Create the first column.
DataColumn unitPriceColumn = new DataColumn();
priceColumn.DataType = System.Type.GetType("System.Decimal");
priceColumn.ColumnName = "UnitPrice";
priceColumn.DefaultValue = 3;

// Create the second, calculated, column.
DataColumn amountColumn = new DataColumn();
taxColumn.DataType = System.Type.GetType("System.Decimal");
taxColumn.ColumnName = "Amount";
priceColumn.DefaultValue = 10;

// Create third column.
DataColumn qtyColumn = new DataColumn();
totalColumn.DataType = System.Type.GetType("System.Decimal");
totalColumn.ColumnName = "Qty";
totalColumn.Expression = "Amount/UnitPrice";

// Add columns to DataTable.
table.Columns.Add(unitPriceColumn );
table.Columns.Add(amountColumn );
table.Columns.Add(qtyColumn);

DataRow row = table.NewRow();
table.Rows.Add(row);
DataView view = new DataView(table);
dataGrid1.DataSource = view;
}

鄉鎮區下拉選單內容讀取xml檔

常用到需要從資料庫讀取鄉鎮區的資料, 如果說縣市部份的下拉選單用寫死的方式, 點選縣市下拉選單時連動鄉鎮區下拉選單, 鄉鎮區下拉選單內容依照所選擇的縣市下拉選單的內容改變, 以下為sample code:
private void BindZip(string location_id)
{
DataSet dds = new DataSet();
dds.ReadXml(Server.MapPath("") + "\\zipcode.xml"); //從xml檔讀取所有鄉鎮區
DataView dv = new DataView(); //用DataView 去過濾所選的資料 , locationid=2 就是台北市, locationid=1是基隆市
dv.Table = dds.Tables[0];
dv.RowFilter = "locationid=" + location_id; //用DataView去過濾所要抓的鄉鎮區
ddlSpverify_zipcode.DataSource = dv; //ddlSpverify_zipcode 為鄉鎮區下拉選單的id
ddlSpverify_zipcode.DataTextField = "name";
ddlSpverify_zipcode.DataValueField = "zipcode";
ddlSpverify_zipcode.DataBind();
ddlSpverify_zipcode.Items.Insert(0, (new ListItem("請選鄉鎮區", "0")));

}

zipcode.xml 的內容為:




100
中正區
2


103
大同區
2

..................
..................
..................

982
卓溪鄉
22


983
富里鄉
22

對於Timeout expired , 加長SQL 的Timeout時間

由於資料量較大, 產生以下的錯誤訊息:
Server Error in '/' Application.
--------------------------------------------------------------------------------

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
我目前的解決方法是:
1. select的語法裡 from 裡面記得加讓 WITH (nolock) , 如: select name FROM product WITH (nolock) 對資料的抓取有明顯的速度改善
2. 設定SQL selecting的CommandTimeout的時間, 加長一點點試試
System.Data.Common.DbCommand dbCommand = DaTaBase.GetStoredProcCommand(sqlCommand);
dbCommand.CommandTimeout = 60; //60秒 =1分鐘
加長SQL 的Timeout時間

要讓每次網頁面postback之後, 頁面都會停留原本的地方, MaintainScrollPositionOnPostback="true" 實做

如果有一個頁面很長, 每次該頁面在postback之後, 頁面都會停留在該頁的最上頭, 而不會停留在原本的位置, 即使在code裡寫如 TextBox1.Focus(); 的方式把畫面定位頁面上的某個位置, 但多多少少會讓使用者覺得不太方便或頁面操作起來怪怪的, 要讓每次網頁面postback之後, 頁面都會停留原本的地方, asp.net 2.0在這上面的實作超方便, 做法是在 .aspx的html的最上面加上 MaintainScrollPositionOnPostback="true" 就搞定了, sample如下:



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="default.aspx.cs" Inherits="default.aspx" MaintainScrollPositionOnPostback="true" %>

把資料內容組成DataSet寫成xml檔

///
/// 把資料內容組成DataSet寫成xml檔
///

public void getData2DataSet()
{
//public DataSet getData2DataSet()
DataSet ds = new DataSet();
DataTable dt = new DataTable("enterprise");
DataRow dr;

//先訂出欄位
dt.Columns.Add(new DataColumn("ent_code", typeof(string))); //公司代碼
dt.Columns.Add(new DataColumn("ent_name", typeof(string))); //公司名稱
dt.Columns.Add(new DataColumn("ent_hash", typeof(string))); //


//新增第一筆DataRow資料
dr = dt.NewRow();
dr["ent_code"] = "ABC";
dr["ent_name"] = "ABC電子股份有限公司";
dr["ent_hash"] = "12345";
dt.Rows.Add(dr);

//新增第二筆DataRow資料
dr = dt.NewRow();
dr["ent_code"] = "Hello";
dr["ent_name"] = "Hello購物網";
dr["ent_hash"] = "54321";
dt.Rows.Add(dr);

//新增第三筆DataRow資料
dr = dt.NewRow();
dr["ent_code"] = "Micro";
dr["ent_name"] = "Micro科技股份有限公司";
dr["ent_hash"] = "abcde";
dt.Rows.Add(dr);

//把dataTable給Dataset
ds.Tables.Add(dt);
ds.WriteXml(Server.MapPath("") + "\\" + "ent_data.xml"); //把DataSet寫入目前目錄的ent_data.xml檔案
//return ds;
}

至於要如何讀取xml呢?

DataSet dds = new DataSet();
dds.ReadXml(Server.MapPath("") + "\\ent_data.xml"); //讀出xml到DataSet

DataView的條件過濾方法

DataView的條件過濾方法

DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);
DataView dv = dt.DefaultView;
dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/1/68#"
dv.RowFilter = "LastName LIKE 'Dard*'"
dv.RowFilter = "employeeID IN (12,144,54)"

使用 SelectedItem.Text 時, 該下拉選單顯示的值被取代, 用SelectedIndex 去解決

在C#.Net裡, 當指定某個下拉選單停留在某個選定的值時, 一般都會用 SelectedValue去指定,
但同樣的觀念套到使用 SelectedItem.Text 時卻會變成 該下拉選單顯示的值被取代, 如何解決這個問題呢?
用SelectedIndex 去解決, 如
ddlCity.SelectedIndex = ddlCity.Items.IndexOf(ddlCity.Items.FindByText("台北市"));

尋找台灣長尾… 長尾理論挑戰傳統80/20法則

尋找台灣長尾… 長尾理論挑戰傳統80/20法則,並不必然表示傳統的法則已經失效,只是網路科技改變了經濟規模的樣貌,因應消費者新的網路行為,企業改變經營模式已是大勢所趨。…不論市場怎麼變化,唯有從顧客需求出發,企業的價值才有可能延伸,長尾也才可以拉得更長、更粗。


【2007-01-29 經濟日報 企管副刊 游美月 】

當Google、Yahoo!橫掃媒體,iTunes殺了廣播明星,Amazon讓美國的實體連鎖書店霸主Barnes & Noble備受威脅,eBay挑戰百貨巨人沃爾瑪……,沒有地域的限制,市場無邊無際,網路科技創新改變了生產者的面貌以及消費者的行為,長尾現象不再只是理論,長尾效應已經發酵了。

所謂長尾,指的是沿著代表營收的縱軸及代表產品品項的橫軸所構成的一條頭高尾細、類似「L」形的曲線。過去企業大多專注在曲線前頭少數的主流商品,但是網路神奇的拉長了曲線的長度,利基商品愈多,企業創造利潤的尾巴就愈長!
2004年10月,美國《連線》(Wired)雜誌總編輯克里斯.安德森(Chris Anderson),提出長尾理論(The Long Tail),他以雜誌總編輯的身分預告了媒體人無可迴避的市場大趨勢。根據他的觀察,形成長尾的三股力量是:「生產大眾化」「配銷大眾化」「連結供給與需求」,這三股力量正各自代表了新興長尾市場中的一連串機會。

長尾經濟 遍及台灣各產業

機會屬於先行者,天下文化引進《長尾理論》一書,出版發行中譯版,讓台灣的讀者搶先洞悉市場大勢,但我們都有共通的疑問:「台灣的企業有沒有機會及能力發展長尾呢?」於是,《經濟日報》和天下文化合作推出《長尾理論台灣版》,分別採訪最典型的科技網路業、電信業、通路業、餐飲業、文創產業及金融服務業,發現台灣企業早已積極尋找長尾,就連高齡80的故宮,也在嘗試拉長她的尾巴呢!

在執行個案採訪時,我們經過不斷的辯論,最根本的問題是:如果沒有利用網路科技的商業模式,會不會有長尾?台灣部分產業對網路世界並不熟悉,有些企業的長尾才剛起步,甚至還不算成功,但是為了企業再成長,更為了回應消費者的需要,他們開始關注冷門商品,開發利基市場,投入多元品牌經營,延伸價值的尾巴。過程中有人成功扮演著新生產者、整合者或是篩選器的角色,拉出一條條令人稱羡的長尾;但也有人遭遇挫折瓶頸,仍在尋求突破。我們決定將他們的故事都呈現出來,希望每一個個案都能讓讀者有一些啟發。

觀察這些個案形成長尾的過程,可以歸納為幾大類型:

第一類是虛實整合,延伸服務。統一、全家以及萊爾富三家超商最為典型。

為了滿足數位化時代消費者的多元需求,已擁有4,350家實體門市,創造出近千億元營收的統一超商,2006年8月開始架設多媒體資訊站ibon,並在台北市600家門市打造無線上網的數位超商,結合原有的代收、預購等長尾平台,串連起一個虛實整合、環環相扣的服務網,既鞏固原有實體通路的優勢,更延伸出可觀的價值及源源不絕的長尾商機。

全家便利超商爭取到日本專利授權,引進虛擬物流(VDC)商業模式,透過虛擬的交易平台,解決實體通路庫存成本的壓力,降低生產配銷的門檻,改變傳統超商通路ABC商品管理法則,讓應該下架的B、C級商品可以和A級商品同時銷售,董事長潘進丁說:「我們正在拉長尾巴,現在是有小尾巴的麻雀,不久會成為長尾巴的鳳凰!」

萊爾富也是虛實並進的實踐者,所架設的虛擬平台Life-ET,是台灣零售通路第一台具商業模式的多媒體機台,開啟了貨架有限、商品及服務無限的新市場,隨著Life-ET可承作的服務愈來愈多元,更多廠商爭取加入這個平台,提供更多樣服務,利潤的長尾也愈來愈長了。

第二類是創造新的供給,引出潛在的需求。KKBOX、台灣Yahoo!奇摩、統一速達及中華電信可以代表。

2004年開始經營線上音樂下載的KKBOX,「讓音樂像自來水一樣」,可以無限下載,架設的數位通路為日益蕭條的音樂市場開闢了一個新銷售平台,也為自己拉出一條細細的長尾,總經理林冠群說:「下一階段的重要策略就是把音樂長尾加粗、加厚!」

Yahoo!奇摩利用搜尋引擎的優勢,推出網路關鍵字廣告行銷,竟勾引出過去不曾有的客源,光「失眠」一詞,就有18家廠商參與競標,價格也因此水漲船高,由4.5元漲到11元,漲幅達144%;另外鎖定122萬中小企業主,提供價格低廉又快速有效的促銷平台,使中小企業用小錢就可以做廣告,成功扮演了整合者的角色,創造出傲人的利潤。

統一速達的「黑貓宅急便」堅持人性化及貼心的服務,快速拓展出C2C個人宅配市場長尾;2001年,統一速達打出第二品牌,以「黑貓探險隊」啟動一條創新的長尾———運用配送司機上山下海送貨的工作型態,四處發掘具特色的地方農特產,推動產地直銷,更開拓出自己的利基市場。

第三類是傾聽顧客的問題,化為長尾商機。例如104人力銀行、摩根富林明及國泰金控的做法。

104人力銀行創辦人兼董事長楊基寬首創免費方式,在千萬個求職者及徵人不易的中小企業之間,建立起一個資訊平台。因應近年來的失業潮,104推出教育資訊網、家教網、獵才顧問及人力派遣等服務,全力提供職場解決方案的策略。致力要「再長十條尾巴」的104,雖然每天忙著接客戶的電話,但他們堅信,「接到一籮筐的新問題,全都是潛在的長尾機會!」

面對一家家金融控股大軍挾著強大資源提供金融百貨服務,摩根富林明自許成為基金的精品店,開啟了網路平台交易,創出驚人的佳績,小小電子商務部11個人的團隊竟締造了11萬名網路散戶,每月扣款金額達新台幣7億元。在「基金Q博士」的網路討論區,只要網民有問題,一天內就給答案,因為要讓網民知道:「你的聲音,我們聽到了!」

國泰金控以壽險為主體,與其他金控大多以銀行為主引擎十分不同。國泰人壽2.3萬名業務員,扮演著拉長客戶長尾的前鋒部隊,這批壽險大軍靠著科技工具:筆記型電腦或PDA,不僅賣保險,還兼推銷信用卡、基金……。除了螞蟻雄兵火力十足的交叉行銷,國泰金更整合自動櫃員機(ATM)及網路行銷,讓投資人更容易接觸到利基商品,並推出「泰贈點」紅利整合計畫,建立紅利平台,滿足投資人一次購足的便利及享受物超所值的快樂。

第四類是扮演資訊篩選平台,形塑新品味。博客來及故宮的嘗試,是一種新的體驗。

2006年7月,博客來網路書店外文館開張了,創下單一書店陳售最多進口外文書的紀錄。博客來最重要的工作,是讓讀者在茫茫書海中很快找到想要的書,因此網站的編輯不但要寫電子書,還要寫編輯手札,引導讀者觸及「舊」的卻未讀過的「新書」,書籍的銷售因此無限延伸。

故宮長尾巴的故事更是有趣。為了讓鎖在「冷」宮裡的國寶,成為一般人隨時可觸及的精品,故宮啟動了網路通路,原來塵封在故宮庫房內的文物,可以透過數位典藏方式成為你我的收藏。2006年開張的「故宮線上精品」,成為故宮65萬件收藏文物展開長尾行銷的新路徑,「Old is New」計畫則是鼓勵年輕設計師結合故宮文物元素,開發具當代美感的新商品。

第五類是延伸品牌價值,創造需求。他們不是典型善用網路的長尾企業,卻大膽嘗試用長尾的精神,創造多品牌策略,擴大消費需求,例如王品集團的「完全長尾手冊」。

長尾理論挑戰傳統80/20法則,並不必然表示傳統的法則已經失效,只是網路科技改變了經濟規模的樣貌,因應消費者新的網路行為,企業改變經營模式已是大勢所趨。看完台灣企業長尾的故事,最大的感觸是不論市場怎麼變化,唯有從顧客的需求出發,企業的價值才有可能延伸,長尾也才可以拉得更長、更粗。

(作者是經濟日報總編輯,本文摘自經濟日報執行、天下文化出版的《長尾理論台灣版》,經濟日報讀者俱樂部會員即日起可在萊爾富便利商店,以優惠價預購,詳見http://eclub.udn.com)

文章出處:2007-01-29 經濟日報

驗證統一編號的正確性

傳入一個統一編號的字串, 回傳字串訊息, 如 TextBox1.Text = chkNum("86343722");

//驗證統一編號
public string chkNum(string No)
{
int[] cx = new int[8];
cx[0] = 1;
cx[1] = 2;
cx[2] = 1;
cx[3] = 2;
cx[4] = 1;
cx[5] = 2;
cx[6] = 4;
cx[7] = 1;
if (No.Length != 8)
return "統編長度錯誤,要有 8 個數字";
int[] cnum = new int[8];
cnum[0] = int.Parse(No.Substring(0, 1));
cnum[1] = int.Parse(No.Substring(1, 1));
cnum[2] = int.Parse(No.Substring(2, 1));
cnum[3] = int.Parse(No.Substring(3, 1));
cnum[4] = int.Parse(No.Substring(4, 1));
cnum[5] = int.Parse(No.Substring(5, 1));
cnum[6] = int.Parse(No.Substring(6, 1));
cnum[7] = int.Parse(No.Substring(7, 1));

int SUM = 0;
for (int i = 0; i <= 7; i++)
{
SUM += cc(cnum[i] * cx[i]);
}

if (SUM % 10 == 0)
return "統一編號正確";
else if (cnum[6] == 7 && (SUM + 1) % 10 == 0)
return "統一編號正確";
else
return "統一編號:" + No + " 錯誤!";
}
public int cc(int n)
{
if (n > 9)
{
string n1 = n.ToString().Substring(0, 1);
string n2 = n.ToString().Substring(1, 1);
n = int.Parse(n1) + int.Parse(n2);
return n;
}
return n;
}

2007年4月25日 星期三

DataView的條件過濾方法

//DataView的條件過濾方法
DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);
DataView dv = dt.DefaultView;
dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/1/68#" ;
dv.RowFilter = "LastName LIKE 'Dard*'" dv.RowFilter = "employeeID IN (12,144,54)" ;

使用 SelectedItem.Text 時, 該下拉選單顯示的值被取代, 用SelectedIndex 去解決

在C#.Net裡, 當指定某個下拉選單停留在某個選定的值時, 一般都會用 SelectedValue去指定,但同樣的觀念套到使用 SelectedItem.Text 時卻會變成 該下拉選單顯示的值被取代, 如何解決這個問題呢?用SelectedIndex 去解決, 如ddlCity.SelectedIndex = ddlCity.Items.IndexOf(ddlCity.Items.FindByText("台北市"));