俗話說,一個(gè)好漢十個(gè)幫胎许,眾人拾柴火焰高等都說明一個(gè)道理峻呛,有更多的資源,更豐富的積累辜窑,都是助你走向成功钩述,走向頂峰的推動力。
本篇的公用類庫的介紹主題是程序開發(fā)中常用到的一些輔助類穆碎,在幫助文檔中歸類到其他目錄下面牙勘,本篇主要介紹在Winform開發(fā)用,常用到的一些類庫所禀,包括Windows服務(wù)操作方面、DOS操作、串口操作色徘、POS打印操作以及一些參加的界面控件的輔助類恭金。
本篇繼續(xù)繼續(xù)整理優(yōu)化已有的共用類庫,并繼續(xù)發(fā)表隨筆介紹公用類庫的接口方法以及詳細(xì)使用操作褂策,力求給自己繼續(xù)優(yōu)化横腿,積攢更豐富的公用類庫資源,加深了解的同時(shí)斤寂,也給大家展現(xiàn)公用類庫好的方面耿焊。
厚積薄發(fā),豐富的公用類庫積累遍搞,助你高效進(jìn)行系統(tǒng)開發(fā)(1)----開篇總結(jié)
厚積薄發(fā)罗侯,豐富的公用類庫積累,助你高效進(jìn)行系統(tǒng)開發(fā)(2)----常用操作
厚積薄發(fā)溪猿,豐富的公用類庫積累钩杰,助你高效進(jìn)行系統(tǒng)開發(fā)(3)----數(shù)據(jù)庫相關(guān)操作
厚積薄發(fā),豐富的公用類庫積累诊县,助你高效進(jìn)行系統(tǒng)開發(fā)(4)----CSV榜苫、Excel、INI文件翎冲、獨(dú)立存儲等文件相關(guān)
厚積薄發(fā),豐富的公用類庫積累媳荒,助你高效進(jìn)行系統(tǒng)開發(fā)(5)----熱鍵抗悍、多線程驹饺、窗體動畫凍結(jié)等窗體操作
厚積薄發(fā),豐富的公用類庫積累缴渊,助你高效進(jìn)行系統(tǒng)開發(fā)(6)----全屏截圖赏壹、圖標(biāo)獲取、圖片打印衔沼、頁面預(yù)覽截屏蝌借、圖片復(fù)雜操作等
厚積薄發(fā),豐富的公用類庫積累指蚁,助你高效進(jìn)行系統(tǒng)開發(fā)(7)-----聲音播放菩佑、硬件信息、鍵盤模擬及鉤子凝化、鼠標(biāo)模擬及鉤子等設(shè)備相關(guān)
厚積薄發(fā)稍坯,豐富的公用類庫積累,助你高效進(jìn)行系統(tǒng)開發(fā)(8)----非對稱加密搓劫、BASE64加密瞧哟、MD5等常用加密處理
厚積薄發(fā),豐富的公用類庫積累枪向,助你高效進(jìn)行系統(tǒng)開發(fā)(9)----各種常用輔助類
厚積薄發(fā)勤揩,豐富的公用類庫積累,助你高效進(jìn)行系統(tǒng)開發(fā)(10)---各種線程同步的集合類
厚積薄發(fā)秘蛔,豐富的公用類庫積累陨亡,助你高效進(jìn)行系統(tǒng)開發(fā)(11)---各種線程相關(guān)操作類
厚積薄發(fā),豐富的公用類庫積累缠犀,助你高效進(jìn)行系統(tǒng)開發(fā)(12)--- 網(wǎng)絡(luò)相關(guān)操作輔助類
厚積薄發(fā)数苫,豐富的公用類庫積累,助你高效進(jìn)行系統(tǒng)開發(fā)(13)--- 各種常用的輔助類2
至此辨液,整個(gè)厚積薄發(fā)的類庫整理也落下帷幕虐急,整個(gè)過程歷時(shí)一年多,整理優(yōu)化近兩百多個(gè)類庫滔迈,幫助說明近兩百個(gè)止吁。本篇作為本系列的終結(jié)篇,貼出最終的CHM幫助文檔燎悍,以及最有的類庫DLL敬惦,如果需要進(jìn)一步了解整個(gè)類庫的信息,可以隨時(shí)聯(lián)系我谈山。
CHM幫助文檔持續(xù)更新中俄删,統(tǒng)一下載地址是: http://www.iqidi.com/download/commonshelp.rar
最新公用類庫DLL+XML注釋文件下載地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar
整個(gè)幫助類庫的CHM文件概況如下所示。
1、 Window服務(wù)輔助類WinServiceHelper畴椰,包括安裝臊诊、卸載、啟動斜脂、停止抓艳、重新啟動、判斷服務(wù)是否存在等操作帚戳。
本輔助類主要是用來方便實(shí)現(xiàn)Window服務(wù)的各種操作玷或,包括安裝、卸載片任、啟動偏友、停止、重新啟動蚂踊、判斷服務(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>
/// 啟動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ù)的啟動項(xiàng) 2為自動,3為手動
/// </summary>
/// <param name="startType"></param>
/// <param name="serviceName"></param>
/// <returns></returns>
public static bool ChangeServiceStartType(int startType, string serviceName)
/// <summary>
/// 獲取服務(wù)啟動類型 2為自動 3為手動 4 為禁用
/// </summary>
/// <param name="serviceName"></param>
/// <returns></returns>
public static string GetServiceStartType(string serviceName)
/// <summary>
/// 驗(yàn)證服務(wù)是否啟動
/// </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 = "自動";
}
else if (startType == "3")
{
startTypeStatus = "手動";
}
else if (startType == "4")
{
startTypeStatus = "禁用";
}
#endregion
bool running = WinServiceHelper.ServiceIsRunning(serviceName);
this.txtServiceStatus.Text = string.Format("啟動類型:{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開發(fā)框架之通用定時(shí)服務(wù)管理》
2醋粟、DOS操作封裝輔助類 DosHelper靡菇。
本輔助類主要是用來方便實(shí)現(xiàn)DOS操作。DOS操作在自定義安裝數(shù)據(jù)庫腳本米愿、運(yùn)行特殊命令厦凤、后臺注冊控件、操作Windows Service等方面都有用到育苟。在另一個(gè)輔助類SqlScriptHelper较鼓,就是采用運(yùn)行DOS命令方式進(jìn)行Sql腳本的數(shù)據(jù)庫安裝。
1)輔助類提供的方法接口如下所示
/// <summary>
/// 后臺執(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">寫入命令行的確認(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開發(fā)框架之通用定時(shí)服務(wù)管理》
3违柏、串口開發(fā)輔助類 SerialPortUtil
一般人可能開發(fā)C#相關(guān)的項(xiàng)目很多年博烂,不一定會接觸到串口的開發(fā),了解熟悉對硬件串口的開發(fā)漱竖,串口也不再是什么神秘的東西禽篱,利用SerailPort組件,對串口的各種操作也非常的方便馍惹,由于本人總是喜歡把一些常用的東西封裝成可供重復(fù)利用的類庫躺率,因此玛界,在閱百家代碼,項(xiàng)目積累總結(jié)的基礎(chǔ)上肥照,提煉總結(jié)優(yōu)化脚仔,把對串口的操作封裝成一個(gè)公用的類庫,應(yīng)付日常的串口編程開發(fā)舆绎,也算是工作的一個(gè)階段性總結(jié)吧。
微軟在 .NET FrameWork2.0中對串口通訊進(jìn)行了封裝们颜,我們可以在.net2.0及以上版本開發(fā)時(shí)直接使用SerialPort類對串口進(jìn)行讀寫操作吕朵。
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()等
從上面的測試?yán)訄D中努溃,我們可以看到,一般對串口的操作阻问,需要提供串口號梧税、波特率、數(shù)據(jù)位称近、停止位第队、奇偶校驗(yàn)的參數(shù),用來構(gòu)造一個(gè)串口操作類刨秆,以便實(shí)現(xiàn)具體的串口操作凳谦,而這些參數(shù)有的是系統(tǒng)內(nèi)置的枚舉參數(shù),我們可以通過遍歷枚舉對象來綁定下來列表(如停止位衡未、奇偶校驗(yàn))尸执;但有些參數(shù)卻不是系統(tǒng)內(nèi)置的枚舉類型,例如波特率缓醋、數(shù)據(jù)位等如失,而且對這些參數(shù)操作也是串口開發(fā)經(jīng)常用到的,因此送粱,第一步褪贵,我對這些參數(shù)的綁定做了一個(gè)簡單的封裝。
1)輔助類的接口代碼如下所示葫督。
/// <summary>
/// 串口開發(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>
/// 串口號
/// </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">串口號</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">串口號</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)打開
/// </summary>
public bool IsOpen
/// <summary>
/// 打開端口
/// </summary>
/// <returns></returns>
public void OpenPort()
/// <summary>
/// 關(guān)閉端口
/// </summary>
public void ClosePort()
/// <summary>
/// 丟棄來自串行驅(qū)動程序的接收和發(fā)送緩沖區(qū)的數(shù)據(jù)
/// </summary>
public void DiscardBuffer()
#region 數(shù)據(jù)寫入操作
/// <summary>
/// 寫入數(shù)據(jù)
/// </summary>
/// <param name="msg"></param>
public void WriteData(string msg)
/// <summary>
/// 寫入數(shù)據(jù)
/// </summary>
/// <param name="msg">寫入端口的字節(jié)數(shù)組</param>
public void WriteData(byte[] msg)
/// <summary>
/// 寫入數(shù)據(jù)
/// </summary>
/// <param name="msg">包含要寫入端口的字節(jié)數(shù)組</param>
/// <param name="offset">參數(shù)從0字節(jié)開始的字節(jié)偏移量</param>
/// <param name="count">要寫入的字節(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>
/// 封裝獲取串口號列表
/// </summary>
/// <returns></returns>
public static string[] GetPortNames()
/// <summary>
/// 設(shè)置串口號
/// </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)位等等)代碼如下所示,這樣我們在窗體界面代碼中洽胶,綁定相關(guān)參數(shù)的數(shù)據(jù)源就很方便了晒夹,如下所示裆馒。
private void Form1_Load(object sender, EventArgs e)
{
BindData();
}
private void BindData()
{
//綁定端口號
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 = "斷開";
}
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ù)覽效览,如果是并口的只有直接輸出无切,沒有預(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ù)弯院,打印并口名稱為LPT1
/// </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("沒有消費(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é)賬單號:{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í)收大寫:{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
本輔助類主要是用來方便實(shí)現(xiàn)美觀的圖片按鈕,類似玻璃效果的那種辫红,圖片放上去可以帶有動態(tài)陰影效果凭涂。 這個(gè)是一個(gè)Vista樣式的控件,其代碼是在Codeproject上有的:http://www.codeproject.com/KB/buttons/VistaButton.aspx
通過改變其顏色贴妻,就可以實(shí)現(xiàn)不同的效果切油,而且鼠標(biāo)靠近或者離開都有特殊的效果,比較酷名惩。例如我加上顏色圖片后澎胡,得到的效果如下所示:
使用說明:
在VS工具箱里面添加該共用類庫的程序集應(yīng)用,然后添加VistaButton控件的使用即可娩鹉」ニ可以在窗體的可視化設(shè)計(jì)界面中,編輯控件的背景色等圖片效果弯予,實(shí)現(xiàn)更多美妙的特效戚宦。該控件屬于界面控件,直接拖動到界面即可使用锈嫩。
6受楼、TreeView的包裝類垦搬,實(shí)現(xiàn)樹的DragDrop拖拉的操作的輔助類 TreeViewDrager
1)輔助類提供的方法接口如下所示:
public class TreeViewDrager
{
/// <summary>
/// 設(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>
/// 處理拖動節(jié)點(diǎn)后的事件
/// </summary>
public event ProcessDragNodeEventHandler ProcessDragNode;
}
2)輔助類的使用例子代碼如下所示
{
TreeViewDrager treeViewDrager = new TreeViewDrager(this.treeView1);
treeViewDrager.TreeImageList = this.imageList1;//不設(shè)置這個(gè)也可以,只是拖動的時(shí)候沒圖標(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ù)庫持久化的工作米绕。
//根據(jù)持久化的結(jié)果決定節(jié)點(diǎn)是否會最終實(shí)現(xiàn)拖動操作。
return true;
}
實(shí)際上馋艺,我們需要處理拖動后的事件义郑,一般來說,我們需要調(diào)整他們的父目錄就可以了丈钙,如我的通用字典管理模塊,就是利用這個(gè)控件實(shí)現(xiàn)拖動效果交汤。
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;
}