之前贴了图表控件的示例代码及控件文件,今天把源代码总结了一下,顺便贴出来.
运用知识点:在一般的软件开发水平(就是很基础的知识)上运用了1 . 自定义控件的基础知识; 2 . .net类库中的gdi+相关的类; 我承认这两个知识点是很基础很简单的常识,我都不好意思在这里啰嗦,但是为了我以后忘了,所以还是把它记录下来,以防我以后哪天记不起来了可以翻看一下.(高手可选择绕行,就不浪费你们的时间了)
控件源代码和一个使用示例下载 (本篇就不贴示例的代码了,只显示他的效果图)
(点击查看大图,由于图片太长,可以拖动查看其余部分,单击图片或者遮罩关闭大图!)
对于这些知识我也是略懂皮毛,还请大家多多指点.
a.创建类库:首先新建解决方案,然后添加一个类库,最后新建一个类,这个类是自己控件类,给他起一个有意义的名称,最好不要改他的命名空间,因为为了给我们的控件添加像工具箱中的控件一样有一个小图标,我之前改了命名空间小图标添加不成功,希望三思.
b.继承合适的父类:让我们的控件类继承类Control(基础控件类,可以开发最基础的控件),WebControl(比较高一级的控件,可以开发一般的控件),CompositeControl(更为高级,开发组件,由多个控件构成的控件容器),他们继承关系是CompositeControl继承WebControl,WebControl基础Control,可以根据需求来选择使用哪个,图表控件使用的是Control开发.
c.装饰控件类:使用Attribute类装饰我们的控件类:a. [Description("Name")]:定义手表放到控件上时显示的提示消息文字; b.[ToolboxData("<{0}:BarCharts runat='server' />")]:是控件被拖进页面时定义默认的属性赋值; c.[ToolboxBitmap(typeof(BarCharts), "Resources.barimg.bmp")]:是控件的显示小图标,替换蓝色的齿轮.以上都是可选的,不止这三种.
d.写入控件的基本属性及功能:类中可以写属性方法事件,以便与用户互交,属性的装饰: a.[Description("Name")]:是属性在属性面板中的描字符串, b.[Browsable(true)]:是否显示到属性面板中, c.[Category("Name")]:是属性的分组名称, d.[DefaultValue(value)]:是属性默认值,如果属性定义时为该默认值,那么属性面板中的值不是粗体,否则以粗体显示.
e.重写控件的输出内容:使用protected override void Render(HtmlTextWriter writer){writer.Write("Hello word");}方法将字符"Hello word"显示到页面中,也可以加HTML标签,
f.添加引用,开始使用:给我们需要该控件的项目添加该控件的引用,有两种方法添加,1. 添加为项目引用,他们在用一个解决方案之中; 2.添加文件引用,取出改控件类库的dll文件复制到相应项目中然后添加改文件的应用;然后可以添加到工具箱中方便使用,
Bitmap bmap = new Bitmap(width,height);//创建一个图像,宽度,height:高度 Graphics g = Graphics.FromImage(bmap);//创建一个画布 g.SmoothingMode = SmoothingMode.AntiAlias;//消除画布的锯齿 g.Clear(BackGroundColor);//初始化画布的背景色 Pen pen = new Pen(Color.Red);//定义一个画笔 SolidBrush solidburshs = new SolidBrush(Color.Red);//定义画刷 Rectangle rect = new Rectangle(left, top, width, height);//定义一个矩形,left:距左距离,top:距上距离,宽度,height:高度 g.DrawRectangle(pen, rect);//在画布上绘制一个矩形,除此之外还有很多类似的方法,用于绘制,填充:文字,矩形,圆形,扇形,线条,路径,弧度...... PointF pf = new PointF(left, top);//定义一个坐标,left:距左距离,top:距上距离 g.DrawString("Text", new System.Drawing.Font(), solidburshs, pf); bmp.Save(path);//图片存为,path:路径
以上为该图表控件的最基础的两个知识点;
其中里面还定义了一个控件的基本的数据源类:ChartsDataLists,ChartsColumn,ChartsRow,ChartsValue,他的构造和DataTable相仿,我们使用时可以直接定义ChartsDataLists来作为控件的数据源
ChartsDataLists cd = new ChartsDataLists(); List<ChartsColumn> ccs = new List<ChartsColumn>();//所有的列 ccs.Add(new ChartsColumn("百度"));//列标题 ccs.Add(new ChartsColumn("搜搜"));//列标题 ccs.Add(new ChartsColumn("搜狗"));//列标题 ccs.Add(new ChartsColumn("有道"));//列标题 ccs.Add(new ChartsColumn("谷歌"));//列标题 ccs.Add(new ChartsColumn("必应"));//列标题 cd.Columns = ccs; List<ChartsRow> crs = new List<ChartsRow>();//所有行 crs.Add(new ChartsRow("12月17日"));//行标题 crs.Add(new ChartsRow("12月18日"));//行标题 crs.Add(new ChartsRow("12月19日"));//行标题 cd.Rows = crs; //写入数据 cd.Add(new ChartsValue(ccs[0], crs[0], 4807)); cd.Add(new ChartsValue(ccs[1], crs[0], 1482)); cd.Add(new ChartsValue(ccs[2], crs[0], 1235)); cd.Add(new ChartsValue(ccs[3], crs[0], 1235)); cd.Add(new ChartsValue(ccs[4], crs[0], 2375)); cd.Add(new ChartsValue(ccs[5], crs[0], 570)); cd.Add(new ChartsValue(ccs[0], crs[1], 6517)); cd.Add(new ChartsValue(ccs[1], crs[1], 855)); cd.Add(new ChartsValue(ccs[2], crs[1], 1596)); cd.Add(new ChartsValue(ccs[3], crs[1], 2128)); cd.Add(new ChartsValue(ccs[4], crs[1], 950)); cd.Add(new ChartsValue(ccs[5], crs[1], 950)); cd.Add(new ChartsValue(ccs[0], crs[2], 6517)); cd.Add(new ChartsValue(ccs[1], crs[2], 2128)); cd.Add(new ChartsValue(ccs[2], crs[2], 2337)); // //以下两种赋值方法一样,不过行列的值一定要对应 // //cd.Add(new ChartsValue(ccs[3], crs[2], 2413)); //cd.Add(new ChartsValue(ccs[4], crs[2], 1406)); //cd.Add(new ChartsValue(ccs[5], crs[2], 1501)); cd.Add(new ChartsValue(new ChartsColumn("有道"), new ChartsRow("12月19日"), 2413)); cd.Add(new ChartsValue(new ChartsColumn("谷歌"), new ChartsRow("12月19日"), 1406)); cd.Add(new ChartsValue(new ChartsColumn("必应"), new ChartsRow("12月19日"), 1501));