您的位置:首页 > 其它

Ext.Net 1.2.0_演示 Ext.Net+Barcode 封装条形码控件

2012-01-09 23:11 393 查看
本文内容

概述
演示利用 Ext.Net + Barcode 封装条形码控件
运行结果
修改记录
 

概述

最近项目需要条形码,因为已经为每个业务都创建了编码,只要把编码生成相应的条形码即可。再者,不想在相应的表添加一个字段,既要保存编码,又要保存编码对应的条形码,保存其二进制数据,用的时候再生成条形码(图片)。

需要的时候再生成也可以。而且在页面显示图片,要么生成临时的条形码图片,用完再删;要么向客户端直接发送二进制流,并设置 HTTP 头 content-type="image/jpeg"。第一个方法有点麻烦;而第二个方法,打印报表怎么办?报表可很多来自不同表不同字段的数据等等。

那就把条形码搞成一个控件吧,反正浏览器是可以打印的。

本文演示如何利用 Ext.Net.Panel 和 Barcode 项目创建条形码。封装后如下所示:

[code][code]<cc1:MyBarcode ID="MyBarcode1" runat="server" CustomBarCodeType="CODE39" CustomData="D012659834"


Title="CODE39 条形码">


</cc1:MyBarcode>

[/code]
[/code]

其中,

MyBarcode 控件为自定义条形码控件;

CustomBarCodeType 属性是条形码类型;

CustomData 属性是要生成条形码的字符串。

 

演示利用 Ext.Net + Barcode 封装条形码控件

解决方案结构





 

自定义 MyBarcode UI

[code]
[code]using System;


using Ext.Net;


using System.ComponentModel;


 


namespace MyExtNet.Control


{


public partial class MyBarcode


{


 


[DefaultValue("")]


[Description("条形码类型)")]


public string CustomBarCodeType


{


get


{


return (string)this.ViewState["CustomBarCodeType"] ?? "";


}


set { this.ViewState["CustomBarCodeType"] = value; }


}


[DefaultValue("")]


[Description("数据")]


public string CustomData


{


get


{


return (string)this.ViewState["CustomData"] ?? "";


}


set { this.ViewState["CustomData"] = value; }


}


 


public MyBarcode()


{


this.AnimCollapse = false;


this.AutoDataBind = false;


}


protected override void OnPreRender(EventArgs e)


{


base.OnPreRender(e);


if (this.CustomBarCodeType.Length <= 0)


throw new NullReferenceException("Invalid Param.");


if (this.Width.IsEmpty)


this.Width = System.Web.UI.WebControls.Unit.Pixel(250);


if (this.Height.IsEmpty)


this.Height = System.Web.UI.WebControls.Unit.Pixel(80);


 


this.AutoLoad.Url = "~/BarcodeHandler.ashx";


this.AutoLoad.Mode = Ext.Net.LoadMode.IFrame;


this.AutoLoad.Method = Ext.Net.HttpMethod.GET;


this.AutoLoad.Params.Add(new Parameter() { Name = "Data", Value = this.CustomData, Mode = Ext.Net.ParameterMode.Value });


this.AutoLoad.Params.Add(new Parameter() { Name = "BarCodeType", Value = this.CustomBarCodeType, Mode = Ext.Net.ParameterMode.Value });


this.AutoLoad.Params.Add(new Parameter() { Name = "Width", Value = this.Width.Value.ToString(), Mode = Ext.Net.ParameterMode.Value });


this.AutoLoad.Params.Add(new Parameter() { Name = "Height", Value = this.Height.Value.ToString(), Mode = Ext.Net.ParameterMode.Value });


}


}


}

[/code]
[/code]

 

自定义 MyBarcode Logic

[code]
[code]using System;


using Ext.Net;


using System.Web;


 


namespace MyExtNet.Control


{


public partial class MyBarcode : Ext.Net.Panel


{


}


}

[/code]
[/code]

说明

MyBarcode UI 和 MyBarcode Logic 是一个分部类 MyBarcode,对于自定义 WebControl 来说,将控件的 UI 部分和逻辑部分分别实现,很清晰。本例的 MyBarcode Logic 部分没内容。

 

自定义处理程序 BarcodeHandler.ashx

该处理程序根据指定字符串生成条形码,并发送给客户端。

[code]
[code]using System;


using System.Collections.Generic;


using System.Linq;


using System.Web;


using System.Web.Services;


using System.Drawing;


using System.Drawing.Imaging;


using System.IO;


 


namespace ExtNetBar


