




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
一、最小化窗口點擊“X”或“AltF4”時,最小化窗口,如:protectedoverridevoidWndProc(refMessagem){constintWM_SYSCOMMAND=0x0112;constintSC_CLOSE=0xF060;if(m.Msg==WM_SYSCOMMAND&&(int)m.WParam==SC_CLOSE){//Userclickedclosebuttonthis.WindowState=FormWindowState.Minimized;return;}base.WndProc(refm);}二、如何讓Foreach循環運行的更快foreach是一個對集合中的元素進行簡單的枚舉及處理的現成語句,用法如下例所示:usingSystem;usingSystem.Collections;namespaceLoopTest{classClass1{staticvoidMain(string[]args){//createanArrayListofstringsArrayListarray=newArrayList();array.Add("Marty");array.Add("Bill");array.Add("George");//printthevalueofeveryitemforeach(stringiteminarray){Console.WriteLine(item);}}}你可以將foreach語句用在每個實現了Ienumerable接口的集合里。如果想了解更多foreach的用法,你可以查看.NETFrameworkSDK文檔中的C#LanguageSpecification。在編譯的時候,C#編輯器會對每一個foreach區域進行轉換。IEnumeratorenumerator=array.GetEnumerator();try{stringitem;while(enumerator.MoveNext()){item=(string)enumerator.Current;Console.WriteLine(item);}}finally{IDisposabled=enumeratorasIDisposable;if(d!=null)d.Dispose();}這說明在后臺,foreach的管理會給你的程序帶來一些增加系統開銷的額外代碼。三、將圖片保存到一個XML文件WinForm的資源文件中,將PictureBox的Image屬性等非文字內容都轉變成文本保存,這是通過序列化(Serialization)實現的,例子://usingSystem.Runtime.Serialization.Formatters.Soap;Streamstream=newFileStream("E:\\Image.xml",FileMode.Create,FileAccess.Write,FileShare.None);SoapFormatterf=newSoapFormatter();Imageimg=Image.FromFile("E:\\Image.bmp");f.Serialize(stream,img);stream.Close();四、屏蔽CTRL-V在WinForm中的TextBox控件沒有辦法屏蔽CTRL-V的剪貼板粘貼動作,如果需要一個輸入框,但是不希望用戶粘貼剪貼板的內容,可以改用RichTextBox控件,并且在KeyDown中屏蔽掉CTRL-V鍵,例子:privatevoidrichTextBox1_KeyDown(objectsender,System.Windows.Forms.KeyEventArgse){if(e.Control&&e.KeyCode==Keys.V)e.Handled=true;}ps:網上摘抄,看了以后感覺不錯,以后碰見好的再陸續發布Tags:dotnet技術,c#開發技術ASP.NET2.0中使用webpart系列控件Dot-Net技術|閱讀(144)|評論(0)Oct292005[此文來源于互聯網,牛C網只負責收集整理]在現在的網站設計中,更強調的是用戶的個性化設置,讓用戶可以自由的設置符合自己喜好的頁面成為網站開發人員的頭號難題,不過現在看來這個難題微軟幫我們解決了。在2.0中新增加了一系列webpart控件,可以讓用戶很方便地對網頁的各區域布局進行調整。在一些web應用程序中,如果用戶想自定義頁面布局,比如一個新聞發布系統,想讓左,中,右三欄的位置進行調換的話,就可以使用webpart控件。下面,我們來看下2.0中webpart系列控件的一些基本用法。首先,在2005中的工具箱中,可以找到如下圖所示的webpart系列控件,有很多個,限于篇幅,本文介紹其中的一些重要的控件:在webpart系列控件中,其中的webpartmanager控件用于統一管理各webpart控件。而webpartzone控件,則是提供了各區域劃分,在這些區域中,用戶可以往里面放置各式各樣的控件,而當運行的時候,用戶可以移動的就是這些webpartzone控件所在的區域。為增強認識,我們先做個簡單的例子。1、首先使用2005beta2(或者RC1)新建一個web站點,2、往窗體中拖拉一個webpartmanager控件,再建一個3列1行的表格,分別往每個單元格里拖拉一個webpartzone控件,如下圖:3、往webpartzone1中拖拉放一個日歷控件,并為這個日歷控件選擇一個合適的樣式4、切換到代碼視圖狀態,將日歷控件的title屬性改為:today’sdate。注意的是,日歷控件本身沒有title屬性,但當一個控件加入到webpartzone區域中去后,則該控件被自動包裝為GenericWebPart類型控件,這些類型的控件有title屬性。5、這時,我們可以按F5來運行該程序,運行如下圖所示,可以看到,區域的右上角有最小化和關閉,恢復的按鈕。接下來,我們介紹如何在webpart系列控件中,使用用戶自定義的控件。1、首先,我們為工程項目增加一個"google.ascx"的控件,并且在images目錄下,添加google那張著名的logo圖片。接著,往窗體中添加一個2*2行的表格,再往其中的一個單元格添加一個image圖象控件,指定其圖象為google.gif,再添加一個文本框,一個按鈕,如下圖所示,其中,括號內的是該控件的名稱:3、在btnsearch按鈕的click事件中寫入如下代碼:Response.Write(Page.IsValid)DimqueryStrAsString=HttpUtility.UrlEncode(txtSearch.Text)Response.Redirect("/search?q="&queryStr)EndSub4、這時,將寫好的google.ascx控件,整個拖拉到我們剛才建立好的表格中的中間那個單元格,如下圖所示:我們并且修改代碼如下,修改其名稱為googleserach:<uc1:Googletitle="GoogleSearch"runat="server"ID="Google1"/>接下來,F5運行,可以看到,可以在googlesearch所在的webpart里進行google搜索了。同時,如果覺得webpart的那些關閉,恢復,最小化的按鈕不大好看,還可以自定義按鈕,比如在images目錄下,添加下面的圖片:然后,在webpartzone1的屬性中,指定如下的屬性就可以了。CloseVerb.ImageUrl="Images/CloseVerb.gif"EditVerb.ImageUrl="Images/EditVerb.gif"MinimizeVerb.ImageUrl="Images/MinimizeVerb.gif"RestoreVerb.ImageUrl="Images/RestoreVerb.gif"使webpart動起來上面設計的webpart還沒能動起來,要讓webpart動起來的話,必須要將webpar設置為designdisplay模式。先為webpart添加下面的radiobutton選擇框<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem></asp:RadioButtonList>并且在code-behind的代碼中,寫入如下代碼:ProtectedSubRadioButtonList1_SelectedIndexChanged(ByValsenderAsObject,_ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeEndSelectEndSub運行上面代碼,選擇designdisplaymode,則可以象下圖那樣,自由拖動webpart,要注意的是,當移動各webpart的位置后,即使關掉瀏覽器,下次重新打開時,依然可以看到各個控件保持原來的位置。其實,2.0是使用在aspnetdb.mdf中的一個叫aspnet_PersonalizationPerUser的表來保存數據的,表的結構如下所示:FieldValueId928e121a-4042-4fb4-9520-21210b9b37c1PathId7c3b5dc0-04d0-48a2-bbb2-2b70286f22feUserId9bff14df-024f-4bda-9a0a-b4a19ab9e387PageSettings<Binarydata>LastUpdatedDate10/06/20054:44:05AM如果想恢復各控件的原來位置,只需要將該數據表中相應的行刪除掉就可以了。但有個問題是,如果使用每一個webpart的關閉按鈕,則很難再將其恢復(當然刪除數據表中的行,但十分麻煩)。在2.0中,提供了另一種webpart,叫做catlogzone控件,下面介紹其用法:1、往窗體中拖拉一個catlogzone控件,如下圖所視。2、往該catlogzone控件區域中,再拖放三個webpart系列的控件,分別是DeclarativeCatalogPart,PageCatalogPart,andImportCatalogPart,如下圖所示。其中,DeclarativeCatalogPart控件的作用是,顯示目前頁面上有哪些可以用的webpart控件;PageCatalogPart的作用是,可以讓用戶通過勾選的方式,選定將哪些控件添加轉移到其他webpart區域中去。ImportCatalogPart則可以通過外部磁盤文件的方式,加載其他做好了的webpart部件。3、在radiobutton區域中,修改以下代碼,增添一個catalogdisplay的顯示模式:<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem><asp:ListItem>CatalogDisplayMode</asp:ListItem></asp:RadioButtonList>然后,在code-behind的代碼中,將代碼修改為如下:ProtectedSubrblMode_SelectedIndexChanged(_ByValsenderAsObject,_ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeCase2:WebPartManager1.DisplayMode=WebPartManager.CatalogDisplayModeEndSelectEndSub4、在DeclarativeCatalogPart任務菜單上,點擊右上角的智能感知按鈕,然后選"edittemplates"的鏈接,進入模版編輯狀態,如下圖:再往其中的webpartstemplate區域中拖拉一個google.ascx控件,如下圖,這將允許用戶在運行時,可以自由地往頁面增加這樣的google搜索控件。5、然后修改代碼如下:<ZoneTemplate><asp:DeclarativeCatalogPartID="DeclarativeCatalogPart1"runat="server"><WebPartsTemplate><uc1:Googletitle="GoogleSearch"ID="Google2"runat="server"/></WebPartsTemplate></asp:DeclarativeCatalogPart>6、運行程序,可以看到,當選擇catalogdisplaymode時,會顯示如下圖所示的catalogzone,其中列出了當前可用的有哪些webpart控件,我們可以把這個google的控件加到其他的webpart區域,也可以嘗試將已經存在的webpart控件關閉,然后在catalogzone區域中的控件列表中,把它們再加回到頁面中去。此外,在運行期間,還可以動態地修改webpart控件的外觀等屬性,如下:1)往窗體中添加一個editorzone的區域控件,往其中再拖放一個appearanceEdiotrPart控件,該控件可以在運行時,讓用戶動態改變各webpart控件的屬性。2)我們再修改radiobutton選擇框的代碼如下,則加一個編輯模式:<asp:RadioButtonListID="rblMode"runat="server"AutoPostBack="True"><asp:ListItem>BrowseDisplayMode</asp:ListItem><asp:ListItem>DesignDisplayMode</asp:ListItem><asp:ListItem>CatalogDisplayMode</asp:ListItem><asp:ListItem>EditDisplayMode</asp:ListItem></asp:RadioButtonList>3)修改code-behind代碼如下:ProtectedSubrblMode_SelectedIndexChanged(ByValsenderAsObject,ByValeAsSystem.EventArgs)_HandlesrblMode.SelectedIndexChangedSelectCaserblMode.SelectedIndexCase0:WebPartManager1.DisplayMode=WebPartManager.BrowseDisplayModeCase1:WebPartManager1.DisplayMode=WebPartManager.DesignDisplayModeCase2:WebPartManager1.DisplayMode=WebPartManager.CatalogDisplayModeCase3:WebPartManager1.DisplayMode=WebPartManager.EditDisplayModeEndSelectEndSub4)運行程序,選擇editdisplaymode模式,這時,會發現每個控件的右上角,會多了一個"edit"的按鈕,點該按鈕,彈出如下圖的窗體,用戶可以修改每個控件的外觀等屬性。最后,我們看下,webpart控件之間還可以進行相互之間的通信,下面的例子中,要實現的是,在一個日歷控件中點選某一個日期,會在已經做好的googlesearch的webpart控件的文本框中顯示其日期,達到通信的目的,下面介紹其實現步驟:1、為了使兩個webpart控件之間進行通信,必須先聲明一個公共的接口。往工程項目里增加一個叫ISelectedDate.vb的類文件,放在app_code目錄下,寫入如下代碼:ImportsMicrosoft.VisualBasicPublicInterfaceISelectedDateReadOnlyPropertySelectedDate()AsDateEndInterface這里,我們返回一個只讀的日期屬性selectedDate.2、再創建一個日歷控件CalendarUC.ascx,其中拖拉一個普通的日歷控件即可。然后寫入如下代碼:PartialClassCalendarUC_ascxImplementsISelectedDatePublicReadOnlyPropertySelectedDate()AsDateImplementsISelectedDate.SelectedDateGetEndGetEndProperty<ConnectionProvider("SelectedDate","SelectedDate")>_PublicFunctionGetSelectedDate()AsISelectedDateReturnMeEndFunctionEndClass上面的代碼,首先實現了已經聲明了的IselectedDate接口,要留意的是<ConnectionProvider("SelectedDate","SelectedDate")>中的寫法。由于在這個例子中,日歷控件要為其他的控件提供信息,因此,該日歷控件是一個provider(提供者),而另外的接收信息的控件,是consumer(消費者)。而兩者為了要通信,必須要提供一個通信接入點,就象一個電插頭,要找到合適的電插板一樣。因此,<ConnectionProvider("SelectedDate","SelectedDate")>中的第一個參數,定義了兩者的接口點,第二個參數,則是要傳遞給consumer的參數,本例是selectedDate。3、接下來,我們在已經做好的google.ascx控件的代碼中,編寫如下代碼:Private_selectedDateAsISelectedDate<ConnectionConsumer("SelectedDate","SelectedDate")>_SubsetSearchText(ByValSearchTextAsISelectedDate)Me._selectedDate=SearchTextEndSubProtectedSubPage_PreRender(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMe.PreRenderIf_selectedDateIsNotNothingThenEndIfEndSub可以看到<ConnectionConsumer("SelectedDate","SelectedDate")>的定義必須和provider中的定義一樣。4、再修改如下代碼,將兩個控件的命名變得通俗易懂<ZoneTemplate><uc1:Googletitle="GoogleSearch"runat="server"ID="Google1"/><uc3:CalendarUCtitle="CalendarWebPart"runat="server"ID="CalendarUC1"/></ZoneTemplate>5、最后,為了使兩者能互相通信,必須在default.aspx頁中修改如下代碼:<asp:WebPartManagerID="WebPartManager1"runat="server"><StaticConnections><asp:WebPartConnectionID="Connection"ProviderID="CalendarUC1"ProviderConnectionPointID="SelectedDate"ConsumerID="Google1"ConsumerConnectionPointID="SelectedDate"/></StaticConnections></asp:WebPartManager>6、在頁面代碼中,增加一個radiobutton,用作顯示connection模式,并寫入如下代碼:Case4:WebPartManager1.DisplayMode=WebPartManager.ConnectDisplayMode7、運行程序,選擇connectdisplaymode模式。再選擇GOOGLESEARCH的那個webpart控件,點右上角的"conenct"按鈕,此時,會顯示如下圖所示,提示你要選擇從那個控件中得到信息,這里選擇日歷控件,按確定。那么,當點選日歷控件的某個日期值的時候,GOOGLESEARCH的那個文本框里,就會顯示相應的日期了。小結:本文主要介紹了在2.0中,如何使用基本的webpart系列控件,以達到改變頁面布局以及如何使頁面的各webpart控件相互之間通信。Tags:dotnet技術,c#開發技術用C#與XML創建動態分層菜單Dot-Net技術|閱讀(164)|評論(0)Oct282005[此文來源于互聯網,牛C網只負責收集整理]Author:unknownFrom:Internet從在復雜的B2B交易中的交換數據到為應用程序提供配置文件結構,XML在許多方面大顯身手!由于XML不斷地獲得軟件的支持,我們完全能夠預見:XML的應用將不斷增加。本文就介紹這樣一種應用程序,它使用XML創建類似于Windows開始菜單的分層菜單系統,從而向終端用戶提供更滿意的Web體驗。這個應用程序將使用C#、XML和服務器端Microsoft.Net框架,創建一個DHTML結構,IE4或更高版本的瀏覽器可以操作它并在客戶端動態顯示。由于我們可以快速地訪問服務器上的XML,并且XML能夠描述層次之間的關系,因此它成為標記“父/子菜單”數據的一個最佳選擇。(一個三層菜單系統,可點擊放大)除了學習如何使用XML創建一個菜單應用程序外,我們還要介紹.Net框架的主要XML類,它們位于System.Xml集合中。什么是.Net集合(Assembly)要在C#文件中使用XML,就必須引用一個特定的名稱空間。.Net平臺中的一個名稱空間是作為一個程序組件的組織系統使用的,它對于解決命名沖突很重要,這一點很象XML中的名稱空間。這個基于XML的菜單系統是用位于System.Xml集合中的System.Xml名稱空間創建的。.NetSDK是這樣定義集合的:一個集合就是一個類型和資源的匯集信息,這些類和資源一起使用,形成一個功能的邏輯單元,即一個“邏輯”dll。一個集合需要許多物理文件,如界面、類、資源文件等等,并且創建了關于文件如何一起工作的元數據。集合中還可能包含版本及安全信息。集合有許多好處,其中之一就是可以在ASP.NET應用程序中使用,而無須用regsvr32.exe向注冊文件中增加一個類識別號(CLSID)。這樣以來,集合的升級操作與將適當的集合復制到一個ASP.NET應用程序的bin目錄中一樣簡單。現在我們就來仔細看一看那些建立在System.Xml名稱空間和集合中的類。如果你以前使用過Microsoft的MSXML3分解器,就會發現使用System.Xml集合中的類相當簡單。這里的菜單應用程序只使用了這些主要集合類中的一部分:XmlNode、XmlDocument、XmlNodeList、XmlNamedNodeMap、DocumentNavigator、XmlTextReader和XmlTextWriter。XmlDocument、XmlNodeList和XmlNode類用來創建傳遞給客戶端瀏覽器的菜單應用程序的結構。用XmlDocument類以一種安全線程(thread-safe)的方式從服務器上裝載和分解本地或遠程XML文檔。建立在一個字符串中的XML標記也可以被裝載或分解,從而在一個文檔中創建、移動節點或取消節點的移動。XmlNodeList類可以使我們列舉一個節點的集合來訪問一個特定屬性,如名稱、值或名稱空間。最后,XmlNode類可以用來在XML文檔中向一個用于檢驗的XmlNode對象分配一個特定節點。XmlNamedNodeMap類用來列舉建立在一個元素類型選擇中的屬性集合。DocumentNavigator、XmlTextReader和XmlTextWriter類提供與XML一起使用所需要的額外功能。要特別說明的是,DocumentNavigator可以用來執行XPath查詢,它被包含在XSLT轉換中。XmlTextReader類提供對XML節點的只向前(forward-only)、無緩存的訪問,從而使XML節點對大型XML文檔也同樣生效。XmlTextWriter類提供一個快速、只向前的指針模型,實現將XML內容寫到一個流或一個文件中的目的。在菜單應用程序中使用的XML文檔相對來說是較小的,因此我們可以在服務器端使用文檔對象模式(DOM)來存取XML文檔中的不同節點。當分解大型XML文檔時,就需要使用XmlTextReader類所含有的只向前模型。XML代碼菜單應用程序使用了3個XML文檔:menuItems.xml、menuItems2.xml和menuItems3.xml,它們用于標記單獨的菜單項目。XML的處理和操作由一個叫做xmlMenus.dll的集合完成,這個集合被服務器端的一個ASP.NET文件createMenus.aspx所使用。在客戶端的動態HTML(DHTML)內容使用了一個層疊格式表文件和一個JavaScript文件,這些文件聯合在一起生成了本文開始部分的圖示結果。我們在List1的代碼顯示了用來標記單獨菜單項目的XML文檔的一部分。文檔中的主元素命名為menuItem,它可以包含一個名字和超級鏈接元素以及額外的menuItem子元素。這種關系可以用來創建包含子菜單的菜單系統,就象Windows的開始菜單一樣。由于XML已經標出了分層關系,因此就可以利用循環在不同元素之間行走:當使用XmlDocument、XmlNode和XmlNodeList類創建子節點時,我們可以反復調用WalkTree()函數以顛倒父/子關系。其它的類如ArrayList和StreamWriter用于將相關菜單歸類到數組中,然后在適當時間將所生成的菜單結構寫入一個文件中。XmlMenus集合的代碼開始時要聲明一個XmlHierMenu名稱空間,接下來要引用System、System.Xml、System.Collections和System.IO名稱空間:usingSystem;usingSystem.Xml;usingSystem.Collections;usingSystem.IO;在這部分代碼之后要創建3個構造器。一個構造器不接收變量,只對變量進行初始化。下一個構造器接收一個圖象文件的定制路徑。最后一個構造器在不經常對XML菜單進行刷新的情況下,允許將由集合生成的輸出存儲到一個文件中。最后一個構造器所生成的文件可以被靜態地包含在一個ASP.NET文件中,而不是在各個Web頁面請求時隨時地生成。在構造器之后,開始定義CreateMenu()方法,具體請看List2中的代碼。這個方法負責進行XML文檔的裝載和解析,找到根節點,然后在根的子節點之間循環。如果發現一個子節點本身還有子節點,就調用WalkTree()方法,并且把這些子節點都傳遞到其中。如果這些子節點還有子節點,就再次調用WalkTree()。這個過程循環進行直到不再發現增加的子節點。Walktree()方法的代碼可以參看List3。在調用WalkTree()方法并且對不同的節點進行分析的同時,要解析menuItem節點,將來自其超級鏈接和名字節點的數據放在數組列表中。對整個XML文檔都進行解析之后,數組列表的內容就被傳遞回調用的ASP.NET的頁面,然后使用Response對象寫出信息。從這時起,客戶端的JavaScript代碼就開始控制DHTML菜單了。在服務器端,我們使用一個ASP.NET頁面來開始菜單的創建過程。這個頁面輸入了與集合相關聯的名稱空間XmlHierMenu:<%@pagelanguage="C#"%><%@ImportNamespace="XmlHierMenu"%>然后,將樣式表文件和JavaScript文件包含在文件的代碼區中。最后,在ASP.NET頁面底部的代碼用來引用上面提到的CreateMenu()方法與WalkTree()方法,請看List4。在ASP.NET頁面中所找到的C#代碼只是建立了到不同的XML文檔的路徑,并且對XmlMenu類進行了例示。一旦對這個類進行了例示,就對CreateMenu()方法進行調用。這個方法接收菜單名以及到這個菜單的XML文檔的文件路徑。在本例中,要創建3個名為menu1、menu2和menu3的菜單,然后在一個ASP.NET頁面中使用。這個應用程序在一個給定頁面中可以支持無窮多的菜單,但是我們建議菜單數目不要過多,因為每增加一個菜單,發送到客戶端的文件規模都會增加。編譯C#文件現在我們已經看到了菜單應用程序的結構,接下來討論一下使用哪些開關可以將C#文件編譯到一個集合中。在.NetSDK文檔中,我們可以查詢到一個所有編譯開關的完整列表。要想正確地編譯C#文件以使它能用于一個ASP.NET頁面中,編譯器就必須要知道包含了System.Xml集合。這可以通過使用/r開關并在后面加上到集合的完整路徑來完成。由于將要創建的dll是一個庫,因此就必須指定/t開關,這樣編譯器就不再尋找一個靜態的Main()方法。最后一個需要的開關是/out,它將告訴編譯器輸出的文件名是什么,以及將其放在哪里。所有對C#編譯器的調用都以csc(C#編譯器)開始,然后指定適當的開關。編譯器語法的最后一部分包括到已創建的.cs文件的路徑。請看下面的編譯文件的完整語法格式:C:\>csc/r:System.Xml.dll/t:library/out:d:\inetpub\wwwroot\xml\bin\xmlMenus.dlld:\inetpub\wwwroot\xml\menus\xmlMenus.cs這行命令告訴編譯器包含System.Xml集合、將文件作為一個庫進行編譯、將文件輸出到bin目錄中、輸入文件命名為xmlMenus.cs,輸出文件名叫xmlMenus.dll。當輸入回車鍵后,.cs文件就進行編譯,生成的dll將被放置在適當的文件夾中。結束語本文通過講解一個應用程序的思路及實現代碼,使我們對于使用Microsoft.Net平臺中的一些集合和類有了一個很好的了解。隨著進一步的學習,我們將看到,還會有其它一些集合和類可以以多種方式與本地和遠程XML文檔一起工作。Tags:dotnet技術,c#開發技術C#語言函數參數的傳遞Dot-Net技術|閱讀(118)|評論(0)Oct282005[此文來源于互聯網,牛C網只負責收集整理]就像C語言眾多的后世子孫一樣,C#的函數參數是非常講究的。首先,參數必須寫在函數名后面的括號里,這里我們有必要稱其為形參。參數必須有一個參數名稱和明確的類型聲明。該參數名稱只在函數體內部可見。因此在該函數體以外的任何地方使用同樣的變量名是不會引起沖突的。每當調用函數的時候,必須將一個實參傳遞給函數定義中的形參。默認情況下,C#的參數傳遞是值傳遞。這種方式的優點和缺點同樣明顯。另外,在傳送引用類型的時候還時不時引起一些小誤會。更加使人困惑的是,既然CLR不支持指針類型,那么我們以前在C/C中的那些關于指針傳遞的妙用應該如何實現呢?不必發愁,本文將會逐一回答上述這些疑問。首先我們會討論默認情況下的值傳遞以及這種方式的優缺點,解釋默認情況下傳遞引用類型時容易產生的誤解。然后,我們討論如何利用ref關鍵字把一個值類型作為引用類型傳遞給參數。最后,我們嘗試著讓一個函數可以返回多個值,在C/C中我們經常利用指針達到這一目的,這里我們將會利用out關鍵字重溫這種美妙的感覺。值傳遞每當調用一個函數的時候,我們就必須為該函數的每一個形參傳遞一個實參。默認情況下,采用值傳遞的機制。也就是說,實參的值會被拷貝到形參里面,這樣我們在函數內部得到一個本地變量,該變量的值和傳遞進來的那個實參的值相等,但是它們存放在不同的存儲空間。因此,我們對函數參數所做的一切實際上都是對函數提內本地變量的操作,絕對不會影響到作為實際參數傳遞過來的那個函數體外的變量。看下面的例子,我就不再多費口舌了。usingSystem;namespaceCS語言函數參數的傳遞{///<summary>///Class1的摘要說明。///</summary>classExample{staticvoidMain(string[]args){intargument=5;Exampleexp=newExample();System.Console.WriteLine(argument);exp.fun1(argument);System.Console.WriteLine(argument);}publicExample(){}publicvoidfun1(intparameter){//對parameter的操作實際上是對本地變量的修改//不會影響到函數體外作為實參傳遞過來的變量parameter=5;System.Console.WriteLine(parameter);}}}但是值傳遞的機制有一個明顯的缺點。主要表現在值類型的傳遞方面。我們對參數的修改會在函數體執行結束之際消失。如果我們希望將這種變化影響到作為實參傳遞過來的那個函數體以外的變量就必須把值類型作為引用類型傳遞。后邊會具體討論。值傳遞機制的另一個缺點,或許你會認為這是一個優點,表現在引用類型的傳遞方面。按照值傳遞的機制傳遞一個引用類型的變量,實際上只是完成了一次淺拷貝。請不要誤認為對整個對象進行了深拷貝。函數參數得到的只是實參的handle的值。也就是說,本地的參數實際上只是一個引用類型的handle,和作為實參傳遞過來的那個變量的handle具有相同的值,指向同一個object(兩個handle指向堆上的相同位置)。這樣我們在函數內部對參數所做的修改會直接影響到堆上的object。當函數結束之后,本地的參數消失,而對于堆上的object的修改會成為持久的修改而繼續保留下來。把值類型作為引用類型傳遞有一些時候,我們不惜望函數對于參數的修改隨著函數的結束而消失。作為引用類型,作到這一點其實一點都不難,就像我們上面說的那樣。但是,如果是值類型的參數,似乎就有一點麻煩了。從前在C/C里面可以采取傳遞指針的方法來達到這個目的。但是CLR已經明確取消了指針。作為補償,C#為我們提供了ref關鍵字。ref關鍵字通知編譯器,參數的實參是作為引用類型而非值類型進行傳遞。下面的這段程序幫助我們說明問題。usingSystem;namespaceCS語言函數參數的傳遞{classExample{staticvoidMain(string[]args){intargument=5;Exampleexp=newExample();//首先顯示argumentSystem.Console.WriteLine(argument);exp.fun2(refargument);//傳遞參數時必須使用ref關鍵字System.Console.WriteLine(argument);System.Console.ReadLine();}publicvoidfun1(intparameter){//對parameter的操作實際上是對本地變量的修改//不會影響到函數體外作為實參傳遞過來的變量parameter=5;System.Console.WriteLine(parameter);}publicvoidfun2(refintparameter){parameter=5;System.Console.WriteLine(parameter);}}}函數fun2要求一個int類型的參數,并且伴有關鍵字ref。在Main()函數內定義了一個整形變量argument,它將會作為實參傳遞給函數fun2()。在調用該函數之前,首先顯示了變量argument,其值等于5。緊接著調用函數fun2(),并且傳遞argument給參數parameter。這時函數得到的是一個本地的,指向整形變量argument的handle。在函數內部,把parameter加5,然后顯示它。這時其值為10。函數返回后再一次顯示argument,其值同樣為10。讓函數返回多個返回值有些時候我們可能會希望一個函數可以返回多個返回值。事實上,這是不可能的因為一個函數只能返回一個返回值。但是我們確實辦法達到這種效果。最簡單的是下面這種方法。publicintfun3(refinti,intj){i=j;returnij;}我們這樣調用這個函數。inti;intsum=exp.fun3(refi,10);System.Console.WriteLine(i);System.Console.WriteLine(sum);這樣在執行過函數fun3()之后,我們實際上得到了i的值和ij的值。實際上起到了利用一個函數返回兩個值的作用。另外有一個關鍵字也是非常重要的。那就是out關鍵字。該關鍵字允許向參數傳遞一個沒有分配空間的引用類型。利用這個關鍵字同樣可以達到返回多個值的目的。publicvoidfun4(refinti,outobjectobj){i=5;obj=i.ToString();System.Console.WriteLine(i);System.Console.WriteLine(obj);}上面這個方法要求兩個參數。第二個參數要求一個object類型的變量。該參數前面有一個out關鍵字。編譯器會認為該參數的實參沒有被分配存儲空間。Out參數在未被賦值之前不能使用。可以這樣調用該函數:inti=5;objectobj;exp.fun4(refi,outobj);System.Console.WriteLine(i);System.Console.WriteLine(obj);輸出為4個10。說明我們在調用該函數之后得到了變量i和obj兩個變量的值。Tags:dotnet技術,c#開發技術使用C#語言操作ADO數據庫Dot-Net技術|閱讀(125)|評論(0)Oct282005[此文來源于互聯網,牛C網只負責收集整理]訪問數據庫是大多數應用程序的一部分,而且隨著C#和ADO.NET的發布,這個過程已經變得相當的簡單.本文將展示下面四個基本的數據庫操作:1.讀數據.這包括諸如整數,字符串和日期等不同的數據類型.2.寫數據.就象讀數據一樣我們會寫這些通常的數據類型.這是通過SQL語句來實現的.3.更新或是修改數據.我們還是使用簡單SQL語句.4.刪除數據.使用SQL.這些操作是對一個微軟Access2000數據庫進行的,但是SQL或是其它ADO數據源可以通過簡單的改變連接字符串來使用.開始第一步為了使用ADO類,我們需要包括進ADO.NET命名空間(namespace)和一些精巧的日期類.在你要進行數據庫操作的地方加入下列幾行代碼.它應該被放置在命名空間引入代碼行的下面而在類定義的上面.usingSystem.Data;//申明變量usingSystem.Data.ADO;//數據庫usingSystem.Globalization;//日期根據你所參與的工程的類型,你可能需要增加對System.Data命名空間的引用.你可以根據在你添加上面的代碼以后編譯器是否產生錯誤來判斷.要添加System.Data命名空間,你可以:1.在Solutionexplorer-References分支中右鍵單擊.2.選擇"添加引用"3.選擇.NETFramework標簽.4.雙擊System.data.dll條目5.單擊OK6.System.Data現在應該出現在了Solutionexplorer的引用列表中了.因為連接字符串在大多數操作中都要使用,所以我建議你將它設置成你要編寫的類的成員.注意:在你的程序中,數據庫文件的路徑有可能不同.//屬性publicconststringDB_CONN_STRING="Driver={MicrosoftAccessDriver(*.mdb)};""DBQ=D:\\CS\\TestDbReadWrite\\SimpleTest.mdb";讀數據現在一切都變得有趣起來.讀數據可以通過ADODataReader類來實現.(參看ChrisMaunder的文章"ADO.NETADODataReader類"來獲取關于這個類的更多信息.)讀數據的步驟如下:1.我們用ADOConnection來打開一個數據庫.ADOConnectionconn=newADOConnection(DB_CONN_STRING);conn.Open();2.我們編寫一個SQL語句來定義將要取出的數據.這個數據執行的結果是返回一個ADODataReader對象.注意Execute方法中的out關鍵字.這在C#中意味著通過引用傳遞參數.ADODataReaderdr;ADOCommandcmd=newADOCommand("SELECT*FROMPerson",conn);cmd.Execute(outdr);3.我們循環遍歷ADODataReader中的每一個記錄直到我們完成要做的工作.注意:數據被直接作為一個字符串返回同時數據域名稱用來指明讀的數據域.while(dr.Read()){System.Console.WriteLine(dr["FirstName"]);}4.我們收工但是,作為好的程序員我們還需要加進許多try/catch/finally語句來確保我們處理了所有的錯誤.try{數據庫操作...}catch(Exceptionex){System.Console.WriteLine("READING:");System.Console.WriteLine("ERROR:"ex.Message);System.Console.WriteLine("SQL:"sSqlCmd);System.Console.WriteLine("Conn.:"DB_CONN_STRING);}finally{//關閉連接if(conn.State==DBObjectState.Open)conn.Close();}讀取不同的數據類型dr["stuff"]這個語句通常能夠返回一個數據.但是要返回一個int或者DateTime對象的話通常需要進行數據轉換.這通常可以通過使用ADODataReader許多內建轉換器中的一個來實現.也就是:intnOrdinalAge=dr.GetOrdinal("Age");intnAge=dr.GetInt32(nOrdinalAge);DateTimetUpdated=(DateTime)dr["Updated"];注意GetOrdinal定位數據域用名字來讀取數據的用法.如果數據域是空白的(還沒有填入任何數據),上面的代碼會拋出一個異常.要捕捉這種情況,我們可以用IsNull方法檢查是否有數據存在,如下所示:intnOrdinalAge=dr.GetOrdinal("Age");if(dr.IsNull(nOrdinalAge)){System.Console.WriteLine("Age:Notgiven!");}else{intnAge=dr.GetInt32(nOrdinalAge);System.Console.WriteLine("Age:"nAge);}插入,修改,刪除和其他SQL命令插入,修改,刪除過程可以非常容易的通過SQL語句來實現.下面的代碼執行一條SQL命令來插入一條記錄.//SQL命令StringsSQLCommand="INSERTINTOPerson(Age,FirstName,Description,Updated)""VALUES(55,'Bob','IsaPenguin','2001/12/2520:30:15');";//創建command對象ADOCommandcmdAdder=newADOCommand(sSQLCommand,DB_CONN_STRING);cmdAdder.ActiveConnection.Open();//ExecutetheSQLcommandintnNoAdded=cmdAdder.ExecuteNonQuery();System.Console.WriteLine("\nRow(s)Added="nNoAdded"\n");注意:try/catch代碼沒有在上面的例子里出現,但是應該包括上面的代碼.插入上面的代碼通過建立一個SQL命令然后執行它來插入一條記錄.一些在編寫SQL命令時應注意的事項如下:1.數值數據應該直接表示.沒有單引號(').2.字符串的表示應該包括在單引號中('blah').3.確保字符串中不包含任何嵌入的單(雙)引號.這會使事情混淆.4.日期和時間數據用包裹在單引號中的國際通用形式來表示('YYYY/MM/DDHH:MM:SS').修改UPDATE命令指明要修改的數據和修改的動作.ExecuteNonQuery()的返回值指出改變的記錄的個數,所以如果有5個Peter's在表單中的話下面的代碼將返回5.StringsSQLCommand="UPDATEPersonSETAge=27WHEREFirstName='Peter'";刪除DELETE命令指明要刪除的記錄.ExecuteNonQuery()的返回值指出改變的記錄的個數,所以如果有2個Bobo在表單中的話下面的代碼將返回2.兩個Bobo都會被刪除.StringsSQLCommand="DELETEFROMPersonWHEREFirstName='Bobo'"";Tags:dotnet技術,c#開發技術C#中一些字符串操作的常用用法Dot-Net技術|閱讀(132)|評論(0)Oct282005[此文來源于互聯網,牛C網只負責收集整理]//獲得漢字的區位碼byte[]array=newbyte[2];array=System.Text.Encoding.Default.GetBytes("啊");inti1=(short)(array[0]-''\0'');inti2=(short)(array[1]-''\0'');//unicode解碼方式下的漢字碼array=System.Text.Encoding.Unicode.GetBytes("啊");i1=(short)(array[0]-''\0'');i2=(short)(array[1]-''\0'');//unicode反解碼為漢字stringstr="4a55";strings1=str.Substring(0,2);strings2=str.Substring(2,2);intt1=Convert.ToInt32(s1,16);intt2=Convert.ToInt32(s2,16);array[0]=(byte)t1;array[1]=(byte)t2;strings=System.Text.Encoding.Unicode.GetString(array);//default方式反解碼為漢字array[0]=(byte)196;array[1]=(byte)207;s=System.Text.Encoding.Default.GetString(array);//取字符串長度s="iam方槍槍";intlen=s.Length;//willoutputas6byte[]sarr=System.Text.Encoding.Default.GetBytes(s);len=sarr.Length;//willoutputas33*2=9//字符串相加System.Text.StringBuildersb=newSystem.Text.StringBuilder("");sb.Append("i");sb.Append("am");sb.Append("方槍槍");/////////////////////////////////////////////////////////////////////string-->bytearraybyte[]data=Syste.Text.Encoding.ASCII.GetBytes(string);string-->bytebytedata=Convert.ToByte(string);byte[]-->stringstringstring=Encoding.ASCII.GetString(bytes,0,nBytesSize);Tags:dotnet技術,c#開發技術Asp.Net性能優化Dot-Net技術|閱讀(112)|評論(0)Oct282005[此文來源于互聯網,牛C網只負責收集整理](一).選擇會話狀態存儲方式在Webconfig文件配置:<sessionStatemode="???"stateConnectionString="tcpip=:42424"sqlConnectionString="datasource=;Trusted_Connection=yes"cookieless="false"timeout="20"/>A有三種方式存儲會話狀態信息:1.存儲在進程中:屬性mode=InProc特點:具有最佳的性能,速度最快,但不能跨多臺服務器存儲共享.2.存儲在狀態服務器中:屬性mode="StateServer"特點:當需要跨服務器維護用戶會話信息時,使用此方法。但是信息存儲在狀態服務器上,一旦狀態服務器出現故障,信息將丟失3.存儲在SqlServer中:屬性mode="SqlServer"特點:工作負載會變大,但信息不會丟失.補充一點:I.由于某些頁面不需要會話狀態,則可以將會話狀態禁用:代碼如下:<%@PageEnableSessionState="false"%>II.如果頁面需要訪問會話變量但不允許修改它們,可以設置頁面會話狀態為只讀:代碼如下:<%@PageEnableSessionState="false"%>使用時可以根據具體情況選擇某種方式(二).使用Page.IsPostBackPage.IsPostBack表示是否是從客戶端返回的.初次運行時,不是從客戶端返回,它的值為false,當觸發頁面上的事件或刷新頁面時,Page.IsPostBack由于是回發的,值變為true;一般在:Page_Load方法中用:privatevoidPage_Load(Objectsender,EventArgse){if(!Page.IsPostBack){;//初始化頁面的代碼。這些代碼第一次頁面初始化時執行,當第二次回發時,//不會再執行。提高效率。}}往往很多時候不得不用IsPostBack,因為有些控件初始化后,要保持它的狀態.例如:DropDownList,如果每次都初始化,則用戶無論選擇其選項,都會被初始化為默認值.(三).避免使用服務器控件1.一般的靜態顯示信息,盡量不要用服務端控件顯示.因為服務端控件需要回發服務端執行,會降低程序執行效率,一般用<DIV>顯示即可.如果用了服務端控件,將:runat="server"去掉,也會提高效率.2.禁用服務端控件的狀態視圖,有些控件不需要維護其狀態,可以設置其屬性:EnableViewState=false;如果整個頁面控件都不需要維持狀態視圖,則可以設置整個頁面的狀態視力為false:代碼如下:<%@PageEnableViewState="false"%>3.在Web.Config文件中配置:ASP.NETSessionss可以在Web.config或Machine.config中的Sessionsstate元素中配置。下面是在Web.config中的設置的例子:<Sessionsstatetimeout="10"cookieless="false"mode="Inproc"/>(四).避免使用DataGrid大家都知道DataGrid功能強大。但是功能強大的同時,增加了性能上的開銷。一般用其它控件:DataList或Repeater控件能實現的,盡量不用DataGrid.(五).字符串操作1.避免裝箱操作.裝箱操作運行效率比較低.例如運行兩個代碼段:stringtest="";for(forinti=0;i<10000;i){test=testi;}和stringtest="";for(forinti=0;i<10000;i){test=testi.ToString();}下面的代碼段顯然效率要高.因為i是整型的,系統要先把i進行裝箱轉換為string型的,再進行連接.需要時間,讀者可以Copy到自己機器上測試一下.2.使用StringBulider類在進行字符串連接時:stringstr=str1str2;一般超過三項連接,最好用StringBuilder來代替String類.StringBuilder可以避免重新創建String對象造成的性能損失.一般用于組裝Sql語句時用到:StringBulider.讀者可以到自己機器上測試一下.(六).ADO.Net使用方面優化1.數據庫連接打開和關閉。在需要連接時打開,當訪問完數據庫要立刻關閉連接.舉例說明,還是看兩個代碼段:I.DataSetds=newDataSet();SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);MyConnection.Open();//打開連接for(inti=0;i<1000;i)//for循環模擬取得數據前的商業邏輯操作{Thread.Sleep(1000);}myAdapter.Fill(ds);for(inti=0;i<1000;i)//for循環模擬取得數據后的商業邏輯操作{Thread.Sleep(1000);}MyConnection.Close();//關閉連接II.DataSetds=newDataSet();SqlConnectionMyConnection=newSqlConnection("server=localhost;uid=sa;pwd=;database=NorthWind");SqlCommandmyCommand=newSqlCommand(strSql,MyConnection);SqlDataAdaptermyAdapter=newSqlDataAdapter(queryStr,connectionStr);for(inti=0;i<1000;i)//for循環模擬取得數據前的商業邏輯操作{Thread.Sleep(1000);}MyConnection.Open();//打開連接myAdapter.Fill(ds);MyConnection.Close();//關閉連接for(inti=0;i<1000;i)////for循環模擬取得數據后的商業邏輯操作{Thread.Sleep(1000);}顯示II代碼比I代碼好的多,I中早早占著連接不放,如果用戶很多的話,容易出現連接池滿情況。嚴重時出現死機現象.2.數據庫查詢I.直接生成SQL語句。SqlServer每次都要對其進行編譯,在性能方面不會有很大的提高。另外也不夠安全。容易被攻擊.II.使用帶
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津市一中2025屆化學高二下期末達標檢測模擬試題含解析
- 新疆伊寧生產建設兵團第四師第一中學2025屆高二數學第二學期期末質量檢測試題含解析
- 人力資源財務代理服務合同范本
- 礦山開采場地平整與土地復墾合同
- 住宅小區公共區域裝修材料采購合同
- 長期金融顧問咨詢與管理合同
- 橙色插畫風秋季健康知識模板
- 二手商品房房屋買賣簡單合同(16篇)
- 噴漆承包合同集錦(15篇)
- 二手簡裝房交易合同(4篇)
- 2024-2030年電影放映機行業市場現狀供需分析及重點企業投資評估規劃分析研究報告
- 日內高頻交易策略研究
- 湖南省懷化市2022-2023學年五年級下學期語文期末試卷(含答案)
- DZ∕T 0004-2015 重力調查技術規范(150 000)(正式版)
- 《酒店消防安全培訓》課件完整版
- 二手人防車位使用權轉讓協議書
- PDCA提高臥床患者踝泵運動的執行率
- 河南省城市生命線安全工程建設指引V1
- 2024年河北建投能源投資股份有限公司招聘筆試參考題庫含答案解析
- JB T 6527-2006組合冷庫用隔熱夾芯板
- 質量管理制度
評論
0/150
提交評論