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

版权声明:本文为zdming原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zdming/archive/2011/05/20/2051748.html