第4章服務(wù)器控件屬性_第1頁
第4章服務(wù)器控件屬性_第2頁
第4章服務(wù)器控件屬性_第3頁
第4章服務(wù)器控件屬性_第4頁
第4章服務(wù)器控件屬性_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第4 本章內(nèi)當(dāng)開發(fā)控件時如果選擇基類,比如選擇繼承就會成為當(dāng)前控件的屬性集的一部分,圖4-1所示的是WebControl類的系統(tǒng)屬性。Web控件所應(yīng)具備的基本屬性都4.1.1

4-1WebControlstringstringstrText默認(rèn)值";publicstringText{{{return}{strText=}}setget語段組成。注意,setget段不是必需的,比如可以去掉set段表示此屬性只允許而不允許接收值。ViewState字典中,以便在回發(fā)間進(jìn)行狀態(tài)管理。請看例子://///////publicstring{{Strings=(String)ViewState["Value"];return((s==null)?String.Empty:s);}{ViewState["Value"]=}}另外,簡單屬性可以直接使用ViewState其值,因?yàn)楹唵螌傩钥梢灾苯佑成錇樽址鳹iewState中可以直接接收的格式也是字符串。ViewState是頁面視圖狀態(tài)機(jī)制中的機(jī)制是為解決在Web瀏覽器兩次之間無狀態(tài)保持而提供的一種機(jī)制,視圖信息在網(wǎng)頁中HiddenField區(qū)域,而且每次頁面提交都會往返于客戶端和服務(wù)器,因此一般視圖主要用于少量的文本數(shù)據(jù)信息,而不適合存儲數(shù)據(jù)量比較大的業(yè)務(wù)數(shù)據(jù)。另外,復(fù)雜屬性的也要自己實(shí)現(xiàn)視圖機(jī)制功能,這一點(diǎn)在24-2<cc1:controlproperty<cc1:controlpropertyid="ControlProperty1runat="serverValue="簡單屬性String類型屬性代碼標(biāo)記完全一樣。簡單屬性比較簡單,就講解到這里。.NETFramework為控件設(shè)計時屬性提供了很多豐富的類,這些屬性的功能非常靈活,控式等,甚至可以自己定義一個屬性類,實(shí)現(xiàn)自己想實(shí)現(xiàn)的功能。下面講一下常用的.NETFramework的屬性類對控件的支持功能。true標(biāo)記屬性,表示該屬性可以綁定一個有效數(shù)據(jù)源。BrowsabletrueBrowsable為false。(Appearance(Behavior(Layout(Data(Action設(shè)置其值。另外,通過在屬性語句體中把set語句段去掉也可以起到相同的效果。設(shè)置該屬性是否支持特性,默認(rèn)情況下屬性都支持。當(dāng)該屬性與界面無關(guān)時可以設(shè)置其值為false,禁用該屬性的功能。nrSeriaiaionisbilty3DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定應(yīng)該允許序列g(shù)nrSilzaionisbilty(DesgnrSriaiaionisbilt.Contn)指定序列化程序應(yīng)isbleIDE中的設(shè)計器界面切換到代碼視圖時,看到的代碼標(biāo)記,或反NotifyParentProperty特性。通常使使用該設(shè)計特性指示當(dāng)在頁面上以方式使用控件時,嵌套在服務(wù)器控件標(biāo)記內(nèi)XML元素是應(yīng)該視為屬性還是應(yīng)視為子控件。通常情況下,包含兩種方式ParseChildren(boolchildrenasPropertystringdefaultProperty)childrenasProperty和性為PersistChildren(true),則將服務(wù)器控件的子控件作為嵌套服務(wù)器控件標(biāo)記保持。如果為HTML編碼的,只能對字符串作這種指定;PrsistenceMode(PersistenceMode.InnerDefaultProperty)指定屬性在服務(wù)器控件中保性;4Category分組特性基礎(chǔ)上的對ConverterTypeName屬性來獲取為該特性所綁定到的對象提供數(shù)據(jù)轉(zhuǎn)換的類名。后此特性為類特性,即不是屬性的特性,而是類的特性,設(shè)置位置也是在類的上面。 TextBoxText屬性。ButtonOnClick此屬性為JIT編譯時代碼安全屬性。需要使用此屬性確保到控件的代碼具有適當(dāng)?shù)陌踩珯?quán)限。Control類帶有兩個JIT編譯時代碼安全屬性標(biāo)記:nimal)和AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHosting復(fù)雜屬性是屬性的類型不是簡單值類型,或者是一個包含其他屬性的類。例如.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">女屬性標(biāo)記類型相似,F(xiàn)ootStyle/RowStyleFont-Bold這樣的屬性標(biāo)記,22連字符形式的復(fù)雜屬性/////////public{privatestring//////</summary>publicstringName{get{returnstrName;}set{strName=value;}}privateint//////</summary>publicint{get{returnintAge;}set{intAge=value;}}}再在控件中增加一個類型為的屬性,將以下代碼增加到控件中;;p/////////獲得本 {{if{p}return===;}}等set語句,因?yàn)橐话闶菍?fù)IDE中打開頁面,并打開控件的屬性窗口,會4-3

4-3RdOnly如果把所有復(fù)雜屬性包含其子屬性的值都放到這一個框中,顯然不太方便。這就要求我們自 增加PersistenceMode和/////////…{…}PersistenceModePersistenceMode特性指定在頁面*.aspx或*.ascx法非常重要,這里詳細(xì)介紹一下它的用法。PersistenceMode有四種枚舉狀態(tài):<asp:GridView<asp:GridViewID="GridView1"<HeaderStyleBackColor="#507CD1"Font-Bold="true"ForeColor="White"上面代碼中的Font-Bold對于<HeaderStyle>來說就是使用了PersistenceMode下的Attribute表示用屬性名稱作為嵌套表示復(fù)雜屬性,比如GridView的HeaderStyle屬性,就是PersistenceModeInnerProperty標(biāo)記形式。代碼如下:<asp:GridView<asp:GridViewID="GridView1"<HeaderStyleBackColor="#507CD1"Font-Bold="true"ForeColor="White"該特性值與InnerProperty類似,都是在主控件外標(biāo)記復(fù)雜屬性。不同的是,InnerDefaultProperty不需要像InnerProperty那樣把屬性名作為最外,一般用于常用的或<asp:ListBox<asp:ListBoxID="ListBox1"<asp:ListItemValue="1">男<asp:ListItemValue="0">女以上代碼中的ListItem,它的特點(diǎn)是直接把ListItem單項(xiàng)放到ListBox的標(biāo)記內(nèi)部,而沒有增加一個類似<Items>ListItem的外面。另外,InnerDefaultProperty在一個控件類InnerProperty可以設(shè)置任意多個復(fù)雜屬性。<div>保證其內(nèi)容不能再HTML標(biāo)記。表示代碼不對屬性生成代碼,即在屬性窗口設(shè)置的值不會被代碼生成*.aspx或*.ascxPeopleName/Sex/Age屬性,即我們在屬性窗口中修改了Name/Sex/Age的值后,會僅把這些值通過代碼映射到*.aspx或*.axcx頁面中。;一般復(fù)雜屬性都要設(shè)置為PersistenceModeDesignerSerializationVisibility成上面進(jìn)行中的代碼部分。為屬性增加了這兩個特性后,再打開類定義代碼TypeConverter,如下所示://///////獲得本 ///publicclass{…}TypeConverter特性指定轉(zhuǎn)換器的類型,ExpandableObjectConverter表示可擴(kuò)展對象與其4-5所示。圖4-5設(shè) 屬性在屬性瀏覽器中為設(shè)置值,后切換到代碼視圖,會看到如下標(biāo)記 <cc1:controlproperty <cc1:controlpropertyid="ControlProperty1"-Name="King 內(nèi)部嵌套復(fù)雜屬性標(biāo)把所有復(fù)雜屬性都擠到主控件的屬性上,顯示比較臃腫,設(shè)想一下,如果GridViewRowStyle標(biāo)記形式的復(fù)雜屬性。<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枚舉項(xiàng),表示生成嵌套標(biāo)記;至于DesignerSerializationVisibilityContentRowStyle4.1.1/////////,]//publicclassControlProperty:{…}PerseChildren特性指定頁面分析器把控件標(biāo)記中的內(nèi)容解析為屬性還是子控件,該屬性false,表示保存為屬性。RowStyle的標(biāo)記形式如下所示:<cc1:controlproperty<cc1:controlpropertyid="ControlProperty1"<RowStyleBackColor="CornflowerBlue"RowStyleGridView<asp:DropDownList<asp:DropDownListid="DropDownList1"runat="server"<asp:ListItemValue="red">紅色<asp:ListItemValue="green">綠色內(nèi)部嵌套默認(rèn)復(fù)雜屬性標(biāo)DropDownList控件中的屬性均為內(nèi)部嵌套默認(rèn)屬性,代碼如下:<asp:DropDownList<asp:DropDownListid="DropDownList1"runat="server"ListItem標(biāo)記外部沒有像內(nèi)部集合屬性一樣嵌套在<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;}}}此子項(xiàng)類的代碼比較簡單,唯一要說明的是上面的[ToolBoxItem(false)]IDE工ToolBoxItemfalse,否則當(dāng)使用者拖一個不完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節(jié)已經(jīng)做了講解;二是設(shè)置[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="藍(lán)色<cc1:ListItemID="ListItem3runat="serverText="綠色內(nèi)部嵌套編碼默認(rèn)屬<asp:DropDownList<asp:DropDownListid="DropDownList1"runat="server"Text(“紅色”位置的屬性)Value屬性是附屬于ListItem標(biāo)記,而是在兩個<asp:ListItem></asp:ListItem>標(biāo)記之間呈現(xiàn)。這樣的標(biāo)記主要用于顯示非HTML標(biāo)記或非子控件的純文本,本節(jié)主要完成這種格式屬性的實(shí)現(xiàn)。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節(jié)中的完全相同,但切換到代碼視圖界面,會發(fā)現(xiàn)序列化后的代 Control1"runat="server"Items-Capacity="4">""本節(jié)主要說明控件內(nèi)部嵌套編碼默認(rèn)屬性格式的實(shí)現(xiàn)。在實(shí)現(xiàn)時需要注意的是,對ListItem2Text是屬于ListItem2使用AddParsedSubObject控制復(fù)雜內(nèi)容(子控件.2.3節(jié)中實(shí)現(xiàn)的屬性:<cc1:ListItemID="ListItem1runat="serverText="紅色<cc1:ListItemID="ListItem2runat="serverText="藍(lán)色<cc1:ListItemID="ListItem3runat="serverText="綠色題,其中法可以重寫AddParsedSubObject來定制自己的頁面解析子控件方法。主控件////////////本控件包含三個集合復(fù)雜屬性兩個內(nèi)部默認(rèn)嵌套形式一個內(nèi)部嵌套形式///[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類的內(nèi)部代碼完全一樣,只是類名不同。MultiCollectionControlProperty[ParseChildren(false)],。objectif語句分別判斷當(dāng)前對象ListItemListItem類型的對象增加到了Items集合中,我們在設(shè)計視圖中查看屬性窗口中值時,當(dāng)前集null,要先為當(dāng)前集合生成對象實(shí)例。。runatLiteralControl包裝后,返回LiteralControl的對象(AddParseSubObjectobj,而不管此塊有多大。4-84-8 <cc2:ListItemrunat="server"Text=紅色"Value="red"<cc2:ListItemrunat="server"Text="綠色"Value="green"""""Prseubjct方法固然能夠幫助我們實(shí)現(xiàn)控件內(nèi)部多個復(fù)雜默認(rèn)屬性的嵌套功能,但它也有局限性:就是前面提到過的子標(biāo)記必須是子控件形式標(biāo)記,且子標(biāo)記要具有前綴標(biāo)志和runatLtralontolLtralontol的對象ddPaubbjctob)AddParseSubObject方法實(shí)現(xiàn)頁面解析功能;另外,.NETFramework為使用ControlBuilder解析復(fù)雜內(nèi)不像重寫AddParseSubObjectrunat屬性,首先建立兩個文件ScriptItem.cs和ScriptItemCollection.cs,分別定義ScriptItem類和塊,ScriptItemCollectionScriptItem項(xiàng)。與前面講ScriptItem/////////privatestring_Text; /// ///</summary>publicstringText{{return}{_Text=}},EditorAddParsedSubObject實(shí)現(xiàn)頁面解析子控件時,要嵌套的三個集合的子標(biāo)記:ListItem,ListItem2,ListItem3Control基類,目的是把這些子標(biāo)ScriptItemCollecton/////////publicclassScriptItemCollection:{publicScriptItemCollection():base(){publicScriptItemCollection(intcapacity):base(capacity){ (collection){}}/////////publicclassScriptItemBuilder:{publicoverrideTypeGetChildControlType(stringtagName,IDictionary{ CultureInfo.InvariantCulture)==0){return}return}publicoverridebool{return}}GetChildControlType,在頁面解析器分析主控scriptitem(面定義到主控件的集合屬性名稱則返回ScriptItem類的類通過ToLower()方法實(shí)現(xiàn)不回一個類型。而AddParsedSubObject則要自己處理當(dāng)前對象的值。還有個重寫方法AllowWhitespaceLiterals用于指定控件的開始標(biāo)記和結(jié)束標(biāo)記之間是否允許存在空白。/////////[ToolboxData("<{0}:ControlBuilderControlrunat=server></{0}:ControlBuilder[ParseChildren(true,"ScriptItems")]publicclassControlBuilderControl:WebControl{privateScriptItemCollection_ScriptItems=new/// ///</summary>publicScriptItemCollection{{if(_ScriptItems=={_ScriptItems=new}return}}//…} o o oScriptItemAddParsedSubObject相比,嵌套標(biāo)記中多了一個<ScriptItems>內(nèi)部嵌套標(biāo)記,且ScriptItem沒有前綴和runatAddParsedSubObject<ScriptItems>(ScriptItem)LiteralControl返回,這顯然不符合我們的要求;另外,這里的<ScriptItem>雖然具有前綴,但它也不具有runat的屬性,但也能夠正確被頁面解析器進(jìn)行正反向解析。AddParsedSubObject實(shí)現(xiàn)比較簡單,僅實(shí)現(xiàn)一個方法,一般用于復(fù)雜屬性單一且比實(shí)現(xiàn)ControlBuilder的定制構(gòu)造器類載AddParsedSubObject要麻煩些,但功能更強(qiáng),能處理更靈活的嵌套標(biāo)記。AddParsedSubObject最大的限制是它的內(nèi)部必須是子控件AddParsedSubObject方式。到現(xiàn)在為止基本上已經(jīng)把我們見過的所有的屬性標(biāo)記格式都實(shí)現(xiàn)了一遍,節(jié)也把有更的內(nèi)容。本節(jié)主旨就是講解一下控件屬性編輯器,4.5.1節(jié)提供一些系統(tǒng)通用編輯器;在復(fù)雜屬性中,集合屬性是最重要的最常用的屬性,4.5.2節(jié)將主要講解怎樣定制復(fù)雜集合類型編輯器以及一這些設(shè)計器的執(zhí)行主要是在設(shè)計模式下,直接與IDE交互,在編程時可以直接使用System.Windows命名空間開頭的一些命名空間下的類。這里首先加入幾個本節(jié)需要使用到的。右擊控件庫工程,選擇“添加”命令,如圖4-9所示。選擇“添加”命令后會打開“添加”框,如圖4-10所示圖4-9添加 圖4-10“添加”框在框中找到以下三個程序集但它們是怎么使用的呢?其實(shí)使用都很簡單,僅在每個需要配置的屬性前面指定一個標(biāo)志某多行下拉文本屬性編輯 /// ///獲得本 /// /// publicstring{//...}///4-11色值選擇屬性編輯 publicColor{//...}屬性瀏覽器中的效果(4-12所示4-12文件選擇屬性編輯[Editor(typeof(FileNameEditor),[Editor(typeof(FileNameEditor),typeof(UITypeEditor))]publicstringFileName{//...}屬性瀏覽器中的效果(4-13所示4-13”實(shí)也是調(diào)用的Windows系統(tǒng)的“打開文件”框?!边x擇屬性編輯[Editor(typeof(FolderNameEditor),[Editor(typeof(FolderNameEditor),typeof(UITypeEditor))]publicstringFolderNameEditor{//...}屬性瀏覽器中的效果(4-14所示圖4- 選擇屬性編輯連接字符串屬性編輯publicstring{//...}屬性瀏覽器中的效果(4-15所示4-15表達(dá)式綁定集合屬性編輯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的屬性,表示是否啟用視圖狀態(tài),在ItemBase添加到集合中統(tǒng)一管理的。//////////////////publicclassCommandItem:{privateCommandActionTypeprivatestring_Text=privatestring_AccessKey=privatestring_ToolTip=privatebool_Enable=//////</summary>publicCommandItem(){}//////構(gòu)造方法 //////<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,所有類型的子項(xiàng)都要繼承于該類。CommandItem的第一個屬性是枚舉類型,表示此按鈕的功能類型(新增/刪除/上一頁/下一頁等,此屬性CommandActionType對應(yīng)的枚舉代碼結(jié)構(gòu)如下所示:///////////////publicenum{}接下來再定義一個子項(xiàng)類型: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)]表示把當(dāng)前屬性作為主控件的屬性(而非子控件)本節(jié)的重點(diǎn),也是最重要的一個屬性[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該方法中的參數(shù)返回該編輯器作用的對象實(shí)例(CommandCollection的一個對象實(shí)例CommandCollection對象的所有數(shù)據(jù)。CanSelectMultipleInstances的返回值表示是否能夠在編輯窗口選擇多個實(shí)例,這true。 returnnewType[]{typeof(CommandItem),typeof(CommandSeperator) CommandItemCommandSeperator是我們定義的兩個集合類型。在單擊主控件屬性窗CommandCollection集合類/////////[ParseChildren(true,"ToolBarItems")]publicclassMultiTypeCollectionEditorControl:{privateCommandCollection_ToolBarItems=newpublicCommandCollection{{if(_ToolBarItems=={_ToolBarItems=new}return}}}主控件定義了一個重要的類元數(shù)據(jù)特性[ParseChildren(true,"ToolBarItems")],表示把4-19所示。4-19在這里就可以選擇命令按鈕或分隔符按鈕填充集合了。另外,在成員列表中如果不想看到帶命空的類名,如只讓示ComadIem而不是 只要為增一個類轉(zhuǎn)器即面4.6會詳講解類轉(zhuǎn)器的實(shí)個功能較簡單,果要,讀可自己實(shí)它。定制模態(tài)屬性編輯4-204-20增一個WinFormCategoryWindow.cs4-21所示。圖4-21“添加新項(xiàng)”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}{}}}該頁面沒有復(fù)雜的交互邏輯,僅在類構(gòu)造方法中調(diào)用SetSelectData方法為窗體中的ComboBox控件綁定食品數(shù)據(jù)列表。這里限于篇幅僅做了一個盡量簡單的窗體,在實(shí)際開發(fā)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節(jié)已經(jīng)列出了方法GetEditStyle的 換的對象的上下文方法GetEditStyle中UITypeEditorEditStyle.Modal的UITypeEditorEditStyleModal表示以模態(tài)形式彈出編輯屬性界面;DropDown表示以下拉形式顯示屬性編輯界面;None表示不提供的UI界面。這里我們選擇的是Modal枚舉值,表示以模態(tài)形式彈IWindowsFormsEditorServiceIWindowsFormsEditorServiceservice=IwindowsFormsEditorService類型的服務(wù)對象(WinFormifif(service.ShowDialog(form)=={ }面把數(shù)據(jù)選擇窗體中的“確定”和“取消”兩個按鈕的DialogResult屬性值分別設(shè)置為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添加新項(xiàng))增加用戶控件文件后,系統(tǒng)會把窗體類分成兩個部分類文件:CategoryDropDown.cs和CategoryDropDown.Designer.csCategoryDropDown.cs主要供開發(fā)人員完成交互邏輯;/////////獲得本 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}}下拉編輯器與前面小節(jié)講的彈出式模態(tài)編輯器都通過繼承returnUITypeEditor類實(shí)現(xiàn)定制編輯器。GetEditStylereturnIWindowsFormsEditorServiceIWindowsFormsEditorServiceservice=CategoryDropDownCategoryDropDownform=newCategoryDropDown(service);以上代碼主要是創(chuàng)建一個數(shù)據(jù)選擇界面(用戶控件類型,并使用service對象的DropDownControl(暫停執(zhí)行,直到單擊界面中的按鈕關(guān)閉下拉窗體程序才繼續(xù)執(zhí)行EditValue方法是在單擊stringstringstrReturn=form.strReturnValue;return(string)value;以上代碼是獲取下拉窗體中當(dāng)前選擇的數(shù)據(jù)(單擊“確定”按鈕時把值暫存到form.strReturnValue變量中)并返回,系統(tǒng)會自動把返回值賦給當(dāng)前屬性。/////////[ToolboxData("<{0}:CustomeDropDownEditorControlrunat=server></{0}:publicclassCustomeDropDownEditorControl:{ publicstringSelectFood{{Strings=(String)ViewState["SelectFood"];return((s==null)?String.Empty:s);}{ViewState["SelectFood"]=}}//…}SelectFood屬性。這里僅需要說明的是它的設(shè)計時元數(shù)據(jù)代碼段,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[]//數(shù)組中元素依次為://"sin","cos","tan","cot","arcsin","arccos","arctan","sec","csc","ln","^","*","/","+","-","(",")",""的棧外(因?yàn)橛械倪\(yùn)算符是從右向左計publicint[]osp=new//數(shù)組中元素依次為://"sin","cos","tan","cot","arcsin","arccos","arctan","sec","csc","ln","^","*","/","+","-","(","end"的棧內(nèi)(因?yàn)橛械倪\(yùn)算符是從右向左計算,publicint[]isp=newpublicdouble[]dataStack=newdouble[30]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,publicintopTop=-1;//指向存放(從鍵盤掃描的)運(yùn)算符棧的指針publicintdataTop=-1;//指向存放(從鍵盤掃描的)數(shù)據(jù)棧指針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///設(shè)計器支持所需的方法///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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論