時常寫 Windows Form 程式的朋友一定知道, 我們在 Windows Form 程式中一樣可以使用 Console.Write() 方法。這些訊息可以在 Visual Studio 中的「輸出視窗」裡看見。然而, Visual Studio 本身就有許多訊息顯示在輸出視窗裡, 所以我們時常有可能漏掉某些訊息沒看到, 或者需要不停地往回捲動, 才能找到。此外, 如果你希望這些訊息是能夠讓使用者看到的, 該怎麼辦?
2014/4/21
2014/4/9
在 JSON.NET 中自動對應 JavaScript 時間
JSON.NET 可以讓我們很方便地讀寫 JSON 字串並對應到 C# 類別。在大部份的時候我們都可以直接使用 SerializeObject() 和 DeserializeObject() 方法進行轉換。但是一旦遇到 JavaScript 日期, 這招可能就行不通了。因為有些 JavaScript 開發人員會使用一種特殊的 JavaScript 日期表示法 (不是 Date 型別, 而是 Int64 型別) 來代表日期
2014/4/2
[入門] .Net 非同步處理與同步機制全解析 (二)
這一篇入門教學距離上一篇([入門] .Net 非同步處理與同步機制全解析 (一))已經有足足三年多的時間。之所以延宕那麼久, 主要是因為微軟已經開始提供平行處理及非同步機制的功能更新; 許多功能及用法不停地出現, 連我自己都搞不清楚, 所以我也沒辦法繼續著手這一系列文章。
直到 .Net Framework 4.5 開始, 我覺得應該可以算是一個適當時機, 可以繼續來寫這個系列文章了
2013/12/5
Linq2Excel 的陷阱與處理方法
Linq2Excel 是一個非常方便好用的小工具, 它是一個 Excel 專用的 LINQ Provider, 可以讓我們很快速地讀取 Excel (包括 Excel 2013) 的試算表。我們可以直接在 Visual Studio 中透過 NuGet 取得, 目前的版本是 1.7.1。
如果你對這個套件有興趣, 你可以參考「LINQ - 實作 LinqToExcel」這篇文章, 足以讓你快速入門
2013/9/5
.Net 程式內註解的幾個小細節
最近在編寫程式時, 注意到幾個關於程式註解的注意事項, 我把它記錄起來, 同時提供朋友們參考。
註解內要怎麼斷行? 例如以下用來註解 interface 的程式行, 你在註解中把它斷行是無效的:
2011/8/12
使用 Decorator 樣式實現輸入裝置的 IoC 概念
對傳統程式設計師而言, XNA 可以算是一個面臨多種適用狀況的開發環境。為什麼呢? 因為你所開發的程式, 只要經過小小的修改, 就可以移轉到 PC、XBOX 與 WP7 裝置上面。而它的輸入裝置也很多樣, 包括鍵盤、滑鼠、XBOX 搖桿、觸控輸入, 甚至其它
2011/6/9
.Net Interoperation 入門
就字面上來看, Interoperation 是一個英文複合字; 如果你在電腦上打入這個字, 一些 editor 的 spell checker 會告訴你拼字錯誤, 並建議你更改成 Inter-operation 甚至其它拼法。其實 Interoperation 是工程界普遍使用的字眼, 專指在不同系統中搭起的簡易或臨時的元件, 藉由製訂某些共通的協定, 以便這些系統可以共同作業。由於這個溝通界面可能並非非常嚴謹, 所以當其運作時, 必須特別有人從旁監督、隨時調整和修改。
在.Net 中, Interoperation (簡稱 Interop) 專指從.Net 應用程式中存取 unmanaged 程式元件的行為。我們知道, 當我們撰寫 .Net 應用程式或元件時, 這些元件都是 managed (受 .Net 執行環境所管理的)。但是如果是使用VB6/C/C++ 所撰寫的非 .Net 程式的 COM 元件, 對 .Net 而言, 都算是 unmanaged。如果我們企圖在 .Net 程式中存取那些 unmanaged 程式或資源, 就必須透過 Interoperation 技巧與COM 介接。
此外, 許多 Windows API 並沒有 .Net 的對應函式。換句話說, 如果我們要撰寫 Windows 應用程式, 而且我們必須使用到 Windows API 的話, 我們沒辦法從 .Net Framework 執行環境中找到對應的方法, 而必須透過 Interoperation 去呼叫 Windows API。
2011/2/8
.Net 集合型別的效率探討
我要在這裡說明的所謂「集合型別」指的並不是泛指 System.Collections 命名空間下的各種型別, 而是特別指自從 .Net 3.5 之後才出現的 Sets (集合) 型別, 特別是 System.Collections.Generic.HashSet 與 System.Collections.Generic.SortedSet 這兩個實作 ISet 介面的類別。ISet 介面是專門針對集合作業而設計的, 它提供了幾個特別的方法:
2010/12/18
[入門] .Net 非同步處理與同步機制全解析 (一)
不管你學的是何種程式語言, 非同步及平行處理總是最令人費解的部份之一。如果你沒有過人的邏輯觀念, 那麼要把非同步程式寫好, 恐怕有一定的困難度。不過最難的部份不在技術上, 而是到底在何種場合下可以採用非同步或平行處理。在日常生活中, 我們採用的邏輯大多是循序進行的, 也就是說, 等到前一件事情完成之後, 才去進行下一件。但是在某些情況下, 非同步處理是比較合乎情理的做法。
2010/4/23
[入門] .NET 自訂型別
我可以理解為什麼我老婆開了十年的同樣一部車, 都不知道原來在 N 檔和 D 檔之間切換可以不必去按那個安全鈕; 但是我卻無法理解為什麼有一個已經寫了好幾年 .NET 程式的人, 在這輩子中竟然沒有寫過任何一個自訂型別。對這件事, 我唯一想得到的解釋, 就是從來沒有人跟他說過自訂型別的好用之處。
所以, 這件事也讓我決心把自訂型別特別整理成一個主題。雖然我在本文中會用到一些進階技巧, 對真正的初學者而言恐怕有點吃力, 但是這畢竟是 .NET 中很基礎、很一般的常識, 所以我還是把它歸類到「入門文章」裡面
2010/1/25
[SQL] 使用 Stored Procedure 動態組成 SQL 查詢指令
以下示範一個可以動態組成查詢子句的 SQL 指令, 以 MS SQL 的 Stored Procedure 寫成。其中, 如果任一個參數(或全部)傳入 NULL 值, 即代表不限制那個欄位的條件。
2010/1/18
ASP.NET 的電子郵件傳輸工具程式
以下是我已經寫好的 Email 傳送程式, 稍為改一下就可以使用了:
using System;
using System.Net.Mail;
using System.Text;
using System.Web;
using System.Web.Configuration;
public class Mails
{
private string _sendFrom = "YourId@YourDomain";
private string _sendBy = "系統管理員";
///
/// 指定 SMTP Server; 預設值為 msa.hinet.net
///
public string Host = "msa.hinet.net";
///
/// 指定 SMTP Server Port; 預設值為 25
///
public int HostPort = 25;
///
/// 指定寄件人的 Email 位址
///
public string SendFrom
{
get
{
return _sendFrom;
}
set
{
_sendFrom = value;
}
}
///
/// 指定寄件人的名字
///
public string SendBy
{
get
{
return _sendBy;
}
set
{
_sendBy = value;
}
}
///
/// 建立寄件人 MailAddress 物件
///
private MailAddress From
{
get
{
MailAddress _from = new MailAddress(SendFrom, SendBy);
return _from;
}
}
///
/// 指定收件人地址; 可以同時指定多個 Email, 以逗號區隔
///
public string To;
/// 指定 CC 地址; 由於可以同時指定多個 Email, 以逗號區隔
///
public string Cc;
/// 指定 BCC 地址; 由於可以同時指定多個 Email, 以逗號區隔
///
public string Bcc;
///
/// 指定該郵件的標題
///
public string Subject = null;
///
/// 指定郵件標題的編碼方式, 預設值為 UTF8
///
public Encoding SubjectEncoding = Encoding.UTF8;
private string _body = null;
///
/// 指定該郵件的內容
///
public string Body
{
get
{
return _body;
}
set
{
_body = (IsBodyHtml) ?
string.Format("<div style='{0}'>{1}</div>", Style, value) :
value;
}
}
/// <summary>
/// 指定郵件內容的編碼方式, 預設值為 UTF8
/// </summary>
public Encoding BodyEncoding = Encoding.UTF8;
/// <summary>
/// 指定該郵件是否為 HTML 格式或純文字格式; 預設值為 true
/// </summary>
public bool IsBodyHtml = true;
/// <summary>
/// 指定整體信件的樣式; 只有當信件格式為 HTML 時有效
/// </summary>
public string Style = "font-family:'微軟正黑體, Verdana,Arial'; width: 90%; font-size: 0.9em;";
private MailMessage mail;
public Mails() // Constructor
{
mail = new MailMessage();
}
/// <summary>
/// Send mail directly with static data
/// </summary>
public static void QuickSend(string _Subject, string _Message, string _To, string _Cc = null, string _Bcc = null)
{
Mails m = new Mails();
m.To = _To;
m.Cc = _Cc;
m.Bcc = _Bcc;
m.Subject = _Subject;
m.Body = _Message;
m.Send();
}
/// <summary>
/// 寄出信件
/// </summary>
public void Send()
{
if (To == null) // 防呆
return;
mail.From = this.From;
string a = mail.From.Address;
string u = mail.From.User;
foreach (string to in this.To.Split(','))
if (!string.IsNullOrEmpty(to))
mail.To.Add(to);
foreach (string cc in this.Cc.Split(','))
if (!string.IsNullOrEmpty(cc))
mail.To.Add(cc);
foreach (string bcc in this.Bcc.Split(','))
if (!string.IsNullOrEmpty(bcc))
mail.To.Add(bcc);
mail.IsBodyHtml = this.IsBodyHtml;
mail.Subject = this.Subject;
mail.SubjectEncoding = this.SubjectEncoding;
mail.Body = this.Body;
mail.BodyEncoding = this.BodyEncoding;
SmtpClient client = new SmtpClient(this.Host, this.HostPort);
client.Send(mail);
}
}
要使用這個類別, 最簡單的方法如下:
string subject = txtMailSubject.Text.Trim(); string message = txtMailMessage.Text.Trim(); string to = txtMailTo.Text.Trim(); string cc = txtMailCc.Text.Trim(); string bcc = txtMailBcc.Text.Trim(); Mails.QuickSend(subject, message, to, cc, bcc);
在程式中, Mails.QuickSend 是一個靜態方法, 把相關字串填上去即可進行郵件傳送; 凡是未指定的欄位或屬性, 都採用預設值。如果你不想使用預設值, 則可以改用 Send() 方法, 但是可以自行修改各欄位或屬性的值。
[ADO.NET] 動態 SQL 指令與 SqlDataSource 的 QueryStringParameter 配合查詢
我在「[SQL] 使用 Stored Procedure 動態組成 SQL 查詢指令 」一文中介紹了如何在 Stored Procedure 中動態的組合出 SQL 指令並進行查詢。然而, 如果我們要配合 SqlDataSource 中以進行查詢, 該怎麼做呢?
2009/9/22
[Regex] 超讚!免費的 Regular Expression 輔助編輯與測試工具
對於想要開發 Regular Expression 的人, Expresso 是一個很好用的工具,不但可以即時製作 Regular Expression 字串,而且可以立即驗證、測試。你可以在 Ultrapico 網站 下載最新版本(如該頁所顯示的, 你必須先在 註冊頁中註冊,才能取得一個免費的註冊碼, 否則只能試用 60 天)。
2009/9/1
[入門][XML] XML入門系列 (1) : XML 初論
XML 在 .Net 中大概算是最重要而基本的技術之一。我將花一點時間從頭將 XML 以白話解釋一遍, 再把讀寫 XML 資料的相關技巧整理成一系列文章。
首先, 我們先來看一個完整且合法的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<rss version="1.0">
<channel>
<title>Johnny Worker's Blog</title>
<link>http://feeds.feedburner.com/jworker</link>
<description>
Johnny is a Microsoft MVP who's familiar with ASP.NET / VB.NET and C#.
</description>
<language>en</language>
<image>
<link>http://feeds.feedburner.com/jworker</link>
<url>http://s.blog.xuite.net/_image/logo_blog.gif</url>
<title>HiNet Blog</title>
</image>
<item>
<title>[AJAX] 使用 PageMethods 從 JavaScript 中直接呼叫 Server 端函數</title>
<link>http://feeds.feedburner.com/~r/Jworker/~3/375404303/19043851</link>
<pubDate>Tue, 26 Aug 2008 10:57:52 -0500</pubDate>
<guid isPermaLink="false">http://blog.xuite.net/johnnyle/worker/19043851</guid>
<description>
如果我們在 ScriptManager 中設定 EnablePageMethods 屬性,
而且在 Server 端某個方法上...
</description>
</item>
<item>
<title>MSDN 的 Transfer Manager 哪裡找?</title>
<link>http://feeds.feedburner.com/~r/Jworker/~3/369845030/18764090</link>
<pubDate>Wed, 20 Aug 2008 04:43:22 -0500</pubDate>
<guid isPermaLink="false">http://blog.xuite.net/johnnyle/worker/19043851</guid>
<description>
如果你是 MSDN 的訂閱者, 你一定知道 MSDN 的下載一律是透過
Microsoft File Transfer Manager 進行的...
</description>
</item>
<item>
..... (省略)
</channel>
</rss>