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标签扩展,这里已有属性如果各位觉得不需要的话,可以删除,删除的时候有三个地方要改:控件类,控件解析类,控件属性排序类

