array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 企业信息开发平台(6)Web表单设计器开源 - 爱码网
zdming

      Web表单设计器主要是利用WebBrowser控件,对网页文件进行编辑,最后上传到IIS当中,供Web应用程序使用(Web应用程序在运行时,会对Html元素中的扩展属性进行解析,完成操作).

      设计器操作网页主要是利用 IHTMLDocument2 对象,他是WebBrowser加载网页之后,从WebBrowser.Document.DomDocument属性取得的.加载网页完成后必须将IHTMLDocument2对象的designMode属性设置为:On,意思是开启对网页的设计.

      下面我说明下关键点,主要是WebBrowser中Html元素获取,Html元素与控件实体转换,控件实体属性排序等

1 //取得当前选择的Html元素
2
3 private IHTMLElement GetElementUnderCaret()
4 {
5 IHTMLElement element = null;
6
7 IHTMLTxtRange rg = null;
8 IHTMLControlRange ctlRg = null;
9 switch (doc.selection.type)
10 {
11 case "None":
12 case "Text":
13 rg = doc.selection.createRange() as IHTMLTxtRange;
14
15 if (rg != null)
16 {
17 rg.collapse(true);
18 element = rg.parentElement();
19 }
20 break;
21 case "Control":
22 ctlRg = doc.selection.createRange() as IHTMLControlRange;
23 element = ctlRg.commonParentElement();
24 break;
25 }
26
27 return element;
28 }

       

1 /// <summary>
2  /// 将Html元素转换为控件实体
3  /// </summary>
4  /// <param name="htmlControl">当前选择的Html元素</param>
5  /// <returns></returns>
6  public IControl GetControl(IHTMLElement htmlControl)
7 {
8 if (htmlControl == null) return null;
9 if (!(htmlControl is HTMLButtonElement))
10 return null;
11
12 _htmlButton = htmlControl as HTMLButtonElement;
13 this._htmlControl = htmlControl;
14
15 if (this._button == null) this._button = new WebFormDesigner.ControlOperation.PropertySort.Button();
16
17 //将Html元素属性值设置到控件实体属性
18 if (this._htmlButton.id != null && this._htmlButton.id.Trim() != "")
19 {
20 this._button.Id = this._htmlButton.id;
21 this._button.Name = this._htmlButton.id;
22 }
23 if (this._htmlButton.title != null && this._htmlButton.title.Trim() != "")
24 this._button.Title = this._htmlButton.title;
25 if (this._htmlButton.value != null && this._htmlButton.value.Trim() != "")
26 this._button.Value = this._htmlButton.value;// this._htmlControl.getAttribute("value", 0) as string;
27 if (this._htmlButton.getAttribute("buttontype", 0) != null && this._htmlButton.getAttribute("buttontype", 0).ToString() != "")
28 this._button.ButtonType = this._htmlButton.getAttribute("buttontype", 0).ToString();
29 else
30 this._htmlButton.removeAttribute("buttontype", 0);
31 this._button.ToDataEx = WebFormDesigner.ControlOperation.Evaluate.Parameters.ConvertFormString(this._htmlButton.getAttribute("todataex", 0) as string);
32 if (this._htmlButton.accessKey != null && this._htmlButton.accessKey.Trim() != "")
33 this._button.AccessKey = this._htmlButton.accessKey;//.getAttribute("accesskey", 1) as string;
34 if (this._htmlButton.tabIndex != 0)
35 this._button.TabIndex = this._htmlButton.tabIndex;//Int32.Parse(.getAttribute("tabindex", 0).ToString());
36 if (this._htmlButton.className != null && this._htmlButton.className.Trim() != "")
37 this._button.Class = this._htmlButton.className;
38 this._button.Style = new CustomStyle(this._htmlButton.style);
39 return this._button;
40 }
1 /// <summary>
2 /// 将控件实体转换为Html元素
3 /// </summary>
4 /// <param name="control"></param>
5 /// <returns></returns>
6 public IHTMLElement GetHtmlControl(IControl control)
7 {
8 if (control == null || !(control is PropertySort.Button)) return null;
9 this._button = control as PropertySort.Button;
10
11 if (this._htmlControl == null || this._htmlButton == null) return null;
12
13 //将控件实体属性值设置到Html元素属性
14 if (this._button.Id != null && this._button.Id != "")
15 {
16 this._htmlButton.id = this._button.Id;
17 this._htmlButton.name = this._button.Id;
18 }
19 if (this._button.Title != null && this._button.Title.Trim() != "")
20 this._htmlButton.title = this._button.Title;
21 if (this._button.Value != null && this._button.Value.Trim() != "")
22 this._htmlButton.value = this._button.Value;
23 if (this._button.ButtonType == null)
24 this._htmlButton.removeAttribute("buttontype", 0);
25 else
26 this._htmlButton.setAttribute("buttontype", this._button.ButtonType, 0);
27 this._htmlButton.setAttribute("todataex", this._button.ToDataEx.ToString(), 0);
28 if (this._button.AccessKey != null && this._button.AccessKey.ToString().Trim() != "")
29 this._htmlButton.accessKey = this._button.AccessKey;
30 if (this._button.TabIndex != 0)
31 this._htmlButton.tabIndex = short.Parse(this._button.TabIndex.ToString());
32 if (this._button.Class != null && this._button.Class.Trim() != "")
33 this._htmlButton.className = this._button.Class;
34 return this._htmlControl;
35 }

对实体类属性进行排序显示,必须继承要排序的实体类,并实现ICustomTypeDescriptor接口

1 class Button : Control.Button, ICustomTypeDescriptor

其中最重要的方法就是GetProperties

1 public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
2 {
3 string[] sortName = new string[] { "CtlType", "Id", "Title", "Value", "ButtonType", "ToDataEx", "AccessKey", "TabIndex", "Class", "Style" };
4 PropertyDescriptorCollection tmpPDC = TypeDescriptor.GetProperties(typeof(Control.Button), attributes);
5 return tmpPDC.Sort(sortName);
6 }

      既然是开源,废话我就不说了,自己看代码.只说明一点,控件自定义属性要与前台(Web应用程序,目前不开源)结合来用,需要各位自己做前台html标签扩展,这里已有属性如果各位觉得不需要的话,可以删除,删除的时候有三个地方要改:控件类,控件解析类,控件属性排序类

      源码:https://files.cnblogs.com/zdming/DHtmlDemo.rar

分类:

技术点:

相关文章: