C# 列印小票 POS

sz_bdqn發表於2010-10-01

C# 列印小票 POS

       最近在寫一個餐飲的收銀系統,以前從來沒有碰過印表機這玩意。感覺有些無從下手,在前面做報表時,總想找第三方的控制元件來用用,結果始終不行沒搞定、沒研究透,催得急沒辦法還是的動手自己寫個,哈...查了些相關的資料,感覺也不難,沒多久就搞定了。主要用到PrintDocumentPrintPreviewDialog兩個物件一個用來列印,一個用來閱覽,如果在設定模板OK後,若果人流量比較多的話就直接列印不必在閱覽,這樣會快好多。

 

     其他的也不多少了,下面來看具體的實現:

private void button2_Click(object sender, EventArgs e)

{

    //列印預覽           

    PrintPreviewDialog ppd = new PrintPreviewDialog();

    PrintDocument pd = new PrintDocument();

   

    //設定邊距

    Margins margin = new Margins(20, 20, 20, 20);

    pd.DefaultPageSettings.Margins = margin;

   

    ////紙張設定預設

    PaperSize pageSize = new PaperSize("First custom size", getYc(58), 600);

    pd.DefaultPageSettings.PaperSize = pageSize;

   

    //列印事件設定           

    pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);

    ppd.Document = pd;

    ppd.ShowDialog();

   

    try

    {

        pd.Print();

    }

    catch (Exception ex)

    {

        MessageBox.Show(ex.Message, "列印出錯", MessageBoxButtons.OK, MessageBoxIcon.Error);

        pd.PrintController.OnEndPrint(pd, new PrintEventArgs());

    }

}

 

這裡的程式碼主要是獲取需要列印的內容,在實際運用中這裡要改成動態的哦

private int getYc(double cm)

{

    return (int)(cm / 25.4) * 100;

}

 

public string GetPrintStr()

{

    StringBuilder sb = new StringBuilder();

 

    string tou = "伊尹餐飲公司";

    string address = "深圳市羅湖區東門老街29";

    string saleID = "2010930233330";

    string item = "專案";

    decimal price = 25.00M;

    int count = 5;

    decimal total = 0.00M;

    decimal fukuan = 500.00M;

   

    sb.Append("            " + tou + "     /n");

    sb.Append("-----------------------------------------------------------------/n");

    sb.Append("日期:" + DateTime.Now.ToShortDateString() + "  " + "單號:" + saleID + "/n");

    sb.Append("-----------------------------------------------------------------/n");

    sb.Append("專案" + "/t/t" + "數量" + "/t" + "單價" + "/t" + "小計" + "/n");

    for (int i = 0; i < count; i++)

    {

        decimal xiaoji = (i+1) * price;              

        sb.Append(item + (i+1) + "/t/t" + (i+1) + "/t" + price + "/t" + xiaoji);

        total += xiaoji;

 

        if (i != (count))

            sb.Append("/n");

    }

 

    sb.Append("-----------------------------------------------------------------/n");

    sb.Append("數量: " + count + " 合計:   " + total+"/n");

    sb.Append("付款: 現金" + "    " + fukuan);

    sb.Append("         現金找零:" + "   " + (fukuan - total) + "/n");

    sb.Append("-----------------------------------------------------------------/n");

    sb.Append("地址:" + address + "/n");

    sb.Append("電話:123456789   123456789/n");

  

    sb.Append("                 謝謝惠顧歡迎下次光臨                    ");

    return sb.ToString();

}

 

列印效果如下:

 

    對於目前的理解,前些天學的設計模式,感覺在這裡好像可以用到模板模式和裝飾模式,我的理由是:關於收銀列印和後廚列印的樣式、風格會不同,將來也可能會改動,所以,如果把它設定成模板就好了,根據模板來列印,將來要換風格的話,直接更換模板即可(這只是我的個人理解)。而每個小票樣式都有頭、主題、尾,根據這些組合似乎可以使用裝飾模式哈.這只是我的一想法,待以後我會是試試看。

 

 

 

 

 

相關文章