{


/// <summary>


/// $codebehindclassname$ 的摘要说明


/// </summary>


//[WebService(Namespace = "http://tempuri.org/")]


//[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]


public class BarcodeHandler : IHttpHandler


{


private ImageFormat _imageFormat = ImageFormat.Jpeg;


HttpResponse _response;


HttpRequest _request;


string data;


BarcodeLib.BarCodeType barCodeType;


 


public void ProcessRequest(HttpContext context)


{


_response = context.Response;


_request = context.Request;


 


try


{


data = _request.QueryString["Data"].ToString();


if (_request.QueryString["BarCodeType"].ToString().Length > 0)


barCodeType = (BarcodeLib.BarCodeType)Enum.Parse(typeof(BarcodeLib.BarCodeType), _request.QueryString["BarCodeType"].ToString());


else


barCodeType = BarcodeLib.BarCodeType.CODE128;


int width = (int)(Convert.ToDouble(_request.QueryString["Width"].ToString()));


int height = (int)Convert.ToDouble(_request.QueryString["Height"].ToString());


Bitmap bitMap = (Bitmap)BarcodeLib.Barcode.DoEncode(barCodeType, data, width, height);


WriteImageToStream(bitMap);


}


catch (Exception ex)


{


WriteImageToStream(CreateErrorBitmap(ex.Message));


}


}


private Bitmap CreateErrorBitmap(string errMessage)


{


int width = 300;


int height = 100;


 


Bitmap errBitmap = new Bitmap(width, height);


 


Graphics g = Graphics.FromImage(errBitmap);


 


StringFormat strFormat = new StringFormat();


 


strFormat.Alignment = StringAlignment.Center;


strFormat.LineAlignment = StringAlignment.Center;


 


g.FillRectangle(Brushes.White, 0, 0, width, height);


g.DrawRectangle(new Pen(Brushes.LightGray, 1), new Rectangle(0, 28, width - 1, height - 33));


 


strFormat.Alignment = StringAlignment.Center;


strFormat.LineAlignment = StringAlignment.Near;


g.DrawString("Barcode Generator Error", new Font("Arial", 10, FontStyle.Bold), Brushes.Red, new Rectangle(0, 5, width, 15), strFormat);


 


strFormat.Alignment = StringAlignment.Center;


strFormat.LineAlignment = StringAlignment.Center;


 


switch (errMessage)


{


case "Wrong character":


errMessage = "Input data contains unsupported characters - select another barcode type or correct your input data.";


break;


case "Wrong number of input characters":


errMessage = "This barcode needs a specific number of input characters - correct your data.";


break;


default:


break;


}


 


g.DrawString(errMessage, new Font("Arial", 10), Brushes.Red, new Rectangle(8, 28, width - 16, height - 35), strFormat);


 


return errBitmap;


}


private void WriteImageToStream(Bitmap bitMap)


{


_response.ClearContent();


_response.AddHeader("Content-type", "image/jpeg");


bitMap.Save(_response.OutputStream, _imageFormat);


}


public bool IsReusable


{


get


{


return false;


}


}


}


}

[/code]
[/code]

 

创建页面

[code]
[code]<%@ Page Language="C#" %>


 


<%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>


<%@ Register Assembly="MyExtNet.Control" Namespace="MyExtNet.Control" TagPrefix="cc1" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">


<head runat="server">


<title></title>


 


<script runat="server"> 
protected void Page_Load(object sender, EventArgs e)
 {
if (!X.IsAjaxRequest)
 {
this.MyBarcode6.CustomBarCodeType = "UPCA";
this.MyBarcode6.CustomData = "101265983434";
 }
 }
</script>

 


</head>


<body>


<form id="form1" runat="server">


<ext:ResourceManager ID="ResourceManager1" runat="server">


</ext:ResourceManager>


<cc1:MyBarcode ID="MyBarcode1" runat="server" CustomBarCodeType="CODE39" CustomData="D012659834"


    Title="CODE39 条形码">


</cc1:MyBarcode>


<cc1:MyBarcode ID="MyBarcode2" runat="server" CustomBarCodeType="CODE93" CustomData="D012659834"


   Title=" CODE93 条形码">


</cc1:MyBarcode>


<cc1:MyBarcode ID="MyBarcode3" runat="server" CustomBarCodeType="Codabar" CustomData="A90126598D"


   Title=" Codabar 条形码">


</cc1:MyBarcode>


<cc1:MyBarcode ID="MyBarcode4" runat="server" CustomBarCodeType="ISBN" CustomData="1012659834"


   Title="ISBN 条形码">


</cc1:MyBarcode>


<cc1:MyBarcode ID="MyBarcode5" runat="server" CustomBarCodeType="UPCA" CustomData="101265983434"


   Title="UPCA 条形码">


</cc1:MyBarcode>


<cc1:MyBarcode ID="MyBarcode6" runat="server" Title="UPCA 条形码">


</cc1:MyBarcode>


</form>


</body>


</html>

[/code]
[/code]

其中,

ID 为 MyBarcode1,创建 CODE39 条形码;

ID 为 MyBarcode2,创建 CODE93 条形码;

ID 为 MyBarcode3,创建 Codebar 条形码;

ID 为 MyBarcode4,创建 ISBN 条形码;

ID 为 MyBarcode5,创建 UPCA 条形码,利用标记创建;

ID 为 MyBarcode6,创建 UPCA 条形码,后台创建。

 

运行结果





 

修改记录

第一次 2012-1-10 [UPDATE] 概述

 

下载 Demo

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