厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(14)---Winform開(kāi)發(fā)的常用類庫(kù)(終結(jié)篇,CHM文檔放送)俗話說(shuō),一個(gè)好漢十個(gè)幫,眾人拾柴火焰高等都說(shuō)明一個(gè)道理,有更多的資源,更豐富的積累,都是助你走向成功,走向頂峰的推動(dòng)力。 本篇的公用類庫(kù)的介紹主題是程序開(kāi)發(fā)中常用到的一些輔助類,在幫助文檔中歸類到其他目錄下面,本篇主要介紹在Winform開(kāi)發(fā)用,常用到的一些類庫(kù),包括Windows服務(wù)操作、DOS操作、串口操作、POS打印操作以及一些參加的界面控件的輔助類。 本篇繼續(xù)繼續(xù)整理優(yōu)化已有的共用類庫(kù),并繼續(xù)發(fā)表隨筆介紹公用類庫(kù)的接口方法以及詳細(xì)使用操作,力求給自己繼續(xù)優(yōu)化,積攢更豐富的公用類庫(kù)資源,加深了解的同時(shí),也給大家展現(xiàn)公用類庫(kù)好的方面。 厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(13)--- 各種常用的輔助類2 厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(12)--- 網(wǎng)絡(luò)相關(guān)操作輔助類 厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(9)----各種常用輔助類 至此,整個(gè)厚積薄發(fā)的類庫(kù)整理也落下帷幕,整個(gè)過(guò)程歷時(shí)一年多,整理優(yōu)化近兩百多個(gè)類庫(kù),幫助說(shuō)明近兩百個(gè)。本篇作為本系列的終結(jié)篇,貼出最終的CHM幫助文檔,以及最有的類庫(kù)DLL,如果需要進(jìn)一步了解整個(gè)類庫(kù)的信息,可以隨時(shí)聯(lián)系我。 CHM幫助文檔持續(xù)更新中,統(tǒng)一下載地址是: http://www./download/commonshelp.rar
最新公用類庫(kù)DLL+XML注釋文件下載地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar 整個(gè)幫助類庫(kù)的CHM文件概況如下所示。 1、 Window服務(wù)輔助類WinServiceHelper,包括安裝、卸載、啟動(dòng)、停止、重新啟動(dòng)、判斷服務(wù)是否存在等操作。本輔助類主要是用來(lái)方便實(shí)現(xiàn)Window服務(wù)的各種操作,包括安裝、卸載、啟動(dòng)、停止、重新啟動(dòng)、判斷服務(wù)是否存在等操作。 Window服務(wù)適用于個(gè)各種定時(shí)服務(wù),或者數(shù)據(jù)同步的操作中。 1)輔助類提供的方法接口如下所示: /// 安裝Windows服務(wù) /// </summary> /// <param name="serviceName">服務(wù)名稱</param> /// <param name="serviceFileName">服務(wù)文件路徑</param> /// <returns></returns> public static bool InstallService(string serviceName, string serviceFileName) /// <summary> /// 卸載Windows服務(wù) /// </summary> /// <param name="serviceName">服務(wù)名稱</param> /// <param name="serviceFileName">服務(wù)文件路徑</param> public static bool UnInstallService(string serviceName, string serviceFileName) /// <summary> /// 另外一種安裝、卸載Windows服務(wù)的方法 /// </summary> /// <param name="install">安裝還是卸載,true為安裝,false為卸載</param> /// <param name="serviceFileName"></param> public static void InstallService2(bool install, string serviceFileName) /// <summary> /// 判斷window服務(wù)是否存在 /// </summary> /// <param name="serviceName">window服務(wù)名稱</param> /// <returns></returns> public static bool ServiceIsExisted(string serviceName) /// <summary> /// 等待某種預(yù)期的狀態(tài)(如運(yùn)行,停止等) /// </summary> /// <param name="serviceName">window服務(wù)名稱</param> /// <param name="status">預(yù)期的狀態(tài)</param> /// <param name="second">如果獲取不到預(yù)期的狀態(tài),則等待多少秒</param> /// <returns></returns> public static bool WaitForStatus(string serviceName, ServiceControllerStatus status, int second) /// <summary> /// 啟動(dòng)window服務(wù) /// </summary> /// <param name="serviceName"></param> public static bool StartService(string serviceName) /// <summary> /// 停止服務(wù) /// </summary> /// <param name="serviseName"></param> /// <returns></returns> public static bool StopService(string serviseName) /// <summary> /// 修改服務(wù)的啟動(dòng)項(xiàng) 2為自動(dòng),3為手動(dòng) /// </summary> /// <param name="startType"></param> /// <param name="serviceName"></param> /// <returns></returns> public static bool ChangeServiceStartType(int startType, string serviceName) /// <summary> /// 獲取服務(wù)啟動(dòng)類型 2為自動(dòng) 3為手動(dòng) 4 為禁用 /// </summary> /// <param name="serviceName"></param> /// <returns></returns> public static string GetServiceStartType(string serviceName) /// <summary> /// 驗(yàn)證服務(wù)是否啟動(dòng) /// </summary> /// <returns></returns> public static bool ServiceIsRunning(string serviceName) 2)輔助類的使用例子代碼如下所示 private void CheckServcieStatus() { string serviceName = this.txtServiceName.Text; bool exist = WinServiceHelper.ServiceIsExisted(serviceName); if (exist) { #region 獲取轉(zhuǎn)換狀態(tài) string startType = WinServiceHelper.GetServiceStartType(serviceName); string startTypeStatus = ""; if (startType == "2") { startTypeStatus = "自動(dòng)"; } else if (startType == "3") { startTypeStatus = "手動(dòng)"; } else if (startType == "4") { startTypeStatus = "禁用"; } #endregion bool running = WinServiceHelper.ServiceIsRunning(serviceName); this.txtServiceStatus.Text = string.Format("啟動(dòng)類型:{0} 狀態(tài):{1}", startTypeStatus, running ? "正在運(yùn)行" : "已停止"); this.txtServiceStatus.BackColor = Color.FromArgb(255, 255, 192); this.btnStartService.Enabled = !running; this.btnStopService.Enabled = running; this.btnReset.Enabled = true; this.btnInstallService.Enabled = false; this.btnUnInstallService.Enabled = true; } else { this.txtServiceStatus.BackColor = Color.Red; this.txtServiceStatus.Text = string.Format("{0} 服務(wù)不存在", serviceName); this.btnStartService.Enabled = false; this.btnStopService.Enabled = false; this.btnReset.Enabled = false; this.btnInstallService.Enabled = true; this.btnUnInstallService.Enabled = false; } } 以上代碼摘自我的《 Winform開(kāi)發(fā)框架之通用定時(shí)服務(wù)管理》 2、DOS操作封裝輔助類 DosHelper。本輔助類主要是用來(lái)方便實(shí)現(xiàn)DOS操作。DOS操作在自定義安裝數(shù)據(jù)庫(kù)腳本、運(yùn)行特殊命令、后臺(tái)注冊(cè)控件、操作Windows Service等方面都有用到。在另一個(gè)輔助類SqlScriptHelper,就是采用運(yùn)行DOS命令方式進(jìn)行Sql腳本的數(shù)據(jù)庫(kù)安裝。 1)輔助類提供的方法接口如下所示 /// <summary> /// 后臺(tái)執(zhí)行DOS文件 /// </summary> /// <param name="fileName">文件名(包含路徑)</param> /// <param name="argument">運(yùn)行參數(shù)</param> /// <param name="hidden">是否隱藏窗口</param> public static void RunDos(string fileName, string argument, bool hidden) /// <summary> /// 運(yùn)行指定DOS命令行 /// </summary> /// <param name="fileName">命令</param> /// <param name="argument">命令行參數(shù)</param> /// <param name="hidden">是否隱藏窗口</param> /// <param name="confirm">寫(xiě)入命令行的確認(rèn)信息</param> /// <returns></returns> public static string ExecuteCMD(string fileName, string argument, bool hidden, string confirm) /// <summary> /// 同步方式執(zhí)行DOS命令 /// </summary> /// <param name="command">DOS命令</param> public static void ExecuteCommandSync(object command) /// <summary> /// 異步方式執(zhí)行DOS命令 /// </summary> /// <param name="command">DOS命令字符串</param> public static void ExecuteCommandAsync(string command) 2)輔助類的使用例子代碼如下所示 private void btnInstallService_Click(object sender, EventArgs e) { if (CheckInput()) { DosHelper.RunDos(servicefile, "-i", false); WinServiceHelper.WaitForStatus(this.txtServiceName.Text, ServiceControllerStatus.Running, 10); CheckServcieStatus(); } } private void btnUnInstallService_Click(object sender, EventArgs e) { if (CheckInput()) { DosHelper.RunDos(servicefile, "-u", false); Thread.Sleep(1000); CheckServcieStatus(); } 以上代碼摘自我的《 Winform開(kāi)發(fā)框架之通用定時(shí)服務(wù)管理》 3、串口開(kāi)發(fā)輔助類 SerialPortUtil
一般人可能開(kāi)發(fā)C#相關(guān)的項(xiàng)目很多年,不一定會(huì)接觸到串口的開(kāi)發(fā),了解熟悉對(duì)硬件串口的開(kāi)發(fā),串口也不再是什么神秘的東西,利用 SerailPort組件,對(duì)串口的各種操作也非常的方便,由于本人總是喜歡把一些常用的東西封裝成可供重復(fù)利用的類庫(kù),因此,在閱百家代碼,項(xiàng)目積累總 結(jié)的基礎(chǔ)上,提煉總結(jié)優(yōu)化,把對(duì)串口的操作封裝成一個(gè)公用的類庫(kù),應(yīng)付日常的串口編程開(kāi)發(fā),也算是工作的一個(gè)階段性總結(jié)吧。 微軟在 .NET FrameWork2.0中對(duì)串口通訊進(jìn)行了封裝,我們可以在.net2.0及以上版本開(kāi)發(fā)時(shí)直接使用SerialPort類對(duì)串口進(jìn)行讀寫(xiě)操作。
SerialPort類的屬性主要包括:
1)串口名稱(PortName)
2)波特率(BaudRate)
3)數(shù)據(jù)位 DataBits
4)停止位 StopBits
5)奇偶校驗(yàn) Parity SerialPort類的事件主要包括:
DataReceived:用于異步接收串口數(shù)據(jù)事件
ErrorReceived:錯(cuò)誤處理事件 SerialPort類的方法主要包括: Open();Close();Read();Write()、DiscardInBuffer()、DiscardOutBuffer()等 從上面的測(cè)試?yán)訄D中,我們可以看到,一般對(duì)串口的操作,需要提供串口號(hào)、波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)的參數(shù),用來(lái)構(gòu)造一個(gè)串口操作類,以便 實(shí)現(xiàn)具體的串口操作,而這些參數(shù)有的是系統(tǒng)內(nèi)置的枚舉參數(shù),我們可以通過(guò)遍歷枚舉對(duì)象來(lái)綁定下來(lái)列表(如停止位、奇偶校驗(yàn));但有些參數(shù)卻不是系統(tǒng)內(nèi)置的 枚舉類型,例如波特率、數(shù)據(jù)位等,而且對(duì)這些參數(shù)操作也是串口開(kāi)發(fā)經(jīng)常用到的,因此,第一步,我對(duì)這些參數(shù)的綁定做了一個(gè)簡(jiǎn)單的封裝。 1)輔助類的接口代碼如下所示。 /// <summary> /// 串口開(kāi)發(fā)輔助類 /// </summary> public class SerialPortUtil { /// <summary> /// 接收事件是否有效 false表示有效 /// </summary> public bool ReceiveEventFlag = false; /// <summary> /// 結(jié)束符比特 /// </summary> public byte EndByte = 0x23;//string End = "#"; /// <summary> /// 完整協(xié)議的記錄處理事件 /// </summary> public event DataReceivedEventHandler DataReceived; /// <summary> /// 嚴(yán)重錯(cuò)誤事件處理 /// </summary> public event SerialErrorReceivedEventHandler Error; /// <summary> /// 串口號(hào) /// </summary> public string PortName /// <summary> /// 波特率 /// </summary> public SerialPortBaudRates BaudRate /// <summary> /// 奇偶校驗(yàn)位 /// </summary> public Parity Parity /// <summary> /// 數(shù)據(jù)位 /// </summary> public SerialPortDatabits DataBits /// <summary> /// 停止位 /// </summary> public StopBits StopBits #endregion #region 構(gòu)造函數(shù) /// <summary> /// 參數(shù)構(gòu)造函數(shù)(使用枚舉參數(shù)構(gòu)造) /// </summary> /// <param name="baud">波特率</param> /// <param name="par">奇偶校驗(yàn)位</param> /// <param name="sBits">停止位</param> /// <param name="dBits">數(shù)據(jù)位</param> /// <param name="name">串口號(hào)</param> public SerialPortUtil(string name, SerialPortBaudRates baud, Parity par, SerialPortDatabits dBits, StopBits sBits) /// <summary> /// 參數(shù)構(gòu)造函數(shù)(使用字符串參數(shù)構(gòu)造) /// </summary> /// <param name="baud">波特率</param> /// <param name="par">奇偶校驗(yàn)位</param> /// <param name="sBits">停止位</param> /// <param name="dBits">數(shù)據(jù)位</param> /// <param name="name">串口號(hào)</param> public SerialPortUtil(string name, string baud, string par, string dBits, string sBits) /// <summary> /// 默認(rèn)構(gòu)造函數(shù) /// </summary> public SerialPortUtil() #endregion /// <summary> /// 端口是否已經(jīng)打開(kāi) /// </summary> public bool IsOpen /// <summary> /// 打開(kāi)端口 /// </summary> /// <returns></returns> public void OpenPort() /// <summary> /// 關(guān)閉端口 /// </summary> public void ClosePort() /// <summary> /// 丟棄來(lái)自串行驅(qū)動(dòng)程序的接收和發(fā)送緩沖區(qū)的數(shù)據(jù) /// </summary> public void DiscardBuffer() #region 數(shù)據(jù)寫(xiě)入操作 /// <summary> /// 寫(xiě)入數(shù)據(jù) /// </summary> /// <param name="msg"></param> public void WriteData(string msg) /// <summary> /// 寫(xiě)入數(shù)據(jù) /// </summary> /// <param name="msg">寫(xiě)入端口的字節(jié)數(shù)組</param> public void WriteData(byte[] msg) /// <summary> /// 寫(xiě)入數(shù)據(jù) /// </summary> /// <param name="msg">包含要寫(xiě)入端口的字節(jié)數(shù)組</param> /// <param name="offset">參數(shù)從0字節(jié)開(kāi)始的字節(jié)偏移量</param> /// <param name="count">要寫(xiě)入的字節(jié)數(shù)</param> public void WriteData(byte[] msg, int offset, int count) /// <summary> /// 發(fā)送串口命令 /// </summary> /// <param name="SendData">發(fā)送數(shù)據(jù)</param> /// <param name="ReceiveData">接收數(shù)據(jù)</param> /// <param name="Overtime">重復(fù)次數(shù)</param> /// <returns></returns> public int SendCommand(byte[] SendData, ref byte[] ReceiveData, int Overtime) #endregion #region 常用的列表數(shù)據(jù)獲取和綁定操作 /// <summary> /// 封裝獲取串口號(hào)列表 /// </summary> /// <returns></returns> public static string[] GetPortNames() /// <summary> /// 設(shè)置串口號(hào) /// </summary> /// <param name="obj"></param> public static void SetPortNameValues(ComboBox obj) /// <summary> /// 設(shè)置波特率 /// </summary> public static void SetBauRateValues(ComboBox obj) /// <summary> /// 設(shè)置數(shù)據(jù)位 /// </summary> public static void SetDataBitsValues(ComboBox obj) /// <summary> /// 設(shè)置校驗(yàn)位列表 /// </summary> public static void SetParityValues(ComboBox obj) /// <summary> /// 設(shè)置停止位 /// </summary> public static void SetStopBitValues(ComboBox obj) #endregion /// <summary> /// 檢查端口名稱是否存在 /// </summary> /// <param name="port_name"></param> /// <returns></returns> public static bool Exists(string port_name) /// <summary> /// 格式化端口相關(guān)屬性 /// </summary> /// <param name="port"></param> /// <returns></returns> public static string Format(SerialPort port) } 2)輔助類的使用代碼如下所示。 綁定相應(yīng)的數(shù)據(jù)源(包括端口、波特率、數(shù)據(jù)位、校驗(yàn)位等等)代碼如下所示,這樣我們?cè)诖绑w界面代碼中,綁定相關(guān)參數(shù)的數(shù)據(jù)源就很方便了,如下所示。 private void Form1_Load(object sender, EventArgs e) { BindData(); } private void BindData() { //綁定端口號(hào) SerialPortUtil.SetPortNameValues(txtPort); txtPort.SelectedIndex = 0; //波特率 SerialPortUtil.SetBauRateValues(txtBaudRate); txtBaudRate.SelectedText = "57600"; //數(shù)據(jù)位 SerialPortUtil.SetDataBitsValues(txtDataBits); this.txtDataBits.SelectedText = "8"; //校驗(yàn)位 SerialPortUtil.SetParityValues(txtParity); this.txtParity.SelectedIndex = 0; //停止位 SerialPortUtil.SetStopBitValues(txtStopBit); this.txtStopBit.SelectedIndex = 1; this.btnSend.Enabled = isOpened; } 輔助類實(shí)現(xiàn)連接特定的窗口并處理數(shù)據(jù)的操作代碼如下所示。 private void btnConnect_Click(object sender, EventArgs e) { try { if (serial == null) { try { string portname = this.txtPort.Text; SerialPortBaudRates rate = (SerialPortBaudRates)Enum.Parse(typeof(SerialPortBaudRates), this.txtBaudRate.Text);//int.Parse(this.txtBaudRate.Text); SerialPortDatabits databit = (SerialPortDatabits)int.Parse(this.txtDataBits.Text); Parity party = (Parity)Enum.Parse(typeof(Parity), this.txtParity.Text); StopBits stopbit = (StopBits)Enum.Parse(typeof(StopBits), this.txtStopBit.Text); //使用枚舉參數(shù)構(gòu)造 //serial = new SerialPortUtil(portname, rate, party, databit, stopbit); //使用字符串參數(shù)構(gòu)造 serial = new SerialPortUtil(portname, this.txtBaudRate.Text, this.txtParity.Text, this.txtDataBits.Text, this.txtStopBit.Text); serial.DataReceived += new DataReceivedEventHandler(serial_DataReceived); } catch (Exception ex) { MessageBox.Show(ex.Message); serial = null; return; } } if (!isOpened) { serial.OpenPort(); btnConnect.Text = "斷開(kāi)"; } else { serial.ClosePort(); serial = null; btnConnect.Text = "連接"; } isOpened = !isOpened; this.btnSend.Enabled = isOpened; this.lblTips.Text = isOpened ? "已連接" : "未連接"; } catch (Exception ex) { this.lblTips.Text = ex.Message; MessageBox.Show(ex.Message); } } 4、POS打印機(jī)操作本小節(jié)包括兩個(gè)POS打印類,USB接口方式的POS小票打印的打印預(yù)覽管理界面 FrmPosPrintPreview和基于并口接口方式的打印輔助類POSPrinter。 基于USB接口方式的POS小票打印該操作。很多基本上采用了GP5860這種POS打印機(jī)進(jìn)行小票打印了。 執(zhí)行打印預(yù)覽,USB接口方式的小票可以實(shí)現(xiàn)效果的預(yù)覽,如果是并口的只有直接輸出,沒(méi)有預(yù)覽效果。 1)USB的POS打印的輔助類FrmPosPrintPreview提供了幾個(gè)常用的參數(shù)進(jìn)行配置,代碼如下所示。 /// <summary> /// POS小票打印的打印預(yù)覽管理界面 /// </summary> public partial class FrmPosPrintPreview : Form { /// <summary> /// 設(shè)置待打印的內(nèi)容 /// </summary> public string PrintString = ""; /// <summary> /// 指定默認(rèn)的小票打印機(jī)名稱,用作快速POS打印 /// </summary> public string PrinterName = "GP-5860III"; /// <summary> /// POS打印機(jī)的邊距,默認(rèn)為2 /// </summary> public int POSPageMargin = 2; /// <summary> /// POS打印機(jī)默認(rèn)橫向還是縱向,默認(rèn)設(shè)置為縱向(false) /// </summary> public bool Landscape = false; 2)并口的POS打印輔助類POSPrinter提供了兩個(gè)構(gòu)造函數(shù)和一個(gè)打印操作,代碼如下。 /// <summary> /// 并口POS打印機(jī)操作輔助類 /// </summary> public class POSPrinter { /// <summary> /// 默認(rèn)構(gòu)造函數(shù),打印并口名稱為L(zhǎng)PT1 /// </summary> public POSPrinter() /// <summary> /// 以指定的并口打印名稱構(gòu)造函數(shù) /// </summary> /// <param name="prnPort">打印并口名稱,如LPT1</param> public POSPrinter(string prnPort) /// <summary> /// 打印內(nèi)容 /// </summary> /// <param name="str">待打印的字符串</param> /// <returns></returns> public string PrintLine(string str) 3)輔助類的使用例子代碼如下所示 private void btnPosPrint_Click(object sender, EventArgs e) { if (this.lvwDetail.Items.Count == 0) { MessageUtil.ShowTips("沒(méi)有消費(fèi)記錄"); return; } StringBuilder sb = new StringBuilder(); sb.AppendFormat("{0}\r\n\r\n", Portal.gc.gAppUnit); sb.AppendFormat("客房消費(fèi)\r\n"); sb.AppendFormat("結(jié)賬單號(hào):{0}\r\n", this.lblCheckOutNo.Text); sb.AppendFormat("客戶姓名:{0}\r\n", this.txtName.Text); sb.AppendFormat("結(jié)賬客房:{0}\r\n", RoomInfo.RoomNo); sb.AppendFormat("打印時(shí)間:{0}\r\n\r\n", DateTime.Now); sb.AppendFormat("項(xiàng)目 單價(jià) 數(shù)量 金額\r\n"); for (int i = 0; i < lvwDetail.Items.Count; i++) { ListViewItem item = lvwDetail.Items[i]; string itemName = item.SubItems[1].Text; if (itemName.Contains("買斷消費(fèi)")) { itemName = "買斷消費(fèi)"; } sb.AppendFormat("{0}", itemName); sb.AppendFormat(" {0}", item.SubItems[2].Text); sb.AppendFormat(" {0}", item.SubItems[6].Text); sb.AppendFormat(" {0}\r\n", item.SubItems[7].Text); } sb.AppendFormat("\r\n\r"); sb.AppendFormat("總 金 額:{0}\r\n", Convert.ToDecimal(this.lblConsume.Tag).ToString("C2")); sb.AppendFormat("實(shí)收金額:{0}\r\n", Convert.ToDecimal(this.txtAmount.Text).ToString("C2")); sb.AppendFormat("實(shí)收大寫(xiě):{0}\r\n", RMBUtil.CmycurD(this.txtAmount.Text)); sb.AppendFormat("現(xiàn) 金:{0}\r\n", Convert.ToDecimal(this.txtPay.Text).ToString("C2")); sb.AppendFormat("找 零:{0}\r\n", Convert.ToDecimal(this.lblChange.Text).ToString("C2")); sb.AppendFormat("\r\n\r"); Portal.gc.PosPrint(sb.ToString()); } /// <summary> /// 提供通用的POS打印函數(shù) /// </summary> public void PosPrint(string printString) { bool useUSB = SystemConfig.Default.IsUSBPOSPrinter; if (!useUSB) { if (MessageUtil.ShowYesNoAndTips("您是否確定進(jìn)行POS打???") == DialogResult.No) { return; } POSPrinter print = new POSPrinter(SystemConfig.Default.PosPrintPort); string error = print.PrintLine(printString); if (error != "") { MessageUtil.ShowError(error); } } else { FrmPosPrintPreview dlg = new FrmPosPrintPreview(); printString = "\r\n\r\n\r\n\r\n" + printString; printString += string.Format("\r\n簽單金額:\r\n"); printString += string.Format("\r\n簽單單位:\r\n"); printString += string.Format("\r\n簽 單 人:\r\n"); dlg.PrintString = printString; dlg.ShowDialog(); } } 5、玻璃效果圖片按鈕控件 VistaButton本輔助類主要是用來(lái)方便實(shí)現(xiàn)美觀的圖片按鈕,類似玻璃效果的那種,圖片放上去可以帶有動(dòng)態(tài)陰影效果。 這個(gè)是一個(gè)Vista樣式的控件,其代碼是在Codeproject上有的:http://www./KB/buttons/VistaButton.aspx 通過(guò)改變其顏色,就可以實(shí)現(xiàn)不同的效果,而且鼠標(biāo)靠近或者離開(kāi)都有特殊的效果,比較酷。例如我加上顏色圖片后,得到的效果如下所示: 使用說(shuō)明: 在VS工具箱里面添加該共用類庫(kù)的程序集應(yīng)用,然后添加VistaButton控件的使用即可。 6、TreeView的包裝類,實(shí)現(xiàn)樹(shù)的DragDrop拖拉的操作的輔助類 TreeViewDrager1)輔助類提供的方法接口如下所示: public class TreeViewDrager { /// <summary> /// 設(shè)置拖動(dòng)樹(shù)的時(shí)候,顯示的圖片,顯示其中第一個(gè) /// </summary> public ImageList TreeImageList /// <summary> /// 默認(rèn)構(gòu)造函數(shù) /// </summary> public TreeViewDrager() /// <summary> /// 參數(shù)構(gòu)造函數(shù),設(shè)置操作的TreeView /// </summary> /// <param name="treeView"></param> public TreeViewDrager(TreeView treeView) /// <summary> /// 處理拖動(dòng)節(jié)點(diǎn)后的事件 /// </summary> public event ProcessDragNodeEventHandler ProcessDragNode; } 2)輔助類的使用例子代碼如下所示 private void Init() { TreeViewDrager treeViewDrager = new TreeViewDrager(this.treeView1); treeViewDrager.TreeImageList = this.imageList1;//不設(shè)置這個(gè)也可以,只是拖動(dòng)的時(shí)候沒(méi)圖標(biāo)。 treeViewDrager.ProcessDragNode += new ProcessDragNodeEventHandler(treeViewDrager_ProcessDragNode); } private bool treeViewDrager_ProcessDragNode(TreeNode from, TreeNode to) { //這里根據(jù)from/to兩個(gè)節(jié)點(diǎn)記錄的信息去進(jìn)行數(shù)據(jù)庫(kù)持久化的工作。 //根據(jù)持久化的結(jié)果決定節(jié)點(diǎn)是否會(huì)最終實(shí)現(xiàn)拖動(dòng)操作。 return true; } 實(shí)際上,我們需要處理拖動(dòng)后的事件,一般來(lái)說(shuō),我們需要調(diào)整他們的父目錄就可以了,如我的通用字典管理模塊,就是利用這個(gè)控件實(shí)現(xiàn)拖動(dòng)效果。 public FrmDictionary() { InitializeComponent(); TreeViewDrager drager = new TreeViewDrager(this.treeView1); drager.TreeImageList = this.imageList1; drager.ProcessDragNode += new ProcessDragNodeEventHandler(drager_ProcessDragNode); } bool drager_ProcessDragNode(TreeNode dragNode, TreeNode dropNode) { if (dragNode != null && dragNode.Text == "數(shù)據(jù)字典管理") return false; if (dropNode != null && dropNode.Tag != null) { string dropTypeId = dropNode.Tag.ToString(); string dragTypeId = dragNode.Tag.ToString(); //MessageUtil.ShowTips(string.Format("dropTypeId:{0} dragTypeId:{1}", dropTypeId, drageTypeId)); try { DictTypeInfo dragTypeInfo = BLLFactory<DictType>.Instance.FindByID(dragTypeId); if (dragTypeInfo != null) { dragTypeInfo.PID = dropTypeId; BLLFactory<DictType>.Instance.Update(dragTypeInfo, dragTypeInfo.ID); } } catch (Exception ex) { LogHelper.Error(ex); MessageUtil.ShowError(ex.Message); return false; } } return true; }
![]() 專注于Winform開(kāi)發(fā)框架、WCF開(kāi)發(fā)框架的研究及應(yīng)用。 轉(zhuǎn)載請(qǐng)注明出處: ![]() 標(biāo)簽: 公用類庫(kù)使用幫助
25
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
首頁(yè)上一篇:Python Rapid GUI Programming 第二篇。 30行寫(xiě)一個(gè)更奇葩的計(jì)算器。Python 基礎(chǔ)教程 首頁(yè)下一篇:Java事務(wù)處理全解析(二)——失敗的案例 |
|
來(lái)自: quasiceo > 《計(jì)算機(jī)》