2013年3月8日 星期五

[C#]DataTable寫入/讀取XML

最近剛開始接觸到XML,雖然知道這個東西已經很久很久了,
但是一直都沒有試著去使用它,現在需要使用到卻遇到很多瓶頸,
因為我實在跟它不熟,後來Google之後發現DataTable可以直接存成XML檔,
這對我來說省去不少麻煩,特別把它給記下來,用法如下:

1. DataTable寫入為XML
DataTable dataTable = new DataTable("tableName"); //注意table一定需要有tablename
new SqlDataAdapter(selectCommand).Fill(dataTable);
dataTable.WriteXml("C:\\xmlName.xml");

假設產生出來的XML檔案如下:


 
 http://www.google.com.tw
 Google
 
 
 http://tw.yahoo.com
 Yahoo!
 



2. 讀取XML至DataTable
用以下方式讀取會出現「DataTable 不支援來自 Xml 的結構描述介面」的錯誤
DataTable dt = new DataTable();
dt.ReadXml("C:\\xmlName.xml");

以下方法則不會出現錯誤
DataTable dt = new DataTable("website");
//記得要給table名稱
dt.Columns.Add("url");
dt.Columns.Add("title");
dt.ReadXml("C:\\xmlName.xml");

2013年2月17日 星期日

[C#] 移除字串中非數字的字元

using System.Text.RegularExpressions;


string anyString = Regex.Replace(strIn, "[^0-9]", "");

2013年2月4日 星期一

[C#]偵測並關閉執行中的程式



using System.Diagnostics;
...
...
//=====不可重複開啟同一支程式(將程式碼放至於偵測是否被開啟的程式中即可)=====
Process[] proc = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
if (proc.Length > 1)
{
    //表示此程式已被開啟
    MessageBox.Show("程式執行中");
}

//=====偵測執行中的外部程式並關閉=====
Process[] MyProcess = Process.GetProcessesByName("程式名稱");
if (MyProcess.Length>0)
    MyProcess[0].Kill(); //關閉執行中的程式

2013年1月31日 星期四

[C#]數值驗證 IsNumeric


VB裡常常使用IsNumeric這個函式,在C#中卻沒得用感覺很不方便,
所以只能自定義一個函式來使用了!

//判斷數值格式並且符合大於等於0小於等於59(判斷分鐘用)
static bool IsNumeric(object Expression)
{
    bool isNum;
    double retNum;
    isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
    if (!isNum)
        return false;
    else
    {
        if ((retNum >= 0) && (retNum <= 59))
            return true;
        else
            return false;
    }
}

[C#]Crystal Report自動調大亂斷行

最近開始使用Crystal Report真的是問題多多,
其中一個考倒我也考倒同事的就是它會亂斷行,
只要內容同時包含半形字又有全形字的時候就會出現這樣的狀況,
無論我怎麼設定都沒辦法解決,只能靠Google大神了!
找了很久,總算讓我挖到一篇,它是用程式讓內容自動斷行的,
大家可以參考一下:
http://www.dotblogs.com.tw/tf30412/archive/2010/05/20/15348.aspx

只要把它加入你的程式碼,要用的時候再加入即可
/// <summary>文字斷行設定,以Byte計算</summary>
/// <param name="orignstr">字串</param>
/// <param name="length">單行文字長度</param>
/// <param name="mark">換行符號</param>
public static string ReportBreakLine(string orignstr, int length, string mark)
{
    string result = string.Empty;
    List<int> all_i = new List<int>(); //用來裝每個字的BYTES,再用迴圈去加總
    char[] all_s = orignstr.Trim().ToCharArray();
    for (int i = 0; i < all_s.Length; i++)
    {
        all_i.Add(System.Text.Encoding.Default.GetByteCount(all_s[i].ToString()));
    }

    int now_t = 0;
    int end = 0;
    int now = 0;
    //若需求是40個字即為80Bytes,若加總為79Bytes時就停止。
    for (int i = 0; i < all_i.Count; i++)
    {
        if (i + 1 != all_i.Count)
        {
            if ((now_t + all_i[i]) <= length)
            {
                now_t += all_i[i];
                end = i;
            }
            else
            {
                result += orignstr.Substring(now, end - now + 1) + mark;
                now = i;
                i--;
                now_t = 0;
            }
        }
        else
        {
            now_t += all_i[i];

            if (now_t > length)
            {
                result += orignstr.Substring(now, all_i.Count - now - 1) + mark;
                result += orignstr.Substring(i, 1);
            }
            else
            {
                result += orignstr.Substring(now, all_i.Count - now);
            }
        }
    }
    return result;
}

2013年1月24日 星期四

[C#]DataGridView綁定DataTable不顯示所有DataTable欄位

是否自動建立資料來源中每個欄位的繫結欄位

當DataGridView.DataSource的來源是由DataTable來時,
一般狀況它會自動將DataTable裡的所有欄位自動建立至DataGridView中,
但是如果只想要顯示一部份DataTable裡的欄位時該怎麼辦呢?

只要設定以下屬性即可:
GridView.AutoGenerateColumns = false;

[C#]Crystal Report列印(Print crystal report)

1.直接列印不預覽(Direct printing of crystal report)

CrystalReport1 document = new CrystalReport1(); //CrystalReport1:crystal report name

document.SetDataSource(data); //data:DataSet or DataTable

document.PrintToPrinter(1.true,0,0); //Print report directly

備註:
ReportDocument.PrintToPrinter方法參數說明:
PrintToPrinter(nCopies, collated, startPageN, endPageN);
nCopies:指出列印份數。
collated:指出是否自動分頁。
startPageN:指出要列印的第一頁。
endPageN:指出要列印的最後一頁。

2.Crystal report預覽(Preview crystal report)
Print preRpt = new Print();
//Print:the form name have crystalReportViewer

preRpt.CrystalReport11.SetDataSource(DS);
//CrystalReport11:report source in crystalReportViewer

preRpt.ShowDialog();
preRpt.Dispose();