• 企业信息开发平台(6)Web表单设计器开源


          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

  • 相关阅读:
    美化滚动条
    js 格式转化
    vue 实现 前端生成随机验证码
    Vue.js CLI4 Vue.config.js标准配置
    在鼠标右键 新建 添加md文件
    节流和防抖
    关于IE 浏览器 GET 请求缓存问题
    VSCode 背景插件
    Java后台开发Tomcat添加https支持小程序开发过程
    InnoDB与MyISAM等存储引擎对比
  • 原文地址:https://www.cnblogs.com/zdming/p/2051748.html
Copyright © 2020-2023  润新知