.NET C/S(WinForm)開發技巧點滴

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.