下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4 本章内当开发控件时如果选择基类,比如选择继承就会成为当前控件的属性集的一部分,图4-1所示的是WebControl类的系统属性。Web控件所应具备的基本属性都4.1.1
4-1WebControlstringstringstrText默认值";publicstringText{{{return}{strText=}}setget语段组成。注意,setget段不是必需的,比如可以去掉set段表示此属性只允许而不允许接收值。ViewState字典中,以便在回发间进行状态管理。请看例子://///////publicstring{{Strings=(String)ViewState["Value"];return((s==null)?String.Empty:s);}{ViewState["Value"]=}}另外,简单属性可以直接使用ViewState其值,因为简单属性可以直接映射为字符串,而ViewState中可以直接接收的格式也是字符串。ViewState是页面视图状态机制中的机制是为解决在Web浏览器两次之间无状态保持而提供的一种机制,视图信息在网页中HiddenField区域,而且每次页面提交都会往返于客户端和服务器,因此一般视图主要用于少量的文本数据信息,而不适合存储数据量比较大的业务数据。另外,复杂属性的也要自己实现视图机制功能,这一点在24-2<cc1:controlproperty<cc1:controlpropertyid="ControlProperty1runat="serverValue="简单属性String类型属性代码标记完全一样。简单属性比较简单,就讲解到这里。.NETFramework为控件设计时属性提供了很多丰富的类,这些属性的功能非常灵活,控式等,甚至可以自己定义一个属性类,实现自己想实现的功能。下面讲一下常用的.NETFramework的属性类对控件的支持功能。true标记属性,表示该属性可以绑定一个有效数据源。BrowsabletrueBrowsable为false。(Appearance(Behavior(Layout(Data(Action设置其值。另外,通过在属性语句体中把set语句段去掉也可以起到相同的效果。设置该属性是否支持特性,默认情况下属性都支持。当该属性与界面无关时可以设置其值为false,禁用该属性的功能。nrSeriaiaionisbilty3DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列gnrSilzaionisbilty(DesgnrSriaiaionisbilt.Contn)指定序列化程序应isbleIDE中的设计器界面切换到代码视图时,看到的代码标记,或反NotifyParentProperty特性。通常使使用该设计特性指示当在页面上以方式使用控件时,嵌套在服务器控件标记内XML元素是应该视为属性还是应视为子控件。通常情况下,包含两种方式ParseChildren(boolchildrenasPropertystringdefaultProperty)childrenasProperty和性为PersistChildren(true),则将服务器控件的子控件作为嵌套服务器控件标记保持。如果为HTML编码的,只能对字符串作这种指定;PrsistenceMode(PersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保性;4Category分组特性基础上的对ConverterTypeName属性来获取为该特性所绑定到的对象提供数据转换的类名。后此特性为类特性,即不是属性的特性,而是类的特性,设置位置也是在类的上面。 TextBoxText属性。ButtonOnClick此属性为JIT编译时代码安全属性。需要使用此属性确保到控件的代码具有适当的安全权限。Control类带有两个JIT编译时代码安全属性标记:nimal)和AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHosting复杂属性是属性的类型不是简单值类型,或者是一个包含其他属性的类。例如.NET<asp:GridView<asp:GridViewID="GridView1"<FooterStyleBackColor="#507CD1"Font-Bold="true"ForeColor="White"<RowStyleBackColor="#EFF3FB""Center"/> "#333333"/> <HeaderStyleBackColor="#507CD1"Font-Bold="true"ForeColor="White"<EditRowStyleBackColor="#2461BF"<AlternatingRowStyleBackColor="White"<asp:ListBoxID="ListBox1"<asp:ListItemValue="1">男<asp:ListItem<asp:ListItemValue="0">女属性标记类型相似,FootStyle/RowStyleFont-Bold这样的属性标记,22连字符形式的复杂属性/////////public{privatestring//////</summary>publicstringName{get{returnstrName;}set{strName=value;}}privateint//////</summary>publicint{get{returnintAge;}set{intAge=value;}}}再在控件中增加一个类型为的属性,将以下代码增加到控件中;;p/////////获得本 {{if{p}return===;}}等set语句,因为一般是对复IDE中打开页面,并打开控件的属性窗口,会4-3
4-3RdOnly如果把所有复杂属性包含其子属性的值都放到这一个框中,显然不太方便。这就要求我们自 增加PersistenceMode和/////////…{…}PersistenceModePersistenceMode特性指定在页面*.aspx或*.ascx法非常重要,这里详细介绍一下它的用法。PersistenceMode有四种枚举状态:<asp:GridView<asp:GridViewID="GridView1"<HeaderStyleBackColor="#507CD1"Font-Bold="true"ForeColor="White"上面代码中的Font-Bold对于<HeaderStyle>来说就是使用了PersistenceMode下的Attribute表示用属性名称作为嵌套表示复杂属性,比如GridView的HeaderStyle属性,就是PersistenceModeInnerProperty标记形式。代码如下:<asp:GridView<asp:GridViewID="GridView1"<HeaderStyleBackColor="#507CD1"Font-Bold="true"ForeColor="White"该特性值与InnerProperty类似,都是在主控件外标记复杂属性。不同的是,InnerDefaultProperty不需要像InnerProperty那样把属性名作为最外,一般用于常用的或<asp:ListBox<asp:ListBoxID="ListBox1"<asp:ListItemValue="1">男<asp:ListItemValue="0">女以上代码中的ListItem,它的特点是直接把ListItem单项放到ListBox的标记内部,而没有增加一个类似<Items>ListItem的外面。另外,InnerDefaultProperty在一个控件类InnerProperty可以设置任意多个复杂属性。<div>保证其内容不能再HTML标记。表示代码不对属性生成代码,即在属性窗口设置的值不会被代码生成*.aspx或*.ascxPeopleName/Sex/Age属性,即我们在属性窗口中修改了Name/Sex/Age的值后,会仅把这些值通过代码映射到*.aspx或*.axcx页面中。;一般复杂属性都要设置为PersistenceModeDesignerSerializationVisibility成上面进行中的代码部分。为属性增加了这两个特性后,再打开类定义代码TypeConverter,如下所示://///////获得本 ///publicclass{…}TypeConverter特性指定转换器的类型,ExpandableObjectConverter表示可扩展对象与其4-5所示。图4-5设 属性在属性浏览器中为设置值,后切换到代码视图,会看到如下标记 <cc1:controlproperty <cc1:controlpropertyid="ControlProperty1"-Name="King 内部嵌套复杂属性标把所有复杂属性都挤到主控件的属性上,显示比较臃肿,设想一下,如果GridViewRowStyle标记形式的复杂属性。<asp:GridView<asp:GridViewID="GridView1"<RowStyleBackColor="#EFF3FB"RowStyle.cs/////////publicclass //TableItemStyle:TableRow和Cell{privateColorbcBackColor;publicColorBackColor{get{returnbcBackColor;}set{bcBackColor=value;}}}/////////publicRowStyleRowStyle{{if(rsRowStyle=={rsRowStyle=new}return}}选择PersistenceMode特性的InnerProperty枚举项,表示生成嵌套标记;至于DesignerSerializationVisibilityContentRowStyle4.1.1/////////,]//publicclassControlProperty:{…}PerseChildren特性指定页面分析器把控件标记中的内容解析为属性还是子控件,该属性false,表示保存为属性。RowStyle的标记形式如下所示:<cc1:controlproperty<cc1:controlpropertyid="ControlProperty1"<RowStyleBackColor="CornflowerBlue"RowStyleGridView<asp:DropDownList<asp:DropDownListid="DropDownList1"runat="server"<asp:ListItemValue="red">红色<asp:ListItemValue="green">绿色内部嵌套默认复杂属性标DropDownList控件中的属性均为内部嵌套默认属性,代码如下:<asp:DropDownList<asp:DropDownListid="DropDownList1"runat="server"ListItem标记外部没有像内部集合属性一样嵌套在<Items></Items>ListItemListItem/////////publicclassListItem:Control{privatestring_Text;privatestring_Value;public{publicListItem(stringstrText,string{this._Text=strText;this._Value=strValue;}//////</summary>publicstringText{get{return_Text;}set{_Text=value;}}//////</summary>publicstringValue{get{return_Value;}set{_Value=value;}}}此子项类的代码比较简单,唯一要说明的是上面的[ToolBoxItem(false)]IDE工ToolBoxItemfalse,否则当使用者拖一个不完Items///////////////[]publicclassItems:{public:{}//////</summary>publicnewintCount{{}}
return//////publicbool{{}}
return/////////<paramname="item"></param>publicnewvoidAdd(ListItemitem){}//////publicnewvoid{}/////////<param///publicnewboolContains(ListItem{return}}/////////<param///publicnewboolRemove(ListItem{return}/////////<param///publicnewListItemthis[int{{return}{base[index]=}}}ParseChildren(true不是子控件,ParseChildren4.3节已经做了讲解;二是设置[PersistChildren(false)]类特性,//////////////////</summary>[ToolboxData("<{0}:CollectionControlPropertyrunat=server></{0}:Collection[ParseChildren(true,[ParseChildren(true,publicclassCollectionControlProperty:{privateItemsitems;publicItemsItems{{if(this.items=={this.items=new}return}}…}4-6<cc1:ListItemID="ListItem1runat="serverText="红色<cc1:ListItemID="ListItem2runat="serverText="蓝色<cc1:ListItemID="ListItem3runat="serverText="绿色内部嵌套编码默认属<asp:DropDownList<asp:DropDownListid="DropDownList1"runat="server"Text(“红色”位置的属性)Value属性是附属于ListItem标记,而是在两个<asp:ListItem></asp:ListItem>标记之间呈现。这样的标记主要用于显示非HTML标记或非子控件的纯文本,本节主要完成这种格式属性的实现。Items///////////////</summary>]publicclassItems2:{}ListItem2///////////////</summary>[ParseChildren(true,"Text")]publicclassListItem2:{privatestring_Text;privatestring_Value;public{publicpublicListItem2(stringstrText,string{this._Text=strText;this._Value=strValue;}//////</summary>publicstring{get{return_Text;}set{_Text=value;}}//////</summary>publicstringValue{get{return_Value;}set{_Value=value;}}}[ParseChildren(true,///////// [ParseChildren(true,"Items")]publicclassEncodedInnerDefaultPropertyControl:{public{}privateItems2items;publicItems2Items{{if(this.items=={this.items=new}return}}…}4-7所示。4-7节中的完全相同,但切换到代码视图界面,会发现序列化后的代 Control1"runat="server"Items-Capacity="4">""本节主要说明控件内部嵌套编码默认属性格式的实现。在实现时需要注意的是,对ListItem2Text是属于ListItem2使用AddParsedSubObject控制复杂内容(子控件.2.3节中实现的属性:<cc1:ListItemID="ListItem1runat="serverText="红色<cc1:ListItemID="ListItem2runat="serverText="蓝色<cc1:ListItemID="ListItem3runat="serverText="绿色题,其中法可以重写AddParsedSubObject来定制自己的页面解析子控件方法。主控件////////////本控件包含三个集合复杂属性两个内部默认嵌套形式一个内部嵌套形式///[ToolboxData("<{0}:MultiCollectionControlPropertyrunat=server></{0}:MultipublicclassMultiCollectionControlProperty:{privateItemsitems;publicItemsItems{{if(this.items=={this.items=new}return}}privateItems2items2;publicItems2Items2{{if(this.items2=={this.items2=new}return}}privateItems3items3;publicItems3Items3{{if(this.items3=={this.items3=new}return}}protectedoverridevoidAddParsedSubObject(object{if(objis{if(this.items=={this.items=new}}if(objis{if(this.items2=={this.items2=new}}if(objis{{if(this.items3=={this.items3=new}}}}Items2;一(Items3ListItem3ListItem1类的内部代码完全一样,只是类名不同。MultiCollectionControlProperty[ParseChildren(false)],。objectif语句分别判断当前对象ListItemListItem类型的对象增加到了Items集合中,我们在设计视图中查看属性窗口中值时,当前集null,要先为当前集合生成对象实例。。runatLiteralControl包装后,返回LiteralControl的对象(AddParseSubObjectobj,而不管此块有多大。4-84-8 <cc2:ListItemrunat="server"Text=红色"Value="red"<cc2:ListItemrunat="server"Text="绿色"Value="green"""""Prseubjct方法固然能够帮助我们实现控件内部多个复杂默认属性的嵌套功能,但它也有局限性:就是前面提到过的子标记必须是子控件形式标记,且子标记要具有前缀标志和runatLtralontolLtralontol的对象ddPaubbjctob)AddParseSubObject方法实现页面解析功能;另外,.NETFramework为使用ControlBuilder解析复杂内不像重写AddParseSubObjectrunat属性,首先建立两个文件ScriptItem.cs和ScriptItemCollection.cs,分别定义ScriptItem类和块,ScriptItemCollectionScriptItem项。与前面讲ScriptItem/////////privatestring_Text; /// ///</summary>publicstringText{{return}{_Text=}},EditorAddParsedSubObject实现页面解析子控件时,要嵌套的三个集合的子标记:ListItem,ListItem2,ListItem3Control基类,目的是把这些子标ScriptItemCollecton/////////publicclassScriptItemCollection:{publicScriptItemCollection():base(){publicScriptItemCollection(intcapacity):base(capacity){ (collection){}}/////////publicclassScriptItemBuilder:{publicoverrideTypeGetChildControlType(stringtagName,IDictionary{ CultureInfo.InvariantCulture)==0){return}return}publicoverridebool{return}}GetChildControlType,在页面解析器分析主控scriptitem(面定义到主控件的集合属性名称则返回ScriptItem类的类通过ToLower()方法实现不回一个类型。而AddParsedSubObject则要自己处理当前对象的值。还有个重写方法AllowWhitespaceLiterals用于指定控件的开始标记和结束标记之间是否允许存在空白。/////////[ToolboxData("<{0}:ControlBuilderControlrunat=server></{0}:ControlBuilder[ParseChildren(true,"ScriptItems")]publicclassControlBuilderControl:WebControl{privateScriptItemCollection_ScriptItems=new/// ///</summary>publicScriptItemCollection{{if(_ScriptItems=={_ScriptItems=new}return}}//…} o o oScriptItemAddParsedSubObject相比,嵌套标记中多了一个<ScriptItems>内部嵌套标记,且ScriptItem没有前缀和runatAddParsedSubObject<ScriptItems>(ScriptItem)LiteralControl返回,这显然不符合我们的要求;另外,这里的<ScriptItem>虽然具有前缀,但它也不具有runat的属性,但也能够正确被页面解析器进行正反向解析。AddParsedSubObject实现比较简单,仅实现一个方法,一般用于复杂属性单一且比实现ControlBuilder的定制构造器类载AddParsedSubObject要麻烦些,但功能更强,能处理更灵活的嵌套标记。AddParsedSubObject最大的限制是它的内部必须是子控件AddParsedSubObject方式。到现在为止基本上已经把我们见过的所有的属性标记格式都实现了一遍,节也把有更的内容。本节主旨就是讲解一下控件属性编辑器,4.5.1节提供一些系统通用编辑器;在复杂属性中,集合属性是最重要的最常用的属性,4.5.2节将主要讲解怎样定制复杂集合类型编辑器以及一这些设计器的执行主要是在设计模式下,直接与IDE交互,在编程时可以直接使用System.Windows命名空间开头的一些命名空间下的类。这里首先加入几个本节需要使用到的。右击控件库工程,选择“添加”命令,如图4-9所示。选择“添加”命令后会打开“添加”框,如图4-10所示图4-9添加 图4-10“添加”框在框中找到以下三个程序集但它们是怎么使用的呢?其实使用都很简单,仅在每个需要配置的属性前面指定一个标志某多行下拉文本属性编辑 /// ///获得本 /// /// publicstring{//...}///4-11色值选择属性编辑 publicColor{//...}属性浏览器中的效果(4-12所示4-12文件选择属性编辑[Editor(typeof(FileNameEditor),[Editor(typeof(FileNameEditor),typeof(UITypeEditor))]publicstringFileName{//...}属性浏览器中的效果(4-13所示4-13”实也是调用的Windows系统的“打开文件”框。”选择属性编辑[Editor(typeof(FolderNameEditor),[Editor(typeof(FolderNameEditor),typeof(UITypeEditor))]publicstringFolderNameEditor{//...}属性浏览器中的效果(4-14所示图4- 选择属性编辑连接字符串属性编辑publicstring{//...}属性浏览器中的效果(4-15所示4-15表达式绑定集合属性编辑publicpublicstring{//...}属性浏览器中的效果(4-16所示4-16用户控件框编辑publicstring{//...}属性浏览器中的效果(4-17所示图4-17用户控件框编辑(*.ascx/////////[ToolboxData("<{0}:EditorControlrunat=server></{0}:EditorControl>")]publicclassEditorControl:WebControl{stringstrTxtEditor; System.Design",typeof(UITypeEditor))]publicstring{{return}{strTxtEditor=}}ColorcColorEditor; publicColor{{}{}}
returncColorEditor=stringstrFileName;[Editor(typeof(FileNameEditor),typeof(UITypeEditor))]publicstringFileName{{}{}}
returnstrFileName=stringstrFolderNameEditor; [Editor(typeof(FolderNameEditor),typeof(UITypeEditor))]publicstringFolderNameEditor{{}{}}
returnstrFolderNameEditor=stringstrConnectionStringEditor;publicstring{{}{
returnstrConnectionStringEditorstrConnectionStringEditor=}}stringstrExpressionsCollectionEditor;publicstring{{return}{strExpressionsCollectionEditor=}}stringstrUserControlFileEditor; publicstring{{return}{strUserControlFileEditor=}}//...}定制多类型集合属性编辑4-18所示。4-18ItemBase,表/////////////// class{privatebool_EnableViewState=true;publicboolEnableViewState{{return}{_EnableViewState=}}}这里为了简化代码,只定义了一个EnableViewState的属性,表示是否启用视图状态,在ItemBase添加到集合中统一管理的。//////////////////publicclassCommandItem:{privateCommandActionTypeprivatestring_Text=privatestring_AccessKey=privatestring_ToolTip=privatebool_Enable=//////</summary>publicCommandItem(){}//////构造方法 //////<param///<param ///<param///<parampublicCommandItem(CommandActionTypecommandActionType,stringstrText,stringstrAccessKey,stringstrToolTip){mandActionType=commandActionType;this._Text=strText;this._AccessKey=strAccessKey;this._ToolTip=strToolTip;}//////</summary>publicCommandActionType{{}{}}
return_CommandActionType=//////</summary>publicstring{{}
return{_Text=}}//////</summary>publicstring{{return}{_AccessKey=}}//////</summary>publicstring{{return}{_ToolTip=}}//////</summary>publicbool{{return}{_Enable=}}}ItemBase,所有类型的子项都要继承于该类。CommandItem的第一个属性是枚举类型,表示此按钮的功能类型(新增/删除/上一页/下一页等,此属性CommandActionType对应的枚举代码结构如下所示:///////////////publicenum{}接下来再定义一个子项类型:CommandSeperator类型,表示分隔符类型,即一组按钮与///////////////</summary>publicclassCommandSeperator:{privateUnitwidth;privateUnitWidth{{return}{width=}}}privateUnitheight;privateUnitHeight{{return}{height=}}}(ItemBase(CommandItem(CommandSeperator(CommandActionype///////////////</summary>[Editor(typeof(CommandCollectionEditor),typeof(UITypeEditor))]publicclassCommandCollection:Collection<ItemBase>{public:{}//////</summary>publicnewintCount{{return}}//////publicbool{{}}
return/////////<paramname="item"></param>publicnewvoidAdd(ItemBaseitem){}//////publicnewvoid{}/////////<param///publicnewboolContains(ItemBase{return}/////////<param///publicnewboolRemove(ItemBase{return}/////////<param///publicnewItemBasethis[int{{}{}}}
returnbase[index]=该集合类继承Collection<ItemBase>ItemBase,CommandItemCommandSeperatorItemBase的原因了。[ParseChilderen(true)]表示把当前属性作为主控件的属性(而非子控件)本节的重点,也是最重要的一个属性[Editor(typeof(CommandCollectionEditor),typeof(UITypeEditor))],表示指定此集合类的集合编辑器为CommandCollectionEditor,即在主控件中凡是定义为CommandCollection类的属性都会把CommandCollectionEditor作为它的编辑器。CommandCollectionEditor编辑器类///////////////publicclassCommandCollectionEditor:{publicCommandCollectionEditor(Type:{protectedoverridebool{return}protectedoverrideType[]{returnnewType[]{typeof(CommandItem),typeof(CommandSeperator)}protectedoverrideobjectCreateInstance(Type{if(itemType=={returnnew}if(itemType=={returnnew}return}} CommandCollectionEditor该方法中的参数返回该编辑器作用的对象实例(CommandCollection的一个对象实例CommandCollection对象的所有数据。CanSelectMultipleInstances的返回值表示是否能够在编辑窗口选择多个实例,这true。 returnnewType[]{typeof(CommandItem),typeof(CommandSeperator) CommandItemCommandSeperator是我们定义的两个集合类型。在单击主控件属性窗CommandCollection集合类/////////[ParseChildren(true,"ToolBarItems")]publicclassMultiTypeCollectionEditorControl:{privateCommandCollection_ToolBarItems=newpublicCommandCollection{{if(_ToolBarItems=={_ToolBarItems=new}return}}}主控件定义了一个重要的类元数据特性[ParseChildren(true,"ToolBarItems")],表示把4-19所示。4-19在这里就可以选择命令按钮或分隔符按钮填充集合了。另外,在成员列表中如果不想看到带命空的类名,如只让示ComadIem而不是 只要为增一个类转器即面4.6会详讲解类转器的实个功能较简单,果要,读可自己实它。定制模态属性编辑4-204-20增一个WinFormCategoryWindow.cs4-21所示。图4-21“添加新项”Categoryindo.cs/////////partialclass{//////</summary>ponentModel.IContainercomponents=//////protectedoverridevoidDispose(booldisposing){if(disposing&&(components!={}}#regionWindows//////private {boBox1=newSystem this.button1=newSystem.Windows.Forms.Button();this.button2=newSystem.Windows.Forms.Button();//boBox1.FormattingEnabled=boBox1.Location=newSystem.Drawing.Point(23,12);boBox1.Name="comboBox1";boBox1.Size=newSystem.Drawing.Size(217,20);boBox1.TabIndex=0;//this.button1.DialogResult=System.Windows.Forms.DialogResult.OK;this.button1.Location=newSystem.Drawing.Point(84,53);this.button1.Name="button1";this.button1.Size=newSystem.Drawing.Size(75,23);this.button1.TabIndex=1;this.button1.Text="确定";this.button1.UseVisualStyleBackColortrue;//this.button2.DialogResult=System.Windows.Forms.DialogResult.Cancel;this.button2.Location=newSystem.Drawing.Point(165,53);this.button2.Name="button2";this.button2.Size=newSystem.Drawing.Size(75,23);this.button2.TabIndex=2;this.button2.Text="取消";this.button2.UseVisualStyleBackColortrue;//this.AcceptButton=this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;this.ClientSize=newSystem.Drawing.Size(252,96); this.Cursor=System.Windows.Forms.Cursors.Default;this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.Fixed3D; izeBox=false;this.MinimizeBox=false;this.Name="CategoryWindow";this.Text="CategoryWindow";this.TopMost=true;}publicSystem boBoxcomboBox1;privateSystem.Windows.Forms.Buttonbutton1;privateSystem.Windows.Forms.Buttonbutton2;}this.button1.DialogResult=System.Windows.Forms.DialogResult.OK;this.button2.DialogResultthis.button1.DialogResult=System.Windows.Forms.DialogResult.OK;this.button2.DialogResult=System.Windows.Forms.DialogResult.Cancel;CategoryWindow.cs/////////publicpartialclassCategoryWindow:{public{}publicvoid{{}catch(Exception{throw}{}}}该页面没有复杂的交互逻辑,仅在类构造方法中调用SetSelectData方法为窗体中的ComboBox控件绑定食品数据列表。这里限于篇幅仅做了一个尽量简单的窗体,在实际开发usingusingusingSystem.Drawing.Design;usingSystem.Windows.Forms;using/////////publicclassCategoryModalEditor:{public{(}publicoverrideSystem.Drawing.Design.UITypeEditorEditStyleGetEditStyleponentModel.ITypeDescriptorContextcontext){return}publicoverrideobjectContextcontext,System.IServiceProviderprovider,object{IWindowsFormsEditorServiceservice=(IWindowsFormsEditorService)if(service=={return}CategoryWindowform=newif(service.ShowDialog(form)=={ }return}}ponentModel.Design下的集合基类,这里使用的是System.Drawing.Design下的UItypeEdit4.5.1节已经列出了方法GetEditStyle的 换的对象的上下文方法GetEditStyle中UITypeEditorEditStyle.Modal的UITypeEditorEditStyleModal表示以模态形式弹出编辑属性界面;DropDown表示以下拉形式显示属性编辑界面;None表示不提供的UI界面。这里我们选择的是Modal枚举值,表示以模态形式弹IWindowsFormsEditorServiceIWindowsFormsEditorServiceservice=IwindowsFormsEditorService类型的服务对象(WinFormifif(service.ShowDialog(form)=={ }面把数据选择窗体中的“确定”和“取消”两个按钮的DialogResult属性值分别设置为DialogResult.OKDialogResult.Cancel的用途了。整个EditValue方法返回一个object/////////[ToolboxData("<{0}:CustomeModalEditorControlrunat=server></{0}:publicclassCustomeModalEditorControl:{typeof(System.Drawing.Design.UITypeEditor))]publicstring{{Strings=(String)ViewState["SelectFood"];return((s==null)?String.Empty:s);}{ViewState["SelectFood"]=}}//…}该句代码指定属性的编辑器为4-224-22定制下拉控件属性编辑4-23所示。窗体4-24图4-23下拉控件属性编辑 图4-24添加新项)增加用户控件文件后,系统会把窗体类分成两个部分类文件:CategoryDropDown.cs和CategoryDropDown.Designer.csCategoryDropDown.cs主要供开发人员完成交互逻辑;/////////获得本 partialclass{////// ponentModel.IContainercomponents=//////protectedoverridevoidDispose(booldisposing){if(disposing&&(components!={}}//////private {this.btnCancel=newSystem.Windows.Forms.Button();this.btnOK=newSystem.Windows.Forms.Button();boBox1=newSystem //this.btnCancel.Location=newSystem.Drawing.Point(161,56);this.btnCancel.Name="btnCancel";this.btnCancel.Size=newSystem.Drawing.Size(75,23);this.btnCancel.TabIndex=5;this.btnCancel.Text="取消";this.btnCancel.UseVisualStyleBackColortrue;this.btnCancel.Click+=new//this.btnOK.DialogResult=System.Windows.Forms.DialogResult.OK;this.btnOK.Location=newSystem.Drawing.Point(80,56);this.btnOK.Name="btnOK";this.btnOK.Size=newSystem.Drawing.Size(75,23);this.btnOK.TabIndex=4;this.btnOK.Text="确定";this.btnOK.UseVisualStyleBackColortrue;this.btnOK.Click+=new//boBox1.FormattingEnabled=boBox1.Location=newSystem.Drawing.Point(19,15);boBox1.Name="comboBox1";boBox1.Size=newSystem.Drawing.Size(217,boBox1.TabIndexboBox1.TabIndex=//this.AutoScaleDimensions=newSystem.Drawing.SizeF(6F,12F);this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font; this.Name="CategoryDropDown";this.Size=newSystem.Drawing.Size(254,95);}privateSystem.Windows.Forms.ButtonbtnCancel;privateSystem.Windows.Forms.ButtonbtnOK;publicSystem boBoxcomboBox1;}CategoryDropDown.cs/////////publicpartialclassCategoryDropDown:{publicstringstrReturnValue=privateIWindowsFormsEditorServicepublicCategoryDropDown(IWindowsFormsEditorService{this.service=}publicvoid{{}catch(Exception{throw}{}}}privatevoidbtnOK_Click(objectsender,EventArgs{strReturnValue= }privatevoidbtnCancel_Click(objectsender,EventArgs{strReturnValue="";}}跟SetSelectData方法是提供控件ComboBoxEditValue/////////publicclassCategoryDropDownEditor:{public{(}publicoverrideSystem.Drawing.Design.UITypeEditorEditStyleGetEditStyleponentModel.ITypeDescriptorContextcontext){return}publicoverrideobjectContextcontext,System.IServiceProviderprovider,object{IWindowsFormsEditorServiceservice=(IWindowsFormsEditorService)if(service=={return}CategoryDropDownform=newCategoryDropDown(service);stringstrReturn=if(strReturn+String.Empty!={return}return}}下拉编辑器与前面小节讲的弹出式模态编辑器都通过继承returnUITypeEditor类实现定制编辑器。GetEditStylereturnIWindowsFormsEditorServiceIWindowsFormsEditorServiceservice=CategoryDropDownCategoryDropDownform=newCategoryDropDown(service);以上代码主要是创建一个数据选择界面(用户控件类型,并使用service对象的DropDownControl(暂停执行,直到单击界面中的按钮关闭下拉窗体程序才继续执行EditValue方法是在单击stringstringstrReturn=form.strReturnValue;return(string)value;以上代码是获取下拉窗体中当前选择的数据(单击“确定”按钮时把值暂存到form.strReturnValue变量中)并返回,系统会自动把返回值赋给当前属性。/////////[ToolboxData("<{0}:CustomeDropDownEditorControlrunat=server></{0}:publicclassCustomeDropDownEditorControl:{ publicstringSelectFood{{Strings=(String)ViewState["SelectFood"];return((s==null)?String.Empty:s);}{ViewState["SelectFood"]=}}//…}SelectFood属性。这里仅需要说明的是它的设计时元数据代码段,CategoryDropDownEditor编辑器。4-25所示。定制计算器属性编辑
4-254-26所示。4-26Form//////获得本 ///publicclassFormKeyBoard:{privateSystem.Windows.Forms.Labellabel2;privateSystem.Windows.Forms.TextBoxexpressBox; ponentModel.Containercomponents=null;publicstringstrReturnValue="";publicstruct {publicstring publicint publicchargrade;//}publicopTable[]opchTbl=new[]//数组中元素依次为://"sin","cos","tan","cot","arcsin","arccos","arctan","sec","csc","ln","^","*","/","+","-","(",")",""的栈外(因为有的运算符是从右向左计publicint[]osp=new//数组中元素依次为://"sin","cos","tan","cot","arcsin","arccos","arctan","sec","csc","ln","^","*","/","+","-","(","end"的栈内(因为有的运算符是从右向左计算,publicint[]isp=newpublicdouble[]dataStack=newdouble[30]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,publicintopTop=-1;//指向存放(从键盘扫描的)运算符栈的指针publicintdataTop=-1;//指向存放(从键盘扫描的)数据栈指针publicstringstartString;publicintstartTop=0;publicdoublevariableX=0;publicdoubleconstdoublePI=3. intnumber=1;publicintprivateSystem.Windows.Forms.Buttonbutton1;privateSystem.Windows.Forms.Buttonbutton2;privateSystem.Windows.Forms.Buttonbutton3;privateSystem.Windows.Forms.Buttonbutton4;privateSystem.Windows.Forms.Buttonbutton5;privateSystem.Windows.Forms.Buttonbutton6;privateSystem.Windows.Forms.Buttonbutton7;privateSystem.Windows.Forms.Buttonbutton8;privateSystem.Windows.Forms.Buttonbutton9;privateSystem.Windows.Forms.Buttonbutton10;privateSystem.Windows.Forms.Buttonbutton11;privateSystem.Windows.Forms.Buttonbutton12;privateSystem.Windows.Forms.Buttonbutton13;privateSystem.Windows.Forms.Buttonbutton14;privateSystem.Windows.Forms.Buttonbutton15;privateSystem.Windows.Forms.Buttonbutton16;privateSystem.Windows.Forms.Buttonbutton17;privateSystem.Windows.Forms.Buttonbutton18;privateSystem.Windows.Forms.Buttonbutton19;privateSystem.Windows.Forms.Buttonbutton20;privateSystem.Windows.Forms.Buttonbutton21;privateSystem.Windows.Forms.Buttonbutton22;privateSystem.Windows.Forms.Buttonbutton23;privateSystem.Windows.Forms.Buttonbutton24;privateSystem.Windows.Forms.Buttonbutton25;privateSystem.Windows.Forms.Buttonbutton26;privateSystem.Windows.Forms.Buttonbutton27;privateSystem.Windows.Forms.Buttonbutton28;privateSystem.Windows.Forms.Buttonbutton29;privateSystem.Windows.Forms.Buttonbutton30;privateSystem.Windows.Forms.Buttonbutton31;privateSystem.Windows.Forms.Buttonbutton32;privateSystem.Windows.Forms.Labellabel1;privateSystem.Windows.Forms.TextBoxendbox;privateSystem.Windows.Forms.Buttonbutton33;privateButtonbtnClear;privateButtonprivateSystem.Windows.Forms.Button#regionWindowsFormDesignergeneratedcodepublicFormKeyBoard(){}protectedoverridevoidDispose(booldisposing{if(disposing{if(components!={}}base.Dispose(disposing}#regionWindowsFormDesignergenerated///设计器支持所需的方法///private { }privatevoidForm1_Load(objectsender,System.EventArgs{}publicvoidInitializeOpchTblStack(){opchTbl[0].op="sin";opchTbl[0].code=1;opchTbl[0].grade='s';opchTbl[1].op="cos";opchTbl[1].code=2;opchTbl[1].grade='s';opchTbl[2].op="tan";opchTbl[2].code=3;opchTbl[2].grade='s';opchTbl[3].op="cot";opchTbl[3].code=4;opchTbl[3].grade='s';opchTbl[4].op="arcsin";opchTbl[4].code=5;opchTbl[4].grade='s';opchTbl[5].op="arccos";opchTbl[5].code=6;opchTbl[5].grade='s';opchTbl[6].op="arctan";opchTbl[6].code=7;opchTbl[6].grade='s';opchTbl[7].op="arccot";opchTbl[7].code=8;opchTbl[7].grade='s';opchTbl[8].op="sec";opchTbl[8].code=9;opchTbl[8].grade='s';opchTbl[9].op="csc";opchTbl[9].code=10;opchTbl[9].grade='s';opchTbl[10].op="ln";opchTbl[10].code=11;opchTbl[10].grade='s';opchTbl[11].op="^";opchTbl[11].code=12;opchTbl[11].grade='d';opchTbl[12].op="*";opchTbl[12].code=13;opchTbl[12].grade='d';opchTbl[13].op="/";opchTbl[13].code=14;opchTbl[13].grade='d';opchTbl[14].op="+";opchTbl[14].code=15;opchTbl[14].grade='d';opchTbl[15].op="-";opchTbl[15].code=16;opchTbl[15].grade='d';opchTbl[16].op="(";opchTbl[16].code=17;opchTbl[16].grade='d';opchTbl[17].op=")";opchTbl[17].code=18;opchTbl[17].grade='d';opchTbl[18].op="";opchTbl[18].code=19;opchTbl[18].grade='d';}publicvoid{for(inti=0;i<startString.Length;i++)if(startString[i].Equals('{}{}for(inti=0;i<startString.Length-{}}publicboolCheckParentthese({intfor(inti=0;i<startString.Length-{if(i=='(')if(i==')')number--;if(number<0)returnfalse;}{return}return}publicintCheckFollowCorrect(){stringstr,oldString="",newString="";intd return0; return11; for(inti=0;i<startString.Length;i++){return2; return3; return4; return5; return6; return7; return8; return9; return10; { {i+=5;characterCount++;}}{{i+=2;characterCount++;}}{ {i+=1;characterCount++;} { }}{}{ }{}{}{{}return13;{}{}i--;d }return } returnreturn}publicintIsCharacterOrData(refdouble{stringstartTop+=startTopMoveCount;startTopMoveCount=0;inti=startTop;{for(intj=4;j<=7;j++){returnopchTbl[j].code;}}{for(intj=0;j<10;j++) {returnopchTbl[j].code;}}{ {return11;} {return}}{for(intj=11;j<19;j++){} {startTopMoveCount=1;num=Math.E;return100;}{doubletemp=0,M=10;intj=i;{}{}{}return}}return-}publicdoubleDoubleCount(stringopString,doubledata1,double pareTo("+")==0)return pareTo("-")==0)return(data1- pareTo("*")==0)return pareTo("/"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年扎兰屯职业学院单招职业适应性测试模拟试题及答案解析
- 2026年湖南劳动人事职业学院单招职业适应性考试模拟试题及答案解析
- 2026年海南经贸职业技术学院单招职业适应性测试模拟试题及答案解析
- 医院儿科主任谈儿科疾病诊疗与护理
- 2026年江苏卫生健康职业学院单招职业适应性考试模拟试题及答案解析
- 医疗护理质量改进与持续发展
- 坐骨神经痛的中医治疗新路径
- 疼痛科主任临床研究前沿
- 毕业实习个人总结14篇
- 交界性肿瘤的护理
- 江苏省2025年普通高中学业水平合格性考试语文试卷(含答案)
- 2025年西昌市邛海泸山风景名胜区管理局招聘5名执法协勤人员备考题库有答案详解
- 2025年杭州市公安局上城区分局警务辅助人员招聘60人备考题库及完整答案详解一套
- 2025中央社会工作部所属事业单位招聘11人笔试试题附答案解析
- 2025国开期末考试《中国现代文学专题》机考试题含答案
- 居民自管小组建设方案
- 2025年煤矿安全生产治本攻坚三年行动工作总结
- 美团代运营服务合同协议模板2025
- 2025江苏南京市市场监督管理局所属事业单位招聘高层次人才5人(公共基础知识)测试题带答案解析
- 2025年二级建造师继续教育考试题库及答案
- 泵站、水闸混凝土施工实施细则
评论
0/150
提交评论