最近老人痴呆越來越嚴重,老是忘記一些屬性的設定在哪裡,
所以趕快新增上來以免常常忘記還要Google。
在Form的屬性裡將FormBorderStyle設定為FixedSingle就可以啦!
就是這麼簡單~喵!
2013年7月3日 星期三
2013年6月26日 星期三
[C#]啟用Windows服務
ServiceController sc = new ServiceController();
private void StartService(string s)
{
try
{
sc.ServiceName = s;
/// if service is stopped, start it
if (sc.Status == ServiceControllerStatus.Stopped)
{
//啟動類型設為自動(手動、自動、已停用)
//如果啟動類型為已停用會導致無法啟用該服務
Process.Start("sc", "config Messenger start= auto");
//因為服務的啟動類型更改會需要一點時間
//所以我先在程式中放置一個Timer設定為5000毫秒
timer1.Start();
}
}
catch (Exception e)
{
Console.WriteLine("Exception : ", e.Message);
}
}
private void timer1_Tick(object sender, EventArgs e)
{
//服務狀態設為啟用
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running);
timer1.Stop();
}
2013年4月4日 星期四
[C#]字串/數字補0
1. 字串補0
2.數字補0
string str="AAA"; str.PadLeft(8, '0'); //左邊補0,結果:00000AAA str.PadRight(8, '0'); //右邊補0,結果:AAA00000如果要補上其他字元就將'0'改為欲補上的字元即可
2.數字補0
string str = string.Format("{0:00000000}",123); //結果: 00000123
string.Format可以使用許多格式,無論是小數點位數還是貨幣格式…等
2013年3月8日 星期五
[C#]DataTable寫入/讀取XML
最近剛開始接觸到XML,雖然知道這個東西已經很久很久了,
但是一直都沒有試著去使用它,現在需要使用到卻遇到很多瓶頸,
因為我實在跟它不熟,後來Google之後發現DataTable可以直接存成XML檔,
這對我來說省去不少麻煩,特別把它給記下來,用法如下:
1. DataTable寫入為XML
假設產生出來的XML檔案如下:
2. 讀取XML至DataTable
用以下方式讀取會出現「DataTable 不支援來自 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 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#]Crystal Report自動調大亂斷行
最近開始使用Crystal Report真的是問題多多,
其中一個考倒我也考倒同事的就是它會亂斷行,
只要內容同時包含半形字又有全形字的時候就會出現這樣的狀況,
無論我怎麼設定都沒辦法解決,只能靠Google大神了!
找了很久,總算讓我挖到一篇,它是用程式讓內容自動斷行的,
大家可以參考一下:
http://www.dotblogs.com.tw/tf30412/archive/2010/05/20/15348.aspx
只要把它加入你的程式碼,要用的時候再加入即可
其中一個考倒我也考倒同事的就是它會亂斷行,
只要內容同時包含半形字又有全形字的時候就會出現這樣的狀況,
無論我怎麼設定都沒辦法解決,只能靠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;
}
標籤:
C#,
Crystal Report
2013年1月24日 星期四
[C#]DataGridView綁定DataTable不顯示所有DataTable欄位
是否自動建立資料來源中每個欄位的繫結欄位
當DataGridView.DataSource的來源是由DataTable來時,
一般狀況它會自動將DataTable裡的所有欄位自動建立至DataGridView中,
但是如果只想要顯示一部份DataTable裡的欄位時該怎麼辦呢?
只要設定以下屬性即可:
GridView.AutoGenerateColumns = false;
當DataGridView.DataSource的來源是由DataTable來時,
一般狀況它會自動將DataTable裡的所有欄位自動建立至DataGridView中,
但是如果只想要顯示一部份DataTable裡的欄位時該怎麼辦呢?
只要設定以下屬性即可:
GridView.AutoGenerateColumns = false;
[C#]Crystal Report列印(Print crystal report)
1.直接列印不預覽(Direct printing of crystal report)
備註:
ReportDocument.PrintToPrinter方法參數說明:
PrintToPrinter(nCopies, collated, startPageN, endPageN);
nCopies:指出列印份數。
collated:指出是否自動分頁。
startPageN:指出要列印的第一頁。
endPageN:指出要列印的最後一頁。
2.Crystal report預覽(Preview 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();
標籤:
C#,
Crystal Report
2013年1月14日 星期一
[C#] TXT檔案讀寫
寫入檔案>>
using System.IO;
StreamWriter sw = new StreamWriter(@"C:\text.txt", true);
//第二個參數設定為true表示不覆蓋原本的內容,把新內容直接添加進去
sw.WriteLine("寫入TXT的文字");
sw.Close();
讀取檔案>>
using System.IO;
StreamReader sr = new StreamReader(@"C:\text.txt");
//===一次讀取全部內容===
string a = sr.ReadToEnd();
Debug.Print(a);
//===逐行讀取,直到檔尾===
while (!sr.EndOfStream)
{
Debug.Print(sr.ReadLine());
}
sr.Close();
2013年1月10日 星期四
[C#]MailMessage郵件寄送送
MailAddress from = new MailAddress("寄件者郵件地址", "寄件者顯示的名稱", System.Text.Encoding.UTF8);
MailAddress to = new MailAddress("收件者郵件地址");
MailMessage message = new MailMessage(from , to );
message.IsBodyHtml = true;
message.BodyEncoding = System.Text.Encoding.UTF8; //E-mail編碼
message.Subject = "主旨";
message.Body = body; //E-mail內容
SmtpClient smtpClient = new SmtpClient("郵件伺服器", prot);
smtpClient.Credentials = new System.Net.NetworkCredential("帳號", "密碼");
//若不需要帳號密碼的可省略,是否可省略要看Mail Server設定是否一定要驗證
smtpClient.Send(message);
提醒:記得要加上using System.Net.Mail;
2013年1月4日 星期五
[C#]IsNumeric 判斷是否為數值
以前用VB有很多函數可以使用,自從改寫了C#之後很多都要自己動手,
為了避免自己忘記,所以把它放到blogger來!
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);
return isNum;
}
2012年12月25日 星期二
[C#]共用事件
當某些控制項需要做相同的動作時,可以使用共用事件的方式,
只要在這些控制項的事件都設定相同事件名稱即可。
以下範例,先加入多個Button,
在所有Button中的Click事件選擇btnClick,
如此一來就每個Button就都會做相同的動作。
只要在這些控制項的事件都設定相同事件名稱即可。
以下範例,先加入多個Button,
在所有Button中的Click事件選擇btnClick,
如此一來就每個Button就都會做相同的動作。
using System;
using System.Windows.Forms;
namespace TEST
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnClick(object sender, EventArgs e)
{
Button btn = (Button)sender;
MessageBox.Show(btn.Text);
}
}
}
2012年11月15日 星期四
[C#]取小數並四捨五入
1. 四捨六入五成雙
在直接使用Math.Round的情況下,會造成當小數第三位=5時,
依小數第二位為奇數或偶數判斷是要進位或不進位,原則如下:
>5==>進位
<5==>捨去
=5==>前一個位數為偶數時捨去;奇數時進位
2.四捨五入
double tmp = 11.425; tmp = Math.Round(tmp, 2);Result=>11.42
double tmp = 11.415; tmp = Math.Round(tmp, 2);Result=>11.42
在直接使用Math.Round的情況下,會造成當小數第三位=5時,
依小數第二位為奇數或偶數判斷是要進位或不進位,原則如下:
>5==>進位
<5==>捨去
=5==>前一個位數為偶數時捨去;奇數時進位
2.四捨五入
double tmp = 11.425; tmp = Math.Round(tmp, 2, MidpointRounding.AwayFromZero);Result=>11.43
2012年10月22日 星期一
[VB6]引用C#所寫的DLL
1. 建立 C# DLL
建置前要先做以下設定:
a. 到專案按右鍵選擇「屬性」→「應用程式」→「組件資料」→勾選「讓組件成為 COM-Visible」
a. 到專案按右鍵選擇「屬性」→「應用程式」→「組件資料」→勾選「讓組件成為 COM-Visible」
b. 選擇「建置」→勾選「註冊 COM Interop」
2. 使用組件登錄工具(Regasm.exe)將 C# DLL 元件註冊至 COM 組件中
開啟命令提示字元,依序執行以下指令註冊 DLL 檔至 COM 組件:
a. cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
b. RegAsm.exe DLL檔案路徑+檔名.dll /tlb:DLL檔名.tlb /codebase
c. 會出現「…型別程式庫已經成功登錄」表示OK啦!
3. 於 VB6 中使用 CreateObject Function 建立此 DLL Object
Dim obj As Object
Set obj=CreateObject("DLL檔名.Class1")
要呼叫時只要用 obj.函式名() 即可
Set obj=CreateObject("DLL檔名.Class1")
要呼叫時只要用 obj.函式名() 即可
2012年9月26日 星期三
[C#]為自定義的函式加上說明
這幾天一直嘗試著寫寫C#,想到什麼功能就試著去用程式把它寫出來,
但是每次寫函式等到要用的時候有時候會忘記每個參數代表的意義,
在VS裡面本身所提供的函式在使用時都會有說明出現,
於是乎,我就開始Google一下如果是自定的函式有沒有辦法加上說明,
花了幾分鐘就找到啦!只要在函式上方加上以下幾行說明即可:
/// <summary>函式說明</summary>
/// <param name="參數名1">參數說明</param>
/// <param name="參數名2">參數說明 </param>
不知道在VB.NET中是不是也是像這樣的方式?
P.S.參數如果有多個就多幾行 /// <param name="參數名">參數說明 </param> 就可以囉!
但是每次寫函式等到要用的時候有時候會忘記每個參數代表的意義,
在VS裡面本身所提供的函式在使用時都會有說明出現,
於是乎,我就開始Google一下如果是自定的函式有沒有辦法加上說明,
花了幾分鐘就找到啦!只要在函式上方加上以下幾行說明即可:
/// <summary>函式說明</summary>
/// <param name="參數名1">參數說明</param>
/// <param name="參數名2">參數說明 </param>
不知道在VB.NET中是不是也是像這樣的方式?
P.S.參數如果有多個就多幾行 /// <param name="參數名">參數說明 </param> 就可以囉!
2012年9月20日 星期四
[C#]統一編號驗證 Uniform No. Validator
| 碼數 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
| 統一編號 | 0 | 0 | 2 | 3 | 8 | 7 | 7 | 8 | ||
| 運算 | x1 | x2 | x1 | x2 | x1 | x2 | x4 | x1 | ||
| 新值1 | 0 | 0 | 2 | 6 | 8 | 14 | 28 | 8 | 每個值的十位數與個位數加總直到只剩個位數 | |
| 新值2 | 0 | 0 | 2 | 6 | 8 | 5 | 10 | 8 | ||
| 新值3 | 0 | +0 | +2 | +6 | +8 | +5 | +1 | +8 | =30 | 每個數值加總後可整除10即代表統編正確 |
protected bool CheckUniformNo(string strCardno)
{
if (strCardno.Trim().Length < 8)
{
return false;
}
else
{
int[] intTmpVal = new int[6];
int intTmpSum = 0;
for (int i = 0; i < 6; i++)
{
//位置在奇數位置的*2,偶數位置*1,位置計算從0開始
if (i % 2 == 1)
intTmpVal[i] = overTen(int.Parse(strCardno[i].ToString()) * 2);
else
intTmpVal[i] = overTen(int.Parse(strCardno[i].ToString()));
intTmpSum += intTmpVal[i];
}
intTmpSum += overTen(int.Parse(strCardno[6].ToString()) * 4); //第6碼*4
intTmpSum += overTen(int.Parse(strCardno[7].ToString())); //第7碼*1
if (intTmpSum % 10 != 0) //除以10後餘0表示正確,反之則錯誤
return false;
}
return true;
}
private int overTen(int intVal) //超過10則十位數與個位數相加,直到相加後小於10
{
if (intVal >= 10)
intVal = overTen((intVal / 10) + (intVal % 10));
return intVal;
}
2012年9月19日 星期三
[C#] 驗證信用卡卡號 Credit Card No. Validator
| 碼數 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |||
| 信用卡卡號 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 5 | |||
| 運算 | x2 | x1 | x2 | x1 | x2 | x1 | x2 | x1 | x2 | x1 | x2 | x1 | x2 | x1 | x2 | x1 | |||
| 新值1 | 6 | 4 | 10 | 6 | 14 | 8 | 18 | 0 | 2 | 2 | 6 | 4 | 10 | 6 | 14 | 5 | => | 把每個[新值1]的個位數與十位數加總,產生[新值2] | |
| 新值2 | 6+ | 4+ | 1+ | 6+ | 5+ | 8+ | 9+ | 0+ | 2+ | 2+ | 6+ | 4+ | 1+ | 6+ | 5+ | 5 | =70 | => | 加總每個[新值2]後若可整除10即代表卡號正確 |
protected bool CheckCreditCardNo(string strCardno)
{
if (strCardno.Trim().Length < 16)
{
return false;
}
else
{
int[] intTmpVal = new int[16];
int intTmpSum = 0;
for (int i = 0; i < 16; i++)
{
//位置在奇數位置的*1,偶數位置*2,位置計算從0開始
if (i % 2 == 1)
intTmpVal[i] = int.Parse(strCardno[i].ToString());
else
intTmpVal[i] = int.Parse(strCardno[i].ToString()) * 2;
//以上處理後若結果大於10的將其個位數+十位數
if (intTmpVal[i] >= 10)
intTmpVal[i] = (intTmpVal[i] / 10) + (intTmpVal[i] % 10);
//將所得的所有結果加總
intTmpSum += intTmpVal[i];
}
if (intTmpSum % 10 != 0) //除以10後餘0表示正確,反之則錯誤
return false;
}
return true;
}
2012年9月12日 星期三
[C#]日期驗證 Date Validator
1.日期驗證(for 西元年)
2.日期區間判斷
public static bool IsDate(string anyString)
{
if (anyString.Length != 8) //這是在沒有任何符號(/.-)的狀況下
return false;
else
{
//在沒有符號的狀況下補上日期分隔符號
anyString = anyString.Substring(0, 4) + "/" + anyString.Substring(4, 2) + "/" + anyString.Substring(6, 2);
//====以上若已經有在輸入時即限制輸入格式可不需要====
try
{
DateTime dt;
dt = DateTime.Parse(anyString);
return true;
}
catch
{
return false;
}
}
}
註:如果是要判斷民國年就將原本的民國年轉為數值後加上19110000再判斷即可2.日期區間判斷
DateTime t1 = (DateTime.Parse((int.Parse(d1.Text.Substring(0, d1.Text.Length - 4)) + 1911) + "-" + d1.Text.Substring(d1.Text.Length - 4, 2) + "-" + d1.Text.Substring(d1.Text.Length - 2, 2)));
DateTime t2 = (DateTime.Parse((int.Parse(d2.Text.Substring(0, d2.Text.Length - 4)) + 1911) + "-" + d2.Text.Substring(d2.Text.Length - 4, 2) + "-" + d2.Text.Substring(d2.Text.Length - 2, 2)));
TimeSpan ts = t2 - t1;
//驗證日期區間起始輸入是否正確,後面日期不可小於前面日期
if (ts.Days < 0)
{
MessageBox.Show("ERROR:請輸入正確日期區間,查詢起始日期必須小於結束日期");
return false;
}
//天數限制
if (ts.Days >= 31)
{
messageShow.Text = "ERROR:日期區間最多不可超過31日";
return false;
}
else
{
return true;
}
2012年9月11日 星期二
[C#] 資料夾/檔案是否存在與建立資料夾
1. 判斷資料夾是否存在,並新增資料夾
2. 判斷檔案是否存在
注意:
路徑前必須加上@,如:@"D:\temp\"
否則會出現「無法辨認的逸出序列」的錯誤
using System.IO;
if (Directory.Exists(資料夾路徑))
{
//資料夾存在
}
else
{
//新增資料夾
Directory.CreateDirectory(@"D:\temp\");
}
2. 判斷檔案是否存在
using System.IO;
if (File.Exists(檔案路徑))
{
//檔案存在
}
注意:
路徑前必須加上@,如:@"D:\temp\"
否則會出現「無法辨認的逸出序列」的錯誤
訂閱:
文章 (Atom)