1.資料繫結。 DataReader 讀取資料,用DataTable.Load(IDataReader)方法將資料載入到 DataTable ,用DataGridView 顯示輸出。不要把DataGridView直接綁定到DataReader的目的是資料匯出到Excel時,資料來源可以再次從DataGridView獲得。
不要在 DataGridView 內編輯添加資料,因為資料類型檢查不嚴格(或要嚴格檢查類型需要花費更大的成本)。
2.資料匯出到 Excel 。代碼如下:
/**//// <summary>
///
/// ** DataTable 資料匯出到 Excel **
///
///
/// </summary>
Excel.Application app = new Excel.Application();
app.Visible = false;
Excel.Workbook wb = app.Workbooks.Add(true);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing,
Type.Missing);
DataTable dt = (DataTable)dgvClientInfo.DataSource;
for (int i = 0; i < dt.Columns.Count; i++)
...{
ws.Cells[1, i + 1] = dt.Columns[i].ColumnName;
}
for (int j = 0; j < dt.Rows.Count; j++)
...{
for (int k = 0; k < dt.Columns.Count; k++)
...{
ws.Cells[j + 2, k + 1] = dt.Rows[j][k];
}
}
app.Visible = true;
注意:Excel的Cells[,]下標是從1,1開始的,而不是0,0。
3.防止子視窗重複開啟,確保某一子視窗只開啟一次。代碼為:
foreach (Form frm in this.MdiChildren)
...{
if (frm is WorkerList)
...{
frm.WindowState = FormWindowState.Normal;
frm.Activate();
return;
}
}
WorkerList wl = new WorkerList();
wl.MdiParent = this;
wl.Show();
4.使用枚舉 enum 區分類同資訊。
寫入程式碼方式容易造成混亂。如本系統的常用電話/常用網址,資料項目都為:名稱-內容-備忘,可將它們儲存在同一個表中,在程式中為區分資訊類型,可定義以下枚舉:
public enum TelWeb
...{
Telephone,WebSite
}
5.在ToolStrip中加入其它WinForm控制項。
如在ToolStrip中加入DateTimePicker。
DateTimePicker dt1 = new DateTimePicker();
dt1.Width = 110;
ToolStripControlHost host1 = new ToolStripControlHost(dt1);
host1.Alignment = ToolStripItemAlignment.Right;
toolStrip1.Items.Insert(10, host1);
6.用微軟的可列印的富文字框控制項列印帶格式的文本。
與.NETFX內建的RichTextBox相比只增強了列印功能。通過該控制項,可設定文本字型、顏色、對齊、粘貼圖片,可列印看上去很專業的文檔
7.儲存富文字格式設定到資料庫。
以二進位格式儲存。儲存的代碼為:
MemoryStream ms = new MemoryStream();
rtbContent.SaveFile(ms, RichTextBoxStreamType.RichText);
byte[] bt=ms.ToArray(); //將bt儲存到資料庫
讀取的代碼為:
byte[] bt = (byte[])SqlHelper.ExecuteScalar(sqlStr, null);
MemoryStream ms = new MemoryStream(bt, false);
rtbContent.LoadFile(ms, RichTextBoxStreamType.RichText);
在SQLServer中對應的資料類型為:image
8.管理員權限控制。
管理員資訊表中許可權欄位儲存一個字串,擁有該項許可權則在字串相應位置儲存為1,沒有該項許可權為0。在管理員登入時判斷許可權,啟用或禁用相應的功能表項目。
9.資訊分類。
如客戶分類分為:軟體客戶、網站客戶、合作客戶等。如果資料量不是太大,可不用單獨建立分類表,在添加的時候,客戶類型。可用ComboBox,在Form載入時檢索資料庫中已有的客戶類型填充到ComboBox中。這樣可選擇已有客戶類型,也可以添加新的客戶類型。
10.資料庫安裝。
不必整合在安裝包中,可單獨寫一個WinForm程式來收集串連伺服器的資訊(伺服器位址、資料庫名、使用者名稱、密碼等),並執行資料庫產生的指令碼來建立資料表,視圖,預存程序、索引等。
讀取儲存資料庫指令碼檔案的代碼:
public static string ReadDBScript(string fileName)
...{
StreamReader sr = new StreamReader(fileName);
return sr.ReadToEnd();
}
注意:資料庫產生的指令碼必須把"GO"去掉,否則執行時報錯。
11.安全控制。
由於是網路版系統,因而安全性要考慮周全。資料庫連接字串加密儲存在設定檔中。為了防止軟體XCopy到其它機器中,可以取機器的硬體(如硬碟、網卡、CPU)序號的一部分再加上自己的私人密鑰作為連接字串的加密金鑰(八位ASCII),確保密鑰的私密性、每機器唯一性。
(1)取得機器CPU的ID的前八位作為密鑰:
public static string GetProcessID()
...{
try
...{
string str = string.Empty;
ManagementClass mcCpu = new ManagementClass("win32_Processor");
ManagementObjectCollection mocCpu = mcCpu.GetInstances();
foreach (ManagementObject m in mocCpu)
...{
str = m["ProcessorId"].ToString().Trim().Substring(0, 8);
}
return str;
}
catch (Exception ex)
...{
return "zhenxing"; //如果失敗取預設的密鑰
}
}
(2)密碼編譯演算法:
public static string Encode(string data)
...{
byte[] aKey = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());
byte[] aIV = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());
DESCryptoServiceProvider cp = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, cp.CreateEncryptor(aKey, aIV), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cs);
sw.Write(data);
sw.Flush();
cs.FlushFinalBlock();
sw.Flush();
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
}
(3)解密演算法:
public static string Decode(string data)
...{
byte[] aKey = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());
byte[] aIV = System.Text.ASCIIEncoding.ASCII.GetBytes(GetProcessID());
byte[] Enc;
try
...{
Enc = Convert.FromBase64String(data);
}
catch
...{
return null;
}
DESCryptoServiceProvider cp = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(Enc);
CryptoStream cs = new CryptoStream(ms, cp.CreateDecryptor(aKey, aIV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs);
return sr.ReadToEnd();
}
(4)資料庫連接字串儲存到設定檔:
public static void SaveToConfig(string connStr)
...{
XmlDocument doc = new XmlDocument();
string fn = "zxjay.exe.config";
doc.Load(fn);
XmlNodeList nodes = doc.GetElementsByTagName("add");
for (int i = 0; i < nodes.Count; i++)
...{
XmlAttribute att = nodes[i].Attributes["key"];
if (att.Value == "SQLConectionString")
...{
att = nodes[i].Attributes["value"];
att.Value = connStr;
break;
}
}
doc.Save(fn);
}
C#開啟選中的檔案夾並指向選中的檔案
開啟選中的檔案夾
System.Diagnostics.Process.Start("explorer.exe", filePath);
開啟選中的檔案夾並指向選中的檔案
System.Diagnostics.Process.Start("explorer.exe", "/select," + filePath);
C#如何擷取副檔名
Path.GetExtension(fileName);
轉載於 http://blog.csdn.net/zxjay/archive/2007/08/31/1766329.aspx
/// <summary>
/// 判斷是否是數字
/// </summary>
/// <param name="str">字串</param>
/// <returns></returns>
private bool IsNumeric(string str)
{
if (str == null || str.Length == 0)
return false;
System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
byte[] bytestr = ascii.GetBytes(str);
foreach(byte c in bytestr)
{
if (c < 48 || c > 57)
{
return false;
}
}
return true;
}
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/codes/archive/2006/05/22/750012.aspx