<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://coredeveloper.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>บทความ</title><link>http://coredeveloper.net/blogs/article/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>การทำและติดตั้ง Smooth Streaming Video อย่างง่ายด้วย Expression Encoder 2 และ IIS7</title><link>http://coredeveloper.net/blogs/article/archive/2009/06/03/smooth-streaming-video-expression-encoder-2-iis7.aspx</link><pubDate>Wed, 03 Jun 2009 09:24:25 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:696</guid><dc:creator>@RT</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=696</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2009/06/03/smooth-streaming-video-expression-encoder-2-iis7.aspx#comments</comments><description>&lt;p&gt;Smooth Streaming เป็น คุณสมบัติใหม่ใน IIS7 Media Services 2.0 สามารถทำให้ผู้ใช้งานดูวิดีโอโดยปรับความละเอียด (Bit rate) อัตโนมัติตามความเหมาะสมของ Bandwidth ของผู้ใช้ หากยังไม่เห็นภาพ ทดลองดู &lt;a href="http://www.iis.net/media"&gt;Video แบบ Smooth Streaming&lt;/a&gt; แล้วจะเข้าใจ ต้องลง Silverlight ด้วยนะครับ&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.iis.net/media/experiencesmoothstreaming"&gt;&lt;img border="0" alt="" src="http://www.microsoft.com/silverlight/smoothstreaming/media/play-video.jpg" width="220" height="190" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;สำหรับบทความนี้เราจะมาทดลองทำ Smooth Streaming Video แบบง่ายๆ กัน โดยใช้ Expression Encoder 2 Service Pack 1 และ IIS7 ขึ้นไป ซึ่งจะมาพร้อมกับ Windows Server 2008, Windows Vista หรือ Windows 7 ก็ได้ครับ สำหรับของผมนั้นทดลองบนเครื่อง Windows 7 ครับ&lt;/p&gt;  &lt;p&gt;ขึ้นแรกเราจะต้องติดตั้ง IIS 7 ก่อน โดยไปที่ Turn Windows Features On or Off ใน Control Panel และเลือกที่ Internet Information Services ครับ&lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_578C6DB5.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_6F43A51B.png" width="387" height="339" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;จากนั้นเราจะต้องติดตั้ง IIS Media Services 2.0 โดยเข้าไปที่ &lt;a href="http://www.iis.net/media"&gt;IIS Media Services&lt;/a&gt; แล้วคลิกที่ Install Microsoft Web Platform Installer &lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_22CD2C57.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_1586A344.png" width="376" height="262" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ในขั้นตอนการติดตั้งให้เลือก IIS Media Services 2.0 ส่วนตัวเลือกอื่นๆ ไม่ต้องก็ได้&lt;/p&gt;  &lt;p&gt;เท่านี้ในส่วนการเตรียม IIS ก็จะเรียบร้อยแล้ว ต่อมาเราจะลองสร้าง Video แบบ Smooth Streaming จาก HD Video ที่เรามีอยู่ ในตัวอย่างนี้ผมจะลองใช้ Video ตัวอย่างที่โหลดมาจาก &lt;a href="http://www.microsoft.com/windows/windowsmedia/musicandvideo/hdvideo/contentshowcase.aspx"&gt;WMV HD Content Showcase&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;จากนั้นเปิด Expression Encoder 2 ขึ้นมาแล้ว Import video ต้นฉบับเข้าไป ในส่วน Encode ให้เลือกเป็น Adaptive Streaming ตัว Expression Encoder จะแบ่งให้เป็น Stream ในหลายๆ Bitrate โดยอัตโนมัติ แต่ถ้าเราต้องการเพิ่ม Bitrate แบบกำหนดเองก็สามารถกดปุ่ม + เพิ่มได้ ส่วนตรง Output Mode ให้เลือกเป็น IIS Smooth Streaming กำหนดตำแหน่ง Output ให้เรียบร้อยแล้วกด Encode แล้วก็รอไปเลยครับ&lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_3722CC15.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_4ACFB5A9.png" width="336" height="405" /&gt;&lt;/a&gt; &lt;a href="http://coredeveloper.net/blogs/article/image_2250D395.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_21786DAB.png" width="336" height="109" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;หลังจาก Encode เสร็จแล้วก็จะได้ไฟล์ออกมาประมาณนี้ครับ&lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_7965BE8B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_0D7EDB15.png" width="193" height="221" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;จะสังเกตได้ว่า Expression Encoder 2 จะสร้าง Silverlight Player และหน้า HTML สำหรับ Preview ให้โดยอัตโนมัติ รวมทั้งไฟล์สำหรับ Bit Rate ขนาดต่างๆ จากนั้นให้ copy file ทั้งชุดนี้ไปทำเป็น Virtual Directory ใน IIS ได้เลยครับ&lt;/p&gt;  &lt;p&gt;ใน IIS Manager ถ้าเราดูที่ Smooth Streaming Presentations ก็จะแสดงไฟล์ Smooth Streaming ที่เราได้เตรียมไว้ พร้อมรายละเอียด Bit Rate ต่างๆ&lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_0CA6752B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_56554D1B.png" width="402" height="298" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_49E729F2.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_73E7281A.png" width="407" height="311" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;หลังจากนั้นก็สามารถลองเล่นดูได้เลยครับ สังเกตว่า Bit Rate จะปรับเองตามความเร็ว Internet ของผู้ใช้&lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/image_398BB239.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" src="http://coredeveloper.net/blogs/article/image_thumb_7D133D8E.png" width="729" height="618" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;เท่านี้ก็เรียบร้อยแล้วครับ นอกจากนี้ IIS Media Services 2.0 ยังสามารถให้ข้อมูลสถานะปัจจุบันขณะ Streaming เช่น Bitrate ที่ผู้ใช้กำลังโหลด หรือไม่ว่าจะเป็นการเก็บ log การใช้งาน Streaming เหมือนที่แสดงในตัวอย่าง link smooth streaming video ด้านบน สามารถลองโหลดไฟล์ Streaming หนังตัวนี้มาลองเล่นดูได้ที่ &lt;a href="http://go.microsoft.com/?linkid=9652408"&gt;Smooth Streaming Sample Content page&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/player_592A6634.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="player" border="0" alt="player" src="http://coredeveloper.net/blogs/article/player_thumb_459D0693.jpg" width="727" height="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=696" width="1" height="1"&gt;</description></item><item><title>SilverLight Quick Start: เพิ่มความน่าสนใจให้กับหน้าเว็บด้วย Silverlight (ตอนที่ 2)</title><link>http://coredeveloper.net/blogs/article/archive/2008/06/17/silverlight-quick-start-silverlight-2.aspx</link><pubDate>Tue, 17 Jun 2008 08:19:52 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:504</guid><dc:creator>นันคอม</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=504</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/06/17/silverlight-quick-start-silverlight-2.aspx#comments</comments><description>&lt;p&gt;สวัสดีครับ เหล่า Developer ทุกท่าน สำหรับบทความชุดนี้ เป็นบทความแปลจากบทความชุด Silverlight Quickstart บนเว็บไซต์ Silverlight.net ซึ่งผมได้ทำการเรียบเรียงเนื้อหา ให้เหมาะสมกับ Developer โดยเฉพาะ ซึ่งคุณสามารถนำเอาเทคนิคต่างๆ จากบทความชุดนี้ ไปใช้ในการนำเอาโปคเจค Silverlight ที่สร้างจาก Microsoft Expression Blend 2 มาใช้บนหน้าเว็บ ได้อย่างมีประสิทธิภาพมากขึ้น สำหรับบทนี้ จะเป็นการแนะนำถึงตัวไฟล์ Xaml ที่เป็นไฟล์หลักที่ Silverlight ใช้ในการกำหนดการแสดงผลต่างๆ เชิญติดตามอ่านได้เลยครับ&lt;/p&gt; &lt;h2&gt;ตอนที่ 2: สร้างไฟล์ Silverlight XAML&lt;/h2&gt; &lt;p&gt;ในตอนก่อนหน้านี้ &amp;quot;สร้าง Silverlight Project&amp;quot; คุณได้เพิ่ม Silverlight plug-in ลงไปในเพจ HTML และสร้างไฟล์ XAML ว่างๆขึ้นมา เนื้อหาในตอนนี้จะแสดงวิธีสร้างเนื้อหา Silkverlight ภายในไฟล์ XAML ของคุณ &lt;p&gt;&lt;b&gt;&lt;/b&gt; &lt;p&gt;· ขั้นตอนที่ 1: สร้าง Canvas และ namespace declarations &lt;p&gt;· ขั้นตอนที่ 2: วาดอะไรบางอย่าง &lt;p&gt;· ขั้นตอนที่ 3: ดูเนื้อหา XAML &lt;p&gt;· ขั้นตอนต่อไป &lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;1: สร้าง Canvas และ namespace declarations&lt;/b&gt; &lt;p&gt;เปิดไฟล์&amp;nbsp; myxaml.xaml&amp;nbsp; ที่คุณสร้างขึ้นมาในขั้นตอนก่อนหน้านี้ขึ้นมา&amp;nbsp; (และโครงการ Silverlight) ให้คุณสร้าง Canvas&amp;nbsp; และ Silverlight and XAML namespace declarations โดยการก็อปปี้ markup ต่อไปนี้ลงไปในไฟล์ XAML&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt; 
   &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/client/2007&amp;quot;&lt;/span&gt;
   &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;ไฟล์&amp;nbsp;&amp;nbsp; Silverlight&amp;nbsp; XAML&amp;nbsp; แต่ละไฟล์จะเริ่มต้นโดยแท็ก&amp;nbsp; &amp;lt;Canvas&amp;gt;&amp;nbsp; ที่มี&amp;nbsp; Silverlight&amp;nbsp; namespace declaration&amp;nbsp; อยู่ บวกกับ&amp;nbsp; xmlns attribute ที่ใช้กำหนด Silverlight namespace ร่วมกับ xmllns:x attribute ที่ใช้กำหนด XAML namespace
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;2: กำหนดการแสดงผล&lt;/b&gt;
&lt;p&gt;ก็อปปี้และวางโค้ดต่อไปนี้ลงไปในไฟล์ XAML โดยให้อยู่ระหว่าง แท็ก Canvas จากนั้นเซฟไฟล์&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt;
    &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt;
    &lt;span class="attr"&gt;Stroke&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Black&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;StrokeThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SlateBlue&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;ซึ่งในไฟล์ Xaml ของคุณ จะมีโค๊ดดังนี้&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt;
   &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/client/2007&amp;quot;&lt;/span&gt;
   &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Ellipse&lt;/span&gt; 
     &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;200&amp;quot;&lt;/span&gt;
     &lt;span class="attr"&gt;Stroke&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Black&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;StrokeThickness&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Fill&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SlateBlue&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;3: ดูเนื้อหา XAML&lt;/b&gt;
&lt;p&gt;ให้คุณดับเบิ้ลคลิ๊กที่ไฟล์ที่เก็บ HTML อยู่ คุณจะเห็นวงกลมสีฟ้าที่มีขอบสีดำอยู่
&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://coredeveloper.net/blogs/article/WindowsLiveWriter/289346c606e7_D2E0/image_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" border="0" alt="image" src="http://coredeveloper.net/blogs/article/WindowsLiveWriter/289346c606e7_D2E0/image_thumb.png" width="211" height="210" /&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp; &lt;p&gt;ถ้าหากคุณติดตั้ง&amp;nbsp; .NET 3.0 เอาไว้ ดับเบิ้ลคลิ๊กที่ไฟล์&amp;nbsp; XAML&amp;nbsp; จะเรียกหน้าต่าง WPF ขึ้นมา ถึงแม้ว่าไฟล์ของคุณอาจจะแสดงผลได้ แต่นี่ไม่ใช่การทำงานที่ถูกต้องของ Silverlight จุดมุ่งหมายของ Silverlight คือการแสดงผล User Interface ในลักษณะเดียวกับ WPF บนเว็บ ซึ่งโค๊ด XAML ของ Silverlight อาจจะสามารถแสดงผลได้ด้วย WPF เนื่องจากเป้นรูปแบบคำสั่งเดียวกัน
&lt;p&gt;อย่างไรก็ดี...ขอแสดงความยินดีด้วยครับ! คุณสร้าง Silverlight Project แรกของคุณเสร็จสำเร็จแล้ว!
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ตอนต่อไป&lt;/b&gt;&lt;b&gt;&lt;/b&gt;
&lt;p&gt;ในตอนต่อไป เราจะมาทำความรู้จักกับแท็ก MediaElement และการเล่นไฟล์ WMV/WMA บน Silverlight กันครับ&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=504" width="1" height="1"&gt;</description></item><item><title>SilverLight Quick Start: เพิ่มความน่าสนใจให้กับหน้าเว็บด้วย Silverlight (ตอนที่ 1)</title><link>http://coredeveloper.net/blogs/article/archive/2008/06/16/silverlight-quick-start-silverlight-1.aspx</link><pubDate>Mon, 16 Jun 2008 07:55:15 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:503</guid><dc:creator>นันคอม</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=503</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/06/16/silverlight-quick-start-silverlight-1.aspx#comments</comments><description>&lt;p&gt;สวัสดีครับ เหล่า Developer ทุกท่าน สำหรับบทความชุดนี้ เป็นบทความแปลจากบทความชุด Silverlight QuickStart บนเว็บไซต์ Silverlight.net ซึ่งผมได้ทำการเรียบเรียงเนื้อหา ให้เหมาะสมกับ Developer โดยเฉพาะ ซึ่งคุณสามารถนำเอาเทคนิคต่างๆ จากบทความชุดนี้ ไปใช้ในการนำเอาโปคเจค Silverlight ที่สร้างจาก Microsoft Expression Blend 2 มาใช้บนหน้าเว็บ ได้อย่างมีประสิทธิภาพมากขึ้น สำหรับบทความแรกในชุดนี้ จะเป็นการทำความรู้จักกับโครงสร้างและไฟล์ต่างๆ ที่จำเป็นในการแสดงผล Silverlight บนหน้าเว็บของคุณ เชิญติดตามอ่านได้เลยครับ  &lt;h2&gt;ตอนที่ 1 &lt;/h2&gt; &lt;p&gt;คุณจะสร้างสีสันให้แก่เว็บเพจของคุณด้วยการเพิ่ม Silverlight เข้าไปได้อย่างไร? โดยปกติแล้ว Silverlight Project ประกอบด้วยไฟล์ 4 ชนิด ได้แก่ไฟล์&amp;nbsp; HTML ที่ใช้เก็บ plug-in instance ของ Silverlight ไฟล์ silverlight.js ไฟล์&amp;nbsp; XAML&amp;nbsp; และไฟล์&amp;nbsp; JavaScript&amp;nbsp; ซึ่งสนับสนุนการทำงานของไฟล์ HTML หน้านี้จะอธิบายว่าคุณจะสร้าง Silverlight Project แบบง่ายๆ และเพิ่ม Silverlight Content ลงไปในไฟล์ HTML โดยเพียงแค่ 3 ขั้นตอน คู่มือนี้ประกอบด้วยเนื้อหาส่วนต่างๆ ดังนี้  &lt;p&gt;· ก่อนที่จะเริ่มต้น Silverlight Project  &lt;p&gt;· ขั้นตอนที่ 1: เพิ่มการอ้างอิงสคริปท์ลงไปในเพจ HTML  &lt;p&gt;· ขั้นตอนที่ 2: สร้าง HTML host element และบล็อกตั้งค่าเริ่มต้น  &lt;p&gt;· ขั้นตอนที่ 3: กำหนด create function ที่ตั้งค่าเริ่มต้นให้แก่ plug-in instance  &lt;p&gt;· ขั้นตอนที่ 4: สร้าง Silverlight Content File  &lt;p&gt;· สร้าง Silverlight plug-in instance หลายๆ ชุด  &lt;p&gt;&amp;nbsp; &lt;h2&gt;ก่อนที่จะเริ่มต้นทำงาน&lt;/h2&gt; &lt;p&gt;ก่อนที่คุณจะสร้างเนื้อหาของ Silverlight คุณจำเป็นต้องมีองค์ประกอบดังต่อไปนี้  &lt;p&gt;· ปลั๊กอิน&amp;nbsp; Silverlight:&amp;nbsp; ถ้าหากคุณยังไม่มี &lt;a href="http://www.microsoft.com/silverlight/resources/install.aspx"&gt;เข้าไปในลิงก์นี้&lt;/a&gt;เพื่อติดตั้งปลั๊กอิน&amp;nbsp; Silverlight ให้แก่บราวเซอร์ของคุณ  &lt;p&gt;· ไฟล์&amp;nbsp; HTML: คุณจำเป็นต้องมีไฟล์ HTML เพื่อเอาไว้แสดงเนื้อหาของ Silverlight ใช้ไฟล์ HTML ที่คุณมีอยู่แล้ว หรือ&lt;a href="http://silverlight.net/quickstarts/silverlight10/samples/SampleHTMLPage.html"&gt;ก็อปปี้ไฟล์นี้ไปใช้&lt;/a&gt;ก็ได้  &lt;p&gt;· เทกซ์อิดิเตอร์: คุณจำเป็นต้องมีเทกซ์อิดิเตอร์อาทิ Notepad เพื่อเอาไว้แก้ไขไฟล์ HTML ของคุณ  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;1: เพิ่มการอ้างอิงสคริปท์ลงไปในเพจ HTML&lt;/b&gt;  &lt;p&gt;ในขั้นตอนนี้ คุณจะเพิ่มการอ้างอิงไปในไฟล์จาวาสคริปท์ที่ชื่อ&amp;nbsp; Silverlight.js และ createSilverlight.js ให้กับเพจ&amp;nbsp;&amp;nbsp; HTML&amp;nbsp;&amp;nbsp; ของคุณ รวมทั้งสร้างองค์ประกอบที่ใช้เป็นตัวเก็บปลั๊กอิน&amp;nbsp;&amp;nbsp; Silverlight&amp;nbsp;&amp;nbsp; ด้วย ไฟล์ Silverlight.js&amp;nbsp; เป็นไฟล์ตัวช่วยจาวาสคริปท์ที่ช่วยให้สามารถเรียกดูเนื้อหาของ&amp;nbsp; Silverlight บนแพลตฟอร์มหลายชนิด จากนั้นคุณจะสร้างไฟล์ createSilverlight.js ขึ้นมาในขั้นตอนที่ 2  &lt;p&gt;ก. ก็อปปี้ไฟล์ Silverlight.js จากโฟลเดอร์ Tools ซึ่งอยู่ใน &lt;a href="http://go.microsoft.com/fwlink/?LinkID=89144&amp;amp;clcid=0x409"&gt;Silverlight 1.0 SDK&lt;/a&gt; และนำไปไว้ในโฟลเดอร์ใหม่ หรือโฟลเดอร์เดียวกับไฟล์ HTML ที่คุณต้องการใช้ Silverlight  &lt;p&gt;ข. เปิดเพจ&amp;nbsp; HTML&amp;nbsp; แล้วเพิ่ม&amp;nbsp; markup เหล่านี้ลงไปในแท็ก &amp;lt;head&amp;gt; ของไฟล์ ถ้าหากคุณยังไม่มีไฟล์ HTML ใช้อยู่ คุณสามารถ&lt;a href="http://silverlight.net/quickstarts/silverlight10/samples/SampleHTMLPage.html"&gt;เซฟไฟล์ SampleHTMLPage.html&lt;/a&gt; ที่เราเตรียมไว้ให้ ไปไว้ในโฟลเดอร์เดียวกับไฟล์ Silverlight.js ได้เช่นกัน&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Silverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;ค.สร้างไฟล์ว่างๆขึ้นมาแล้วตั้งชื่อว่า createSilverlight.js คุณจะใช้ไฟล์นี้ในขั้นตอนที่ 3 
&lt;p&gt;ง.ในเพจ&amp;nbsp; HTML (SampleHTMLPage.html) เพิ่มการอ้างอิงสคริปท์อีกชุดหนึ่งอยู่ในแท็ก &amp;lt;head&amp;gt; ในครั้งนี้กำหนด src เป็น createSilverlight.js&amp;nbsp; &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;createSilverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;ในตอนนี้โค้ด HTML ของคุณควรมีโค๊ดในลักษณะนี้&amp;nbsp; &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xml:lang&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;A Sample HTML page&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Silverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &amp;lt;script type=&lt;span class="str"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; src=&lt;span class="str"&gt;&amp;quot;createSilverlight.js&amp;quot;&lt;/span&gt;&amp;gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;2: สร้าง HTML host element และบล็อกตั้งค่าเริ่มต้น&lt;/b&gt; 
&lt;p&gt;ก. สร้าง&amp;nbsp; แท็ก HTML&amp;nbsp; element&amp;nbsp; โดยการเพิ่มโค้ด&amp;nbsp; 3&amp;nbsp; บรรทัดนี้ลงไปในไฟล์&amp;nbsp; HTML ของคุณ โดยอยู่ระหว่างแท็ก &amp;lt;body&amp;gt; ตรงจุดที่คุณต้องการให้เนื้อหาของ Silverlight ปรากฏขึ้นมา&amp;nbsp; &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;&amp;lt;!-- Where the Silverlight plug-in will go--&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mySilverlightPluginHost&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;คุณสามารถเปลี่ยนแปลง&amp;nbsp; ID ของ &amp;lt;div&amp;gt; tag ได้ตามความพอใจ ถ้าหากคุณต้องการสร้าง Silverlight plug-in&amp;nbsp; instance&amp;nbsp; หลายๆชุดในเพจเดียวกัน ให้คุณทำขั้นตอนนี้ซ้ำอีกครั้งสำหรับ plug-in instance แต่ละชุด และตรวจสอบให้แน่ใจว่า ID ไม่ซ้ำกัน 
&lt;p&gt;ข. สร้างบล็อกตั้งค่าเริ่มต้น:&amp;nbsp; หลังจากเริ่ม HTML ลงไปในขั้นตอนก่อนหน้านี้ ให้คุณเพิ่ม HTML และสคริปท์ต่อไปนี้ลงไป&amp;nbsp; &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        
        
        &lt;span class="rem"&gt;// Retrieve the div element you created in the previous step.&lt;/span&gt;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; parentElement = 
            document.getElementById(&lt;span class="str"&gt;&amp;quot;mySilverlightPluginHost&amp;quot;&lt;/span&gt;);
        
        &lt;span class="rem"&gt;// This function creates the Silverlight plug-in.&lt;/span&gt;
        createMySilverlightPlugin();
        
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;ถ้าหากคุณสร้าง&amp;nbsp; Silverlight&amp;nbsp; plug-in instance หลายชุดในเพจเดียวกันให้คุณทำขั้นตอนนี้ซ้ำสำหรับ plug-in&amp;nbsp; instance&amp;nbsp; แต่ละชุด ตรวจสอบให้แน่ใจว่าชื่อ create function ไม่ซ้ำกัน หรือคุณอาจใช้ฟังก์ชันที่รับพารามิเตอร์ที่คุณกำหนดให้ใช้ได้กับ&amp;nbsp; ID ตัวใดตัวหนึ่งโดยเฉพาะก็ได้ ตรวจสอบให้แน่ใจว่าสคริปท์บล็อกแต่ละชุดสอดคล้องกับ DIV ที่คุณสร้างขึ้นมาในตอนก่อนหน้านี้ 
&lt;p&gt;ตอนนี้จบขั้นตอนที่สองแล้ว ไฟล์ HTML ของคุณควรนี้มีโค๊ดดังต่อไปนี้ &lt;/p&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xml:lang&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;A Sample HTML page&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;    &amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Silverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;    &amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;createSilverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;  &amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;lt;!-- Where the Silverlight plug-in will go--&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mySilverlightPluginHost&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        
        
        &lt;span class="rem"&gt;// Retrieve the div element you created in the previous step.&lt;/span&gt;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; parentElement = 
            document.getElementById(&lt;span class="str"&gt;&amp;quot;mySilverlightPluginHost&amp;quot;&lt;/span&gt;);
        
        &lt;span class="rem"&gt;// This function creates the Silverlight plug-in.&lt;/span&gt;
        createMySilverlightPlugin();
        
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;3: กำหนด create function ที่ตั้งค่าเริ่มต้นให้แก่ plug-in instance&lt;/b&gt; 
&lt;p&gt;เปิดไฟล์ createSilverlight.js ที่คุณสร้างในขั้นตอนที่ 1 ขึ้นมาแล้วเพิ่มฟังก์ชัน JavaScript เหล่านี้ลงไป &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; createMySilverlightPlugin()
{  
    Silverlight.createObject(
        &lt;span class="str"&gt;&amp;quot;myxaml.xaml&amp;quot;&lt;/span&gt;,                  &lt;span class="rem"&gt;// Source property value.&lt;/span&gt;
        parentElement,                  &lt;span class="rem"&gt;// DOM reference to hosting DIV tag.&lt;/span&gt;
        &lt;span class="str"&gt;&amp;quot;mySilverlightPlugin&amp;quot;&lt;/span&gt;,         &lt;span class="rem"&gt;// Unique plug-in ID value.&lt;/span&gt;
        {                               &lt;span class="rem"&gt;// Per-instance properties.&lt;/span&gt;
            width:&lt;span class="str"&gt;&amp;#39;300&amp;#39;&lt;/span&gt;,                &lt;span class="rem"&gt;// Width of rectangular region of &lt;/span&gt;
                                        &lt;span class="rem"&gt;// plug-in area in pixels.&lt;/span&gt;
            height:&lt;span class="str"&gt;&amp;#39;300&amp;#39;&lt;/span&gt;,               &lt;span class="rem"&gt;// Height of rectangular region of &lt;/span&gt;
                                        &lt;span class="rem"&gt;// plug-in area in pixels.&lt;/span&gt;
            inplaceInstallPrompt:&lt;span class="kwrd"&gt;false&lt;/span&gt;, &lt;span class="rem"&gt;// Determines whether to display &lt;/span&gt;
                                        &lt;span class="rem"&gt;// in-place install prompt if &lt;/span&gt;
                                        &lt;span class="rem"&gt;// invalid version detected.&lt;/span&gt;
            background:&lt;span class="str"&gt;&amp;#39;#D6D6D6&amp;#39;&lt;/span&gt;,       &lt;span class="rem"&gt;// Background color of plug-in.&lt;/span&gt;
            isWindowless:&lt;span class="str"&gt;&amp;#39;false&amp;#39;&lt;/span&gt;,       &lt;span class="rem"&gt;// Determines whether to display plug-in &lt;/span&gt;
                                        &lt;span class="rem"&gt;// in Windowless mode.&lt;/span&gt;
            framerate:&lt;span class="str"&gt;&amp;#39;24&amp;#39;&lt;/span&gt;,             &lt;span class="rem"&gt;// MaxFrameRate property value.&lt;/span&gt;
            version:&lt;span class="str"&gt;&amp;#39;1.0&amp;#39;&lt;/span&gt;               &lt;span class="rem"&gt;// Silverlight version to use.&lt;/span&gt;
        },
        {
            onError:&lt;span class="kwrd"&gt;null&lt;/span&gt;,               &lt;span class="rem"&gt;// OnError property value -- &lt;/span&gt;
                                        &lt;span class="rem"&gt;// event handler function name.&lt;/span&gt;
            onLoad:&lt;span class="kwrd"&gt;null&lt;/span&gt;                 &lt;span class="rem"&gt;// OnLoad property value -- &lt;/span&gt;
                                        &lt;span class="rem"&gt;// event handler function name.&lt;/span&gt;
        },
        &lt;span class="kwrd"&gt;null&lt;/span&gt;);                          &lt;span class="rem"&gt;// Context value -- event handler function name.&lt;/span&gt;
}
&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;ฟังก์ชั่นนี้มีพารามิเตอร์หลายิย่างที่น่าสนใจ เช่น การปรับแต่งความสูงและความกว้างของปลั๊กอิน&amp;nbsp; (กำหนดเป็นเปอร์เซ็นต์ได้)&amp;nbsp; ชื่อของไฟล์&amp;nbsp; XAML&amp;nbsp; ที่เก็บเนื้อหาของ Silverlight และค่าที่กำหนดให้การทำงานของของปลั๊กอินเป็นแบบ Windowless (ซึ่งจะทำให้คุณสามารถสร้าง Silverlight ที่มีพื้นหลังแบบโปร่งใส และผู้ใช้สามารถเห็นเนื้อหา HTML ที่อยู่ด้านหลังได้) 
&lt;p&gt;ถ้าหากคุณเพิ่ม&amp;nbsp; Silverlight&amp;nbsp; plug-in เป็นจำนวนมากลงไปในเพจเดียวกัน ให้คุณสร้างฟังก์ชันใหม่ขึ้นมาสำหรับ plug-in&amp;nbsp; instance แต่ละชุด หรือใช้ฟังก์ชั่น Silverlight.createObject โดยตรงก็ได้ ซึ่งไม่ว่าคุณเลือกวิธีการใดก็ตาม ตรวจสอบให้แน่ใจว่า คุณได้กำหนด plug-in ID ที่ไม่ซ้ำกัน (ในตัวอย่างนี้คือ mySilverlightPlugin) 
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนที่ &lt;/b&gt;&lt;b&gt;4: สร้างไฟล์เนื้อหา Silverlight ของคุณเองขึ้นมา&lt;/b&gt; 
&lt;p&gt;ก. สร้างไฟล์ว่างๆขึ้นมาชื่อ&amp;nbsp; myxaml.xaml&amp;nbsp; ในไดเรกทอรีเดียวกับไฟล์&amp;nbsp; HTML&amp;nbsp; ถ้าหากคุณปลี่ยนแปลงพารามิเตอร์ของซอร์ซไฟล์ในขั้นตอนก่อนหน้านี้ เปลี่ยนชื่อไฟล์ให้ตรงกันด้วย 
&lt;p&gt;ข. (ทำหรือไม่ก็ได้)&amp;nbsp; ถ้าหากคุณต้องการให้โครงการ&amp;nbsp; Silverlights จัดการกับเหตุการณ์ต่างๆ สร้างโค้ดตามการเปลี่ยนแปลง หรือติดต่อกับผู้ใช้แล้วละก็ คุณจำเป็นต้องใส่ไฟล์สคริปท์เพิ่มเติมลงไป ให้คุณสร้างไฟล์ JavaSvipt ที่มีสคริปท์ของคุณ จากนั้นเพิ่มการอ้างอิงไปยังไฟล์ดงกล่าวในเพจ&amp;nbsp; HTML&amp;nbsp; ของคุณ ตัวอย่างด้านล่างนี้สร้างการอ้างอิงไปยังไฟล์สคริปท์ที่ชื่อ my-scrip.js &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;my-script.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;ไฟล์ HTML ของคุณควรมีองค์ประกอบดังต่อไปนี้&amp;nbsp; &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;PUBLIC&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt; &lt;span class="attr"&gt;xmlns&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xml:lang&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;A Sample HTML page&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;    &amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Silverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;createSilverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;    &amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;createSilverlight.js&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="rem"&gt;&amp;lt;!-- Where the Silverlight plug-in will go--&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;mySilverlightPluginHost&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
        
        
        &lt;span class="rem"&gt;// Retrieve the div element you created in the previous step.&lt;/span&gt;
        &lt;span class="kwrd"&gt;var&lt;/span&gt; parentElement = document.getElementById(&lt;span class="str"&gt;&amp;quot;mySilverlightPluginHost&amp;quot;&lt;/span&gt;);
        createMySilverlightPlugin();
        
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;script&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;body&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;html&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;style&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;h2&gt;สร้าง Silverlight plug-in instance หลายๆชุด&lt;/h2&gt;
&lt;p&gt;ถ้าหากคุณต้องการสร้าง Silverlight plug-in มากกว่าหนึ่งชุดในเพจของคุณให้ทำขั้นตอนที่ 2, 3, 4 ซ้ำอีก สำหรับแต่ละ instance 
&lt;p&gt;· host &amp;lt;div&amp;gt; tag แต่ละชุด (ที่สร้างขึ้นในขั้นตอนที่ 2 ก.) ต้องที่ ID ที่ไม่ซ้ำกัน 
&lt;p&gt;· บล็อกตั้งค่าเริ่มต้น&amp;nbsp; (ที่สร้างในขั้นตอนที่ 2 ข.)ต้องสอดคล้องกับ &amp;lt;div&amp;gt; tag ที่คุณสร้างขึ้นในขั้นตอนก่อนหน้านี้ (2 ก.) 
&lt;p&gt;· plug-in ID parameter ต้องไม่ซ้ำกัน 
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&amp;nbsp; &lt;p&gt;&lt;b&gt;ขั้นตอนต่อไป&lt;/b&gt;&lt;b&gt;&lt;/b&gt; 
&lt;p&gt;ในส่วนต่อไป หัวข้อ &amp;quot;สร้างไฟล์ XAML&amp;quot; คุณจะได้ลองวิธีการเพิ่มเนื้อหาลงไปในไฟล์ XMAL&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=503" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/asp.net/default.aspx">asp.net</category></item><item><title>Personal Web Site Starter Kit </title><link>http://coredeveloper.net/blogs/article/archive/2008/05/07/personal-web-site-starter-kit.aspx</link><pubDate>Wed, 07 May 2008 09:50:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:131</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=131</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/05/07/personal-web-site-starter-kit.aspx#comments</comments><description>&lt;div class="set_relative"&gt;
&lt;p class="style1"&gt;&lt;strong&gt;Personal Web Site Starter Kit&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_content"&gt;Personal Web Site starter kit เวปไซค์ส่วนตัวที่จะเป็นหน้าที่เก็บข้อมูลส่วนตัว ไม่ว่าจะเป็น Resume online เพื่อที่จะให้ผู้อื่นได้แวะเข้ามาดู หรือรูปภาพส่วนตัวที่สามารถจะเปิดให้ใครๆ ก็ดูได้ หรือจะกำหนดให้เฉพาะเพื่อนๆเราเท่านั้นที่ดูก็ได้ ซึ่งแน่นอนว่าเพื่อนๆ ที่เราอยากให้เห็นรูปส่วนตัว สามารถมาลงทะเบียนสมัครเป็นสมาชิกของเวปไซค์ส่วนตัวของได้อีกด้วย&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;Live Sample&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_content"&gt;ลองใช้งานตัวอย่างเว&lt;span&gt;บ&lt;/span&gt; Personal Web Site ได้ที่ &lt;a href="http://starterkits.asp.net/PersonalWebsite/Default.aspx"&gt;http://starterkits.asp.net/PersonalWebsite/Default.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;ดาวโหลดและใช้งานฟรี Personal Web Site Starter Kit ได้ที่นี่ &lt;a href="http://go.microsoft.com/fwlink/?LinkId=46243"&gt;http://go.microsoft.com/fwlink/?LinkId=46243&lt;/a&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;ดาวโหลดและใช้งานฟรี เครื่องมือสำหรับการพัฒนา แก้ไข Personal Web Site &lt;a href="http://msdn.microsoft.com/vstudio/express/web/"&gt;http://msdn.microsoft.com/vstudio/express/web/&lt;/a&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;ข้อมูลเพิ่มเติม ทางเทคนิคในการ ใช้งาน พัฒนา และแก้ไข Personal Web Site&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;Introduction to Personal Web Site Starter Kit &lt;a href="http://msdn2.microsoft.com/en-us/library/ms972963.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/ms972963.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;Extending the Personal Web Site Starter Kit &lt;a href="http://msdn2.microsoft.com/en-us/library/aa479336.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/aa479336.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;วิธีการติดตั้ง Personal Web Site Starter Kit ไว้ที่เว&lt;span&gt;บ&lt;/span&gt;โฮสติ้ง&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_content"&gt;เมื่อได้ Personal Web Site Starter Kit และได้แก้ไขตามที่ต้องการพร้อมที่จะใช้งานแล้ว ก็ถึงขั้นตอนการติดตั้ง Personal Web Site Starter Kit ลงใน web server ที่มี ข้อมูลที่จะต้องทราบคือ FTP Address ของ server ที่จะใช้ และ user name และ password สำหรับ FTP Address หลังจากนั้น เริ่มตามขั้นตอนดังต่อไปนี้&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใช้ Visual Studio Express Web Development Edition เปิด solution ของ Personal Web Site ที่ต้องการจะติดตั้ง&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Website&lt;/strong&gt;’ เมนู ให้เลือก ‘&lt;strong&gt;Copy Web Site&lt;/strong&gt;’ ซึ่งจะแสดงให้เห็นไฟล์ source web site&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Connections&lt;/strong&gt;’ list เลือก ‘&lt;strong&gt;Connect to..&lt;/strong&gt;’&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Open Web Site&lt;/strong&gt;’ dialog box ให้เลือก ‘&lt;strong&gt;FTP Site&lt;/strong&gt;’ tab&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;พิมพ์ FTP Address ของ server ที่จะติดตั้ง และ user name/password ที่ได้จาก hosting site ซึ่ง FTP Address ปรกติจะอยู่ในรูปแบบของ &lt;strong&gt;ftp://ftp.servername.domain/foldername&lt;/strong&gt; เช่น &lt;strong&gt;ftp://ftp.ThaiPlayground.net &lt;/strong&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก ‘&lt;strong&gt;Open&lt;/strong&gt;’ ซึ่งจะแสดงไฟล์ที่อยู่ใน web server ในข้อ 5 &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Source Web site&lt;/strong&gt;’ ในข้อ 2. ให้เลือก ทุกไฟล์&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;กดปุ่ม ‘&lt;strong&gt;Copy selected files from source to remote web site&lt;/strong&gt;’&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;เพียงเท่านี้ก็จะเสร็จสิ้นการติดตั้ง Personal Web Site Starter Kit และพร้อมที่จะใช้งานจาก server ที่ต้องการ &lt;/p&gt;
&lt;p class="_content"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;ตัวอย่างวิธีการเปลี่ยนแปลงเนื้อหาใน Club Web Site Starter Kit&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;คลิ้กขวาเลือกไฟล์ Default.master ใน Solution Explorer&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก View Designer จากเมนู และจะเห็นหน้าของ Default.master ซึ่งหน้าเวบทุกหน้าจะใช้โครงสร้างเวบตามหน้านี้ทั้งหมด&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือกส่วนที่ต้องการจะแก้ไข เช่นการเปลี่ยนชื่อเวบไซต์ สามารถทำได้โดยการใช้เม้าส์เลือกข้อความและพิมพ์ข้อความใหม่ที่เป็นภาษาไทยลงไปแทน&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/PersonalWebSite.png" width="500" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=131" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/for-developer/default.aspx">for-developer</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/for-student/default.aspx">for-student</category></item><item><title>Club Site Starter Kit </title><link>http://coredeveloper.net/blogs/article/archive/2008/05/07/club-site-starter-kit.aspx</link><pubDate>Wed, 07 May 2008 09:47:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:130</guid><dc:creator>admin</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=130</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/05/07/club-site-starter-kit.aspx#comments</comments><description>&lt;div class="set_relative"&gt;
&lt;p class="style1"&gt;&lt;strong&gt;Club Web Site Starter Kit&lt;/strong&gt;&lt;/p&gt;
&lt;p class="style3"&gt;&lt;font size="2"&gt;&lt;span class="style4"&gt;Club Web Site starter kit เป็น เวปไซค์สำหรับแฟนคลับต่างๆ ซึ่งสามารถใช้การโพสท์ข่าวสาร ประกาศต่างๆ ปฏิทินกิจกรรม ระบบสมาชิก และอัลบัมรูปภาพ ที่จะใช้แบ่งปันภาพกิจกรรมต่างๆ ระหว่างสมาชิกได้&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;Live Sample&lt;/strong&gt;&lt;/p&gt;
&lt;p class="style3"&gt;&lt;span class="style4"&gt;&lt;font size="2"&gt;ลองใช้งานตัวอย่างเวป Club Web Site ได้ที่ &lt;/font&gt;&lt;/span&gt;&lt;a href="http://starterkits.asp.net/Club/default.aspx" target="_blank"&gt;http://starterkits.asp.net/Club/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;ดาวโหลดและใช้งานฟรี Club Web Site Starter Kit ได้ที่นี่ &lt;a href="http://go.microsoft.com/fwlink/?LinkId=46244" target="_blank"&gt;http://go.microsoft.com/fwlink/?LinkId=46244&lt;/a&gt; &lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;Free License Visual Studio 2005 ดาวโหลดและใช้งานฟรี เครื่องมือสำหรับการพัฒนา แก้ไข Club Web Site &lt;a href="http://msdn.microsoft.com/vstudio/express/web/" target="_blank"&gt;http://msdn.microsoft.com/vstudio/express/web/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;ข้อมูลเพิ่มเติม ทางเทคนิคในการ ใช้งาน พัฒนา และแก้ไข Club Web Site&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;MSDN Club Web Site Starter Kit &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa718639.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/vstudio/aa718639.aspx &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;Introduction to Club Web Site Starter Kit &lt;a href="http://msdn2.microsoft.com/en-us/library/aa479303.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/aa479303.aspx &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;Extending the Club Web Site Starter Kit &lt;a href="http://msdn2.microsoft.com/en-us/library/aa479335.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/aa479335.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;วิธีการติดตั้ง Club Web Site ไว้ที่เว&lt;span&gt;บ&lt;/span&gt;โฮสติ้ง&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="style3"&gt;&lt;font size="2"&gt;&lt;span class="style4"&gt;เมื่อได้ Club Web Site Starter Kit และได้แก้ไขตามที่ต้องการพร้อมที่จะใช้งานแล้ว ก็ถึงขั้นตอนการติดตั้ง Club Web Site Starter Kit ลงใน web server ที่มี ข้อมูลที่จะต้องทราบคือ FTP Address ของ server ที่จะใช้ และ user name และ password สำหรับ FTP Address หลังจากนั้น เริ่มตามขั้นตอนดังต่อไปนี้&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใช้ Visual Studio Express Web Development Edition เปิด solution ของ Club Web Site ที่ต้องการจะติดตั้ง&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Website&lt;/strong&gt;’ เมนู ให้เลือก ‘&lt;strong&gt;Copy Web Site&lt;/strong&gt;’ ซึ่งจะแสดงให้เห็นไฟล์ source web site&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Connections&lt;/strong&gt;’ list เลือก ‘&lt;strong&gt;Connect to..&lt;/strong&gt;’&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Open Web Site&lt;/strong&gt;’ dialog box ให้เลือก ‘&lt;strong&gt;FTP Site&lt;/strong&gt;’ tab&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;พิมพ์ FTP Address ของ server ที่จะติดตั้ง และ user name/password ที่ได้จาก hosting site ซึ่ง FTP Address ปรกติจะอยู่ในรูปแบบของ &lt;strong&gt;ftp://ftp.servername.domain/foldername&lt;/strong&gt; เช่น &lt;strong&gt;ftp://ftp.ThaiPlayground.net/MyFolder&lt;/strong&gt; เป็นต้น&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก ‘&lt;strong&gt;Open&lt;/strong&gt;’ ซึ่งจะแสดงไฟล์ที่อยู่ใน web server ในข้อ 5 &lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Source Web site&lt;/strong&gt;’ ในข้อ 2. ให้เลือก ทุกไฟล์&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;กดปุ่ม ‘&lt;strong&gt;Copy selected files from source to remote web site&lt;/strong&gt;’&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;เพียงเท่านี้ก็จะเสร็จสิ้นการติดตั้ง Club Web Site Starter Kit และพร้อมที่จะใช้งานจาก server ที่ต้องการ&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;ตัวอย่างวิธีการเปลี่ยนแปลงเนื้อหาใน Club Web Site Starter Kit&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;คลิ้กขวาเลือกไฟล์ Default.master ใน Solution Explorer&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก View Designer จากเมนู และจะเห็นหน้าของ Default.master ซึ่งหน้าเวบทุกหน้าจะใช้โครงสร้างเวบตามหน้านี้ทั้งหมด&lt;br /&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือกส่วนที่ต้องการจะแก้ไข เช่นการเปลี่ยนชื่อเวบไซต์ สามารถทำได้โดยการใช้เม้าส์เลือกข้อความและพิมพ์ข้อความใหม่ที่เป็นภาษาไทยลงไปแทน&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/ClubSite.png" width="300" alt="" /&gt;&amp;nbsp; &lt;/p&gt;&lt;/div&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=130" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/for-developer/default.aspx">for-developer</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/for-student/default.aspx">for-student</category></item><item><title>Time Tracker Starter Kit</title><link>http://coredeveloper.net/blogs/article/archive/2008/05/06/time-tracker-starter-kit.aspx</link><pubDate>Tue, 06 May 2008 09:58:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:132</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=132</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/05/06/time-tracker-starter-kit.aspx#comments</comments><description>&lt;div class="set_relative"&gt;
&lt;p class="style1"&gt;&lt;strong&gt;Time Tracker Starter Kit&lt;/strong&gt; 
&lt;p class="_content"&gt;Time Tracker starter kit เป็นเวปแอพริเคชั่นสำหรับ การเก็บข้อมูลชั่วโมงการทำงานในแต่ละโครงการของผู้ร่วมโครงการ และยังสามารถดูรายงานสถานะการทำงานปัจจุบัน หรือรายงานการใช้เวลาทำงานในแต่ละส่วนได้อีกด้วย&lt;br /&gt;
&lt;p class="style2"&gt;&lt;strong&gt;Download &lt;/strong&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;ดาวโหลดและใช้งานฟรี Time Tracker Starter Kit ได้ที่นี่ &lt;a href="http://go.microsoft.com/fwlink/?LinkId=46245" target="_blank"&gt;http://go.microsoft.com/fwlink/?LinkId=46245 &lt;/a&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;ดาวโหลดและใช้งานฟรี เครื่องมือสำหรับการพัฒนา แก้ไข Time Tracker &lt;a href="http://msdn.microsoft.com/vstudio/express/web/" target="_blank"&gt;http://msdn.microsoft.com/vstudio/express/web/ &lt;/a&gt;
&lt;p class="_bullet_list"&gt;&lt;strong&gt;&lt;/strong&gt;
&lt;p class="style2"&gt;&lt;strong&gt;วิธีการติดตั้ง Time Tracker ไว้ที่เวปโฮสติ้งง&lt;/strong&gt; 
&lt;p class="_content"&gt;เมื่อได้ Time Tracker Starter Kit และได้แก้ไขตามที่ต้องการพร้อมที่จะใช้งานแล้ว ก็ถึงขั้นตอนการติดตั้ง Time Tracker Starter Kit ลงใน web server ที่มี ข้อมูลที่จะต้องทราบคือ FTP Address ของ server ที่จะใช้ และ user name และ password สำหรับ FTP Address หลังจากนั้น เริ่มตามขั้นตอนดังต่อไปนี้ 
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใช้ Visual Studio Express Web Development Edition เปิด solution ของ Time Tracker ที่ต้องการจะติดตั้ง &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Website&lt;/strong&gt;’ เมนู ให้เลือก ‘&lt;strong&gt;Copy Web Site&lt;/strong&gt;’ ซึ่งจะแสดงให้เห็นไฟล์ source web site &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Connections&lt;/strong&gt;’ list เลือก ‘&lt;strong&gt;Connect to..&lt;/strong&gt;’ &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Open Web Site&lt;/strong&gt;’ dialog box ให้เลือก ‘&lt;strong&gt;FTP Site&lt;/strong&gt;’ tab &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;พิมพ์ FTP Address ของ server ที่จะติดตั้ง และ user name/password ที่ได้จาก hosting site ซึ่ง FTP Address ปรกติจะอยู่ในรูปแบบของ &lt;strong&gt;ftp://ftp.servername.domain/foldername&lt;/strong&gt; เช่น &lt;strong&gt;ftp://ftp.ThaiPlayground.net &lt;/strong&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก ‘&lt;strong&gt;Open&lt;/strong&gt;’ ซึ่งจะแสดงไฟล์ที่อยู่ใน web server ในข้อ 5 &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Source Web site&lt;/strong&gt;’ ในข้อ 2. ให้เลือก ทุกไฟล์ &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;กดปุ่ม ‘&lt;strong&gt;Copy selected files from source to remote web site&lt;/strong&gt;’ &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;เพียงเท่านี้ก็จะเสร็จสิ้นการติดตั้ง Time Tracker Starter Kit และพร้อมที่จะใช้งานจาก server ที่ต้องการ 
&lt;p class="style2"&gt;&lt;strong&gt;ตัวอย่างวิธีการเปลี่ยนแปลงเนื้อหาใน Time Tracker Starter Kit&lt;/strong&gt; 
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;คลิ้กขวาเลือกไฟล์ MasterPage.master ใน Solution Explorer&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก View Designer จากเมนู และจะเห็นหน้าของ MasterPage.master ซึ่งหน้าเวบทุกหน้าจะใช้โครงสร้างเวบตามหน้านี้ทั้งหมด&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก Logo &lt;span&gt;รูป &lt;/span&gt;&amp;#39;&lt;strong&gt;Time Tracker&lt;/strong&gt;&amp;#39; &lt;span&gt;และทำการเปลี่ยนรูป &lt;/span&gt;Logo &lt;span&gt;ตามต้องการโดยเปลี่ยนจาก &lt;/span&gt;properties &amp;#39;&lt;strong&gt;Src&lt;/strong&gt;&amp;#39; &lt;span&gt;ด้านขวา&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/TimeTrackerSite.png" width="500" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=132" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/for-developer/default.aspx">for-developer</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/for-student/default.aspx">for-student</category></item><item><title>Job Site Starter Kit</title><link>http://coredeveloper.net/blogs/article/archive/2008/05/05/job-site-starter-kit.aspx</link><pubDate>Mon, 05 May 2008 10:02:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:133</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=133</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/05/05/job-site-starter-kit.aspx#comments</comments><description>&lt;p class="_content"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;MARGIN:0px 10px 0px 0px;BORDER-RIGHT-WIDTH:0px;" border="0" alt="image" align="left" src="http://coredeveloper.net/blogs/article/WindowsLiveWriter/JobSiteStarterKit_13E82/image_3.png" width="320" height="113" /&gt; Job Site starter kit เป็นเวปแอพริเคชั่นสำหรับ เวปไซค์ในการจัดหางาน ซึ่งผู้ที่ต้องการหางานสามารถลงทะเบียนเป็นสมาชิกใช้เวปไซค์นี้ ในการส่ง resume และค้นหางานตามที่ต้องการได้ นอกจากนั้นผู้ที่ต้องการหาผู้ร่วมงาน สามารถที่จะลงทะเบียนเป็นสมาชิกและใส่ข้อมูลเกี่ยวกับองค์กร และประกาศรับสมัครงาน หรือค้นหา resume ของผู้ที่ต้องการร่วมงานได้อีกด้วย&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;ดาวโหลดและใช้งานฟรี Job Site Starter Kit ได้ที่นี่&lt;a href="http://www.binaryintellect.net/Products/displayproductdetails.aspx?productid=3" target="_blank"&gt; http://www.binaryintellect.net/Products/displayproductdetails.aspx?productid=3 &lt;/a&gt;&lt;/p&gt;
&lt;p class="_bullet_list"&gt;&lt;img class="bullet_padding" src="http://www.microsoft.com/thailand/msdn/articles/images/bullet_gold.gif" alt="" /&gt;Free License Visual Studio 2005 ดาวโหลดและใช้งานฟรี เครื่องมือสำหรับการพัฒนา แก้ไข Club Web Site &lt;a href="http://msdn.microsoft.com/vstudio/express/web/" target="_blank"&gt;http://msdn.microsoft.com/vstudio/express/web/&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;วิธีการติดตั้ง Job Site ไว้ที่เว&lt;span&gt;บ&lt;/span&gt;โฮสติ้ง&lt;/strong&gt;&lt;/p&gt;
&lt;p class="_content"&gt;เมื่อได้ Job Site Starter Kit และได้แก้ไขตามที่ต้องการพร้อมที่จะใช้งานแล้ว ก็ถึงขั้นตอนการติดตั้ง Job Site Starter Kit ลงใน web server ที่มี ข้อมูลที่จะต้องทราบคือ FTP Address ของ server ที่จะใช้ และ user name และ password สำหรับ FTP Address หลังจากนั้น เริ่มตามขั้นตอนดังต่อไปนี้&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใช้ Visual Studio Express Web Development Edition เปิด solution ของ Job Site ที่ต้องการจะติดตั้ง&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Website&lt;/strong&gt;’ เมนู ให้เลือก ‘&lt;strong&gt;Copy Web Site&lt;/strong&gt;’ ซึ่งจะแสดงให้เห็นไฟล์ source web site&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Connections&lt;/strong&gt;’ list เลือก ‘&lt;strong&gt;Connect to..&lt;/strong&gt;’&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Open Web Site&lt;/strong&gt;’ dialog box ให้เลือก ‘&lt;strong&gt;FTP Site&lt;/strong&gt;’ tab&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;พิมพ์ FTP Address ของ server ที่จะติดตั้ง และ user name/password ที่ได้จาก hosting site ซึ่ง FTP Address ปรกติจะอยู่ในรูปแบบของ &lt;strong&gt;ftp://ftp.servername.domain/foldername&lt;/strong&gt; เช่น &lt;strong&gt;ftp://ftp.ThaiPlayground.net/MyFolder &lt;/strong&gt;&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก ‘&lt;strong&gt;Open&lt;/strong&gt;’ ซึ่งจะแสดงไฟล์ที่อยู่ใน web server ในข้อ 5 &lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;ใน ‘&lt;strong&gt;Source Web site&lt;/strong&gt;’ ในข้อ 2. ให้เลือก ทุกไฟล์&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;กดปุ่ม ‘&lt;strong&gt;Copy selected files from source to remote web site’&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;เพียงเท่านี้ก็จะเสร็จสิ้นการติดตั้ง Job Site Starter Kit และพร้อมที่จะใช้งานจาก server ที่ต้องการ&lt;/p&gt;
&lt;p class="_content"&gt;&lt;a href="http://coredeveloper.net/blogs/article/WindowsLiveWriter/JobSiteStarterKit_13E82/TimeTrackerSite_4.png"&gt;&lt;img style="BORDER-TOP-WIDTH:0px;BORDER-LEFT-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-RIGHT-WIDTH:0px;" border="0" alt="TimeTrackerSite" src="http://coredeveloper.net/blogs/article/WindowsLiveWriter/JobSiteStarterKit_13E82/TimeTrackerSite_thumb_1.png" width="700" height="495" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="style2"&gt;&lt;strong&gt;ตัวอย่างวิธีการเปลี่ยนแปลงเนื้อหาใน Job Site Starter Kit&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p class="_content"&gt;คลิ้กขวาเลือกไฟล์ Default.master ใน Solution Explorer&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก View Designer จากเมนู และจะเห็นหน้าของ Default.master ซึ่งหน้าเวบทุกหน้าจะใช้โครงสร้างเวบตามหน้านี้ทั้งหมด&lt;/p&gt;
&lt;li&gt;
&lt;p class="_content"&gt;เลือก Logo &lt;span&gt;รูป &lt;/span&gt;&amp;#39;&lt;strong&gt;Jobs Site Starter Kit&lt;/strong&gt;&amp;#39; &lt;span&gt;และทำการเปลี่ยนรูป &lt;/span&gt;Logo &lt;span&gt;ตามต้องการโดยเปลี่ยนจาก &lt;/span&gt;properties &amp;#39;&lt;strong&gt;ImageUrl&lt;/strong&gt;&amp;#39; &lt;span&gt;ด้านขวา&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p class="_content"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="_content"&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=133" width="1" height="1"&gt;</description></item><item><title>Uploading Files Using the File Field Control</title><link>http://coredeveloper.net/blogs/article/archive/2008/04/08/uploading-files-using-the-file-field-control.aspx</link><pubDate>Tue, 08 Apr 2008 11:44:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:60</guid><dc:creator>admin</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=60</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/04/08/uploading-files-using-the-file-field-control.aspx#comments</comments><description>&lt;p&gt;ใช้ได้กับ 
&lt;ul&gt;
&lt;li&gt;Microsoft ASP.NET &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;สรุป:&lt;/strong&gt; 
&lt;p&gt;เรียนรู้วิธีการใช้คอนโทรล File Field ของ Microsoft ASP.NET เพื่อช่วยให้ผู้ใช้อัพโหลดไฟล์ตั้งแต่หนึ่งไฟล์ไปไว้ในเซิร์ฟเวอร์&lt;/p&gt;&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;คำนำ&lt;/strong&gt; 
&lt;p&gt;Web&amp;nbsp; Forms&amp;nbsp; ของ Microsoft ASP.NET เกี่ยวข้องกับการสื่อสารกับผู้ใช้เพื่อดึงข้อมูลที่ต้องการมาจากผู้ใช้เหล่านี้โดยใช้เซอร์วิส ถ้าหากพูดถึง&amp;nbsp; Web Forms ส่วนมากแล้ว การกรอกและจัดเก็บข้อมูลที่เป็นข้อความมักทำได้ง่ายมาก อย่างไรก็ตามมีอีกหลายกรณีที่คุณไม่ได้ต้องการแค่ข้อมูลแบบง่ายๆเท่านั้น คุณอาจต้องการให้ผู้ใช้อัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ด้วย 
&lt;p&gt;ตัวอย่างเช่น แอพพลิเคชันของคุณอาจมีไลบราลีเอกสารที่ผู้ใช้ทุกคนสามารถใช้ร่วมกันได้ แม้จะมีตัวอย่างมากมายก็ตาม แต่สิ่งที่ไม่มีการเปลี่ยนแปลงก็คือคุณคงต้องการความสามารถที่จะอัพโหลดเอกสารประเภทใดก็ได้ไปจัดเก็บเอาไว้ หรืออยากให้แอพพลิเคชันจัดการกับเอกสารหลังจากที่อัพโหลดไปแล้วด้วย 
&lt;p&gt;ไม่ว่าจะเป็นกรณีใดก็ตาม&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp; จะช่วยให้คุณมีความสามารถง่ายๆที่จะอัพโหลดเอกสารไปเก็บเอาไว้ในเซิร์ฟเวอร์ได้ โดยที่คุณต้องลงมือทำงานบางอย่างเพียงเล็กน้อยเท่านั้นเอง บทความนี้จะอธิบายวิธีการใช้คอนโทรล File Field เพื่ออัพโหลดเอสการไปไว้ในเว็บเซิร์ฟเวอร์&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ศึกษาคอนโทรล File Field อย่างละเอียด&lt;/strong&gt; 
&lt;p&gt;คอนโทรล&amp;nbsp; File Field พึ่งพาคลาส HtmlInputFile เป็นหลัก โดยที่ File Field ถือเป็นคอนโทรลชั้นยอดตัวหนึ่งเนื่องจากก่อนหน้าที่จะมี&amp;nbsp; ASP.NET งานเหล่านี้เป็นงานที่ยุ่งยากอย่างมาก (คุณต้องซื้อคอมโพเน้นต์จากบริษัทอื่นๆมาทำงานนี้แทน) แต่คอนโทรล File Field สามารถอัพโหลดไฟล์จากไคล์เอ็นต์ไปยังเซิร์ฟเวอร์ได้ 
&lt;p&gt;สิ่งสำคัญที่ต้องแจ้งให้ทราบก่อนก็คือคอนโทรลตัวนี้มีชื่อว่า&amp;nbsp; File&amp;nbsp; Field ใน Microsoft Visual Studio .NET ทุกเวอร์ชัน แต่ถ้าหากอยู่ใน&amp;nbsp; ASP.NET&amp;nbsp; Web&amp;nbsp; Matrix&amp;nbsp; แล้วคอนโทรลตัวนี้จะใช้ชื่อว่า&amp;nbsp; FileUpload ซึ่งในทั้งสองกรณีคุณจะเจอคอนโทรลตัวนี้อยู่ในหัวข้อ HTML ของ Toolbox 
&lt;p&gt;คอนโทรล&amp;nbsp; File&amp;nbsp; Field&amp;nbsp; ยอมให้มีการเรียกใช้โปรแกรมใน&amp;nbsp; HTML &amp;lt;input type = &amp;quot;file&amp;gt; tag ได้ โดยที่ tag&amp;nbsp; ตัวนี้มักใช้ทำงานกับข้อมูลไฟล์ที่อยู่ภายในฟอร์ม&amp;nbsp; HTML เป็นหลัก ในอดีตถ้าหากคุณใช้ ASP รุ่นเก่า (ASP 3.0 หรือรุ่นก่อนหน้านั้)&amp;nbsp; โปรแกรมมักต้องใช้คอมโพเน้นต์ของบริษัทซอฟต์แวร์อื่นๆ เพื่ออัพโหลดไฟล์จากไคล์เอ็นต์ไปยังเซิร์ฟเวอร์ แต่ในปัจจุบัน .NET และคอนโทรลตัวใหม่จะมาช่วยจัดการกับการอัพโหลดให้คุณเอง ซึ่งงานของคุณไม่มีทางที่จะง่ายดายไปกว่านี้อีกแล้ว ตัวอย่างโค้ดที่&amp;nbsp; 1 แสดงวิธีการใช้คอนโทรล File Field เพื่ออัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ 
&lt;p&gt;ตัวอย่างโค้ด 1 การอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์โดยใช้คอนโทรล File Field 
&lt;p&gt;VB.NET&lt;br /&gt;&lt;pre&gt;&amp;lt;%@ Page Language=&amp;quot;VB&amp;quot; %&amp;gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;

    Sub SubmitButton_Click(Source As Object, e As EventArgs)
       If Not (File1.PostedFile Is Nothing) Then
          Try
             File1.PostedFile.SaveAs(&amp;quot;C:\Uploads\uploadedfile.txt&amp;quot;)
             Span1.InnerHtml = &amp;quot;Upload Successful!&amp;quot;
          Catch ex As Exception
             Span1.InnerHtml = &amp;quot;Error saving file &amp;lt;b&amp;gt;C:\\&amp;quot; &amp;amp; _
                File1.Value &amp;amp; &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot; &amp;amp; ex.ToString()
          End Try
       End If
    End Sub

&amp;lt;/script&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form runat=&amp;quot;server&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;
        Select a file to upload:&amp;lt;br /&amp;gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;File1&amp;quot; runat=&amp;quot;Server&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;Submit1&amp;quot; runat=&amp;quot;Server&amp;quot; 
         value=&amp;quot;Upload File&amp;quot; OnServerClick=&amp;quot;SubmitButton_Click&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
        &amp;lt;span id=&amp;quot;Span1&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;pre&gt;C#&lt;/pre&gt;&lt;pre&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;

    void SubmitButton_Click(Object sender, EventArgs e) {
       if (File1.PostedFile != null) {
          try {
             File1.PostedFile.SaveAs(&amp;quot;C:\\Uploads\\uploadedfile.txt&amp;quot;);
             Span1.InnerHtml = &amp;quot;Upload Successful!&amp;quot;;
          }
          catch (Exception ex) {
             Span1.InnerHtml = &amp;quot;Error saving file &amp;lt;b&amp;gt;C:\\&amp;quot; +
                File1.Value + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot; + ex.ToString();
          }
       }
    } 

&amp;lt;/script&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form runat=&amp;quot;server&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;
        Select a file to upload:&amp;lt;br /&amp;gt;
        &amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;File1&amp;quot; runat=&amp;quot;Server&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
        &amp;lt;input type=&amp;quot;submit&amp;quot; id=&amp;quot;Submit1&amp;quot; runat=&amp;quot;Server&amp;quot; 
         value=&amp;quot;Upload File&amp;quot; OnServerClick=&amp;quot;SubmitButton_Click&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
        &amp;lt;span id=&amp;quot;Span1&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;เมื่อเพจของตัวอย่างโค้ดที่&amp;nbsp; 1&amp;nbsp; เริ่มทำงาน คุณสามารถเลือกไฟล์แล้วอัพโหลดไปยังเซิร์ฟเวอร์ได้ โดยการคลิกที่ปุ่ม Upload&amp;nbsp; File ในเพจ คุณสมบัตินี้จัดเป็นคุณสมบัติชั้นยอดที่โปรแกรมเมอร์ ASP 3.0 รอคอยมานานแล้ว ในตอนนี้คุณเพียงแค่เขียนโค้ดเพียงไม่กี่บรรทัด คุณก็สามารถโหลดไฟล์ทุกชนิดไปยังเซิร์ฟเวอร์ได้โดยง่ายแล้ว 
&lt;p&gt;มีองค์ประกอบสำคัญบางอย่างในตัวอย่างนี้ที่คุณต้องทำความเข้าใจเสียก่อน เพื่อที่สิ่งต่างๆจะได้ทำงานอย่างราบรื่น เรื่องแรก ถ้าหากต้องการให้ตัวอย่างโค้ดที่ 1 ใช้งานได้ คุณต้องกำหนดให้โฟลเดอร์เป้าหมายในเซิร์ฟเวอร์บันทึกข้อมูลสำหรับบัญชีชื่อที่ใช้ ASP.NET อยู่ได้ เพื่อที่ไฟล์จะได้เซฟลงไปยังโฟลเดอร์ที่กำหนด 
&lt;p&gt;&lt;img style="MARGIN:0px 0px 0px 10px;" align="right" src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478971_aspnet-fileupload_01(en-us,MSDN_10).gif" width="368" height="455" alt="" /&gt;ถ้าหากคุณคิดว่ายังไม่ได้มีการเปิดให้บัญชีชื่อ&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp; บันทึกข้อมูลลงไปในโฟลเดอร์ที่คุณต้องการแล้วละก็ ให้คุณเรียก&amp;nbsp; Microsoft&amp;nbsp; Windows Explorer ขึ้นมา จากนั้นเข้าไปยังโฟลเดอร์ที่คุณต้องการเพิ่มสิทธิบันทึกข้อมูลลงไป ให้คุณคลิกเม้าส์ปุ่มขวาที่โฟลเดอร์&amp;nbsp; (ในตัวอย่างก็คือโฟลเดอร์&amp;nbsp; Uploads)&amp;nbsp; แล้วเลือก&amp;nbsp; Properties&amp;nbsp; เมื่อกรอบ Properties&amp;nbsp; โผล่ขึ้นมาให้คลิกที่ข้อ Security แล้วตรวจสอบให้แน่ใจว่ามี ASP.NET Machine Account อยู่ในรายการและมีสิทธิเหมาะสมที่จะบันทึกข้อมูลลงไปได้หรือยัง&lt;/p&gt;
&lt;p&gt;ถ้าหากคุณไม่เห็น&amp;nbsp; ASP.NET&amp;nbsp; Machine&amp;nbsp; Account&amp;nbsp; อยู่ในหัวข้อ Security คุณสามารถเพิ่มบัญชีชื่อดังกล่าวลงไปโดยการคลิกที่ปุ่ม&amp;nbsp; Add&amp;nbsp; แล้วกรอก&amp;nbsp; ASPNET&amp;nbsp; ลงไป (ไม่ต้องใส่จุด) ในช่องข้อความเหมือนอย่างที่แสดงเอาไว้ในภาพที่ 2 &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478971_aspnet-fileupload_02(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;คลิก&amp;nbsp; OK&amp;nbsp; เพื่อเพิ่ม ASP.NET Machine Account ลงไปในรายการ ซึ่งจากจุดนี้ตรวจสอบให้แน่ใจว่าคุณได้กำหนดสิทธิที่เหมาะสมให้แก่บัญชีชื่อนี้แล้ว จากนั้นคลิก OK คุณก็พร้อมที่จะทำงานต่อแล้ว 
&lt;p&gt;เมื่อพิจารณาโค้ดตัวอย่างที่&amp;nbsp; 1&amp;nbsp; คุณอาจสังเกตเห็นสิ่งที่มีความสำคัญบางอย่าง เรื่องแรก &amp;lt;form&amp;gt; tag ถูกแก้ไขให้มีการเพิ่ม&amp;nbsp; attribute&amp;nbsp; อีกอันหนึ่งลงไปแล้ว ถ้าหากต้องการอัพโหลดไฟล์ไปยังเซิร์ฟเวอร์แล้วละก็&amp;nbsp; &amp;lt;form&amp;gt; tag ของคุณต้องมี&amp;nbsp; attribute&amp;nbsp; เป็น enctype=&amp;quot;multipart/form-data&amp;quot; ถ้าหากไม่มี attribute ดังกล่าว เว็บฟอร์มจะไม่สามารถอัพโหลดไฟล์ได้ 
&lt;p&gt;ปุ่ม&amp;nbsp; Submit&amp;nbsp; ในเพจจะทำให้ OnServerClick event เริ่มทำงาน เหตุการณ์ดังกล่าวจะทำการอัพโหลดไฟล์แล้วแสดงข้อความที่บอกให้คุณทราบว่าการอัพโหลดประสบความสำเร็จหรือไม่ ถ้าหากไม่ประสบความสำเร็จ เพจจะแสดงข้อความอธิบายว่าทำไมการอัพโหลดถึงล้มเหลว 
&lt;p&gt;การใช้&amp;nbsp; &amp;lt;input&amp;nbsp; type = &amp;quot;file&amp;quot;&amp;gt; tag ทำให้บราวเซอร์จะใส่ปุ่ม Browse ต่อจากฟิลด์ข้อความของเพจ ASP.NET&amp;nbsp; ให้โดยอัตโนมัติ คุณไม่จำเป็นต้องเขียนโปรแกรมเพื่อทำให้องค์ประกอบดังกล่าวโผล่ขึ้นมา ถ้าหากผู้ใช้คลิกที่ปุ่ม Browse&amp;nbsp; เขาจะสามารถค้นหาไฟล์ในพีซีของตนเองเพื่ออัพโหลดไปยังเซิร์ฟเวอร์ได้ การคลิกที่ Open จะใส่ชื่อไฟล์และจุดเก็บไฟล์เอาไว้ในฟิลด์ข้อความ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478971_aspnet-fileupload_03(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;&lt;strong&gt;การทำงานกับข้อจำกัดเรื่องขนาดของไฟล์&lt;/strong&gt; 
&lt;p&gt;คุณอาจไม่ทราบมาก่อนว่าเทคนิคนี้จำกัดขนาดของไฟล์ที่จะอัพโหลดไปด้วย ซึ่งโดยปกติแล้วขนาดสูงสุดของไฟล์ที่จะอัพโหลดไปยังเซิร์ฟเวอร์โดยใช้คอนโทรล File Field ได้จะอยู่ที่ 4 MB คุณไม่สามารถอัพโหลดไฟล์ใดๆที่โตกว่านี้ได้ 
&lt;p&gt;อย่างไรก็ตามข้อดีของ .NET ก็คือโดยปกติแล้วมันได้เตรียมช่องทางที่ใช้หลีกเลี่ยงข้อจำกัดดังกล่าวเอาไว้แล้ว นั่นก็คือคุณเพียงแต่เปลี่ยนแปลงตัวแปรเริ่มต้นที่มีอยู่เท่านั้น โดยวิธีการแก้ไขข้อจำกัดดังกล่าว ให้คุณทำการแก้ไขไฟล์ machine.config หรือ web.config ก็ได้ 
&lt;p&gt;ในไฟล์ machine.config ให้ค้นหาโหนดชื่อ &amp;lt;httpRuntime&amp;gt; ที่มีหน้าตาแบบนี้ 
&lt;p&gt;&amp;lt;httpRuntime &lt;br /&gt;executionTimeout=&amp;quot;90&amp;quot; &lt;br /&gt;maxRequestLength=&amp;quot;4096&amp;quot;&lt;br /&gt;useFullyQualifiedRedirectUrl=&amp;quot;false&amp;quot; &lt;br /&gt;minFreeThreads=&amp;quot;8&amp;quot; &lt;br /&gt;minLocalRequestFreeThreads=&amp;quot;4&amp;quot;&lt;br /&gt;appRequestQueueLimit=&amp;quot;100&amp;quot;&lt;br /&gt;/&amp;gt; 
&lt;p&gt;โหนดเพียงโหนดเดียวนี้มีงานเกิดขึ้นมากมาย แต่ตัวแปรที่เอาไว้คอยจัดการเรื่องขนาดของไฟล์ที่จะอัพโหลดก็คือ maxRequestLength&amp;nbsp; attribute&amp;nbsp; ซึ่งโดยปกติแล้ว ค่าจะกำหนดเป็น 4096 กิโลไบต์ (KB) ให้คุณแก้ไขค่านี้เพื่อเพิ่มขนาดของไฟล์ที่ต้องการอัพโหลดไปยังเซิร์ฟเวอร์ได้ ถ้าหากคุณต้องการอัพโหลดไฟล์ 10 เมกาไบต์ (MB) ไปยังเซิร์ฟเวอร์ได้ ให้กำหนดค่า&amp;nbsp; maxRequestLength&amp;nbsp; เป็น 11264 ซึ่งนั่นหมายความว่าแอพพลิเคชันยอมให้มีการอัพโหลดไฟล์ 11000 KB ไปยังเซิร์ฟเวอร์ได้ 
&lt;p&gt;การแก้ไขไฟล์&amp;nbsp; machine.config จะส่งผลต่อแอพพลิเคชันทุกชนิดที่ผู้ในเซิร์ฟเวอร์ ถ้าหากคุณต้องการแก้ไขข้อจำกัดเรื่องขนาดไฟล์ให้แก่แอพพลิเคชันที่คุณทำงานอยู่เท่านั้น ให้คุณใส่โหนดนี้ในไฟล์&amp;nbsp; web.config ของแอพพลิเคชันของคุณเอง ซึ่งจะเป็นการแทนที่สิ่งที่กำหนดเอาไว้ในไฟล์&amp;nbsp; machine.config คุณต้องตรวจสอบให้แน่ใจว่าโหนดนี้อยู่ระหว่างโหนด &amp;lt;system.web&amp;gt; ในไฟล์ตัวแปรด้วย 
&lt;p&gt;การแก้ไขอีกอย่างหนึ่งที่เกี่ยวข้องกับข้อจำกัดขนาดของไฟล์ที่จะอัพโหลดก็คือค่าของ executionTimeout attribute ที่อยู่ในโหนด &amp;lt;httpRuntime&amp;gt; 
&lt;p&gt;ค่าที่กำหนดให้&amp;nbsp; executionTimeout&amp;nbsp; attribute&amp;nbsp; เป็นจำนวนวินาทีของการอัพโหลดที่ยอมให้เกิดขึ้นก่อนที่ ASP.NET&amp;nbsp; จะปิดการทำงาน ถ้าหากคุณต้องการให้มีการอัพโหลดไฟล์ขนาดใหญ่ไปยังเซิร์ฟเวอร์ คุณจำเป็นต้องเพิ่มค่าดังกล่าวรวมทั้งค่า maxRequestLength ด้วย 
&lt;p&gt;ข้อเสียของการเพิ่มขนาดของไฟล์ที่จะอัพโหลดก็คือ มีแฮกเกอร์ที่จะคอยโจมตีเซิร์ฟเวอร์โดยการส่งคำสั่งจำนวนมากเข้ามา ถ้าหากต้องการป้องกันปัญหาเรื่องนี้ คุณจำเป็นต้องลดขนาดของไฟล์ที่จะยอมให้อัพโหลดได้ มิฉะนั้นแล้วคุณจะเจอกับไฟล์ขนาด 10 MB เป็นร้อยเป็นพันไฟล์ส่งมายังเซิร์เวอร์ของคุณ&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การควบคุมประเภทของไฟล์ที่จะอัพโหลด&lt;/strong&gt; 
&lt;p&gt;มีวิธีการหลายอย่างที่คุณสามารถนำมาใช้เพื่อควบคุมประเภทของไฟล์ที่จะทำการอัพโหลดไปยังเซิร์ฟเวอร์ได้ แต่โชคไม่ดีที่ไม่มีวิธีใดปลอดภัยร้อยเปอร์เซ็นต์ที่จะป้องกันไม่ให้ใครบางคนแอบโหลดไฟล์ประสงค์ร้ายมายังเซิร์ฟเวอร์ของคุณได้ อย่างไรก็ตามคุณสามารถจัดเตรียมขั้นตอนสองสามอย่างเพื่อช่วยให้คุณควบคุมขั้นตอนการอัพโหลดไฟล์ของผู้ใช้ได้ดีขึ้น 
&lt;p&gt;วิธีการที่ดีอย่างหนึ่งซึ่งคุณสามารถนำไปใช้ได้ก็คือ การใช้คอนโทรลตรวจสอบความถูกต้องของ&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp; (คอนโทรลตัวนี้แถมฟรีมากับ&amp;nbsp; ASP.NET อยู่แล้ว) คอนโทรลเหล่านี้จะช่วยให้คุณทำการตรวจสอบ regular-expression ของไฟล์ที่เตรียมจะอัพโหลดว่านามสกุลของไฟล์เป็นประเภทที่คุณยอมให้คุณอัพโหลดได้หรือไม่ 
&lt;p&gt;วิธีการนี้เหมาะสำหรับบราวเซอร์ที่ยอมให้มีการใช้คอนโทรลตรวจสอบความถูกต้องในฝั่งไคล์เอ็นต์ได้ เนื่องจากขั้นตอนนี้จะบังคับให้มีการตรวจสอบตั้งแต่ในฝั่งของไคล์เอ็นต์เลย ไฟล์จะไม่สามารถอัพโหลดไปยังเซิร์ฟเวอร์ได้ถ้าหากมีนามสกุลไม่ตรงกับที่คุณกำหนดเอาไว้ ตัวอย่างโค้ดที่ 2 แสดงการใช้คอนโทรลตรวจสอบความถูกต้อง 
&lt;p&gt;หมายเหตุ:&amp;nbsp;&amp;nbsp; เราจะไม่อธิบายวิธีการใช้คอนโทรลตรวจสอบความถูกต้องในบทความนี้ คุณควรอ่านบทความ&amp;nbsp; &amp;quot;ตรวจสอบความถูกต้องเซิร์ฟเวอร์คอนโทรลของ&amp;nbsp;&amp;nbsp; ASP.NET&amp;quot;&amp;nbsp;&amp;nbsp; ซึ่งจะช่วยให้คุณเข้าใจคอนโทรลตรวจสอบความถูกต้องได้มากขึ้น รวมทั้งวิธีการใช้คอนโทรลเหล่านี้ในเพจ ASP.NET ด้วย 
&lt;p&gt;โค้ดตัวอย่างที่ 2 การใช้คอนโทรลตรวจสอบความถูกต้องเพื่อจำกัดประเภทของไฟล์ที่จะอัพโหลดไปยังเซิร์ฟเวอร์&lt;pre&gt;VB.NET&lt;/pre&gt;&lt;pre&gt;&amp;lt;%@ Page Language=&amp;quot;VB&amp;quot; %&amp;gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;

    Sub SubmitButton_Click(Source As Object, e As EventArgs)
       If Not (File1.PostedFile Is Nothing) Then
          Try
             File1.PostedFile.SaveAs(&amp;quot;C:\Uploads\uploadedfile.txt&amp;quot;)
             Span1.InnerHtml = &amp;quot;Upload Successful!&amp;quot;
          Catch ex As Exception
             Span1.InnerHtml = &amp;quot;Error saving file &amp;lt;b&amp;gt;C:\\&amp;quot; &amp;amp; _
                File1.Value &amp;amp; &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot; &amp;amp; ex.ToString()
          End Try
       End If
    End Sub

&amp;lt;/script&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
        &amp;lt;input id=&amp;quot;File1&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
        &amp;lt;p&amp;gt;
            &amp;lt;input id=&amp;quot;Submit1&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Upload File&amp;quot; 
             runat=&amp;quot;Server&amp;quot; onserverclick=&amp;quot;SubmitButton_Click&amp;quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;span id=&amp;quot;Span1&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt; 
        &amp;lt;p&amp;gt;
            &amp;lt;asp:RegularExpressionValidator 
             id=&amp;quot;RegularExpressionValidator1&amp;quot; runat=&amp;quot;server&amp;quot; 
             ErrorMessage=&amp;quot;Only mp3, m3u or mpeg files are 
             allowed!&amp;quot; ValidationExpression=&amp;quot;^(([a-zA-
             Z]:)|(\\{2}\w+)\$?)(\\(\w[\w
             ].*))+(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U)$&amp;quot; 
             ControlToValidate=&amp;quot;File1&amp;quot;&amp;gt;
            &amp;lt;/asp:RegularExpressionValidator&amp;gt;
            &amp;lt;br /&amp;gt;
            &amp;lt;asp:RequiredFieldValidator 
             id=&amp;quot;RequiredFieldValidator1&amp;quot; runat=&amp;quot;server&amp;quot; 
             ErrorMessage=&amp;quot;This is a required field!&amp;quot; 
             ControlToValidate=&amp;quot;File1&amp;quot;&amp;gt;
            &amp;lt;/asp:RequiredFieldValidator&amp;gt;
        &amp;lt;/p&amp;gt;        
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;pre&gt;C#&lt;/pre&gt;&lt;pre&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;
&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;

    void SubmitButton_Click(Object sender, EventArgs e) {
       if (File1.PostedFile != null) {
          try {
             File1.PostedFile.SaveAs(&amp;quot;C:\\Uploads\\uploadedfile.txt&amp;quot;);
             Span1.InnerHtml = &amp;quot;Upload Successful!&amp;quot;;
          }
          catch (Exception ex) {
             Span1.InnerHtml = &amp;quot;Error saving file &amp;lt;b&amp;gt;C:\\&amp;quot; +
                File1.Value + &amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&amp;quot; + ex.ToString();
          }
       }
    }

&amp;lt;/script&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
        &amp;lt;input id=&amp;quot;File1&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
        &amp;lt;p&amp;gt;
            &amp;lt;input id=&amp;quot;Submit1&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Upload File&amp;quot; 
             runat=&amp;quot;Server&amp;quot; onserverclick=&amp;quot;SubmitButton_Click&amp;quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;span id=&amp;quot;Span1&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt; 
        &amp;lt;p&amp;gt;
            &amp;lt;asp:RegularExpressionValidator 
             id=&amp;quot;RegularExpressionValidator1&amp;quot; runat=&amp;quot;server&amp;quot; 
             ErrorMessage=&amp;quot;Only mp3, m3u or mpeg files are 
             allowed!&amp;quot; ValidationExpression=&amp;quot;^(([a-zA-
             Z]:)|(\\{2}\w+)\$?)(\\(\w[\w
             ].*))+(.mp3|.MP3|.mpeg|.MPEG|.m3u|.M3U)$&amp;quot; 
             ControlToValidate=&amp;quot;File1&amp;quot;&amp;gt;
            &amp;lt;/asp:RegularExpressionValidator&amp;gt;
            &amp;lt;br /&amp;gt;
            &amp;lt;asp:RequiredFieldValidator 
             id=&amp;quot;RequiredFieldValidator1&amp;quot; runat=&amp;quot;server&amp;quot; 
             ErrorMessage=&amp;quot;This is a required field!&amp;quot; 
             ControlToValidate=&amp;quot;File1&amp;quot;&amp;gt;
            &amp;lt;/asp:RequiredFieldValidator&amp;gt;
        &amp;lt;/p&amp;gt;        
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;เพจ&amp;nbsp; ASP.NET แบบง่ายๆเพจนี้ใช้คอนโทรลตรวจสอบความถูกต้อง เพื่อที่ผู้ใช้จะสามารถอัพโหลดไฟล์ .mp3, mpeg หรือ&amp;nbsp; m3u&amp;nbsp; ไปยังเซิร์ฟเวอร์ได้เท่านั้น ถ้าหากประเภทของไฟล์ไม่ได้อยู่ใน 3 ประเภทนี้ คอนโทรลตรวจสอบความถูกต้องจะแสดงข้อความเตือนบนหน้าจอ เหมือนอย่างที่แสดงเอาไว้ในภาพที่ 4 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478971_aspnet-fileupload_04(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 4: การตรวจสอบประเภทของไฟล์โดยใช้คอนโทรลตรวจสอบความถูกต้อง 
&lt;p&gt;การใช้คอนโทรลตรวจสอบความถูกต้องไม่ใช่วิธีการที่ปลอดภัยร้อยเปอร์เซ็นต์สำหรับควบคุมไฟล์ที่จะอัพโหลดไปยังเซิร์ฟเวอร์ได้ เนื่องจากผู้ใช้บางคนอาจจะเปลี่ยนนามสกุลไฟล์ เพื่อให้ระบบยอมรับและอัพโหลดไฟล์ดังกล่าวไปยังเซิร์ฟเวอร์ได้ ซึ่งจะทำให้โมเดลรักษาความปลอดภัยแบบง่ายๆของเราใช้ไม่ได้ผล 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การอัพโหลดไฟล์จำนวนมากในเวลาเดียวกัน&lt;/strong&gt; 
&lt;p&gt;เท่าที่ผ่านมาคุณเห็นตัวอย่างของการอัพโหลดไฟล์หนึ่งไฟล์ไปยังเซิร์ฟเวอร์โดยไม่มีปัญหาแล้ว ในตอนนี้เราลองมาดูกันว่าจะอัพโหลดไฟล์จำนวนมากไปยังเซิร์ฟเวอร์จากเพจเพียงเพจเดียวได้อย่างไร 
&lt;p&gt;Microsoft&amp;nbsp; .NET&amp;nbsp; Framework&amp;nbsp; ไม่มีคุณสมบัติในตัวที่ช่วยให้คุณอัพโหลดไฟล์จำนวนมากจากเพจ ASP.NET เพียงเพจเดียวได้ อย่างไรก็ตามการเขียนโค้ดเพียงเล็กน้อยก็จะช่วยให้คุณทำงานนี้ได้ 
&lt;p&gt;เทคนิคอย่างหนึ่งก็คืออิมพอร์ตคลาส&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.IO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ไปไว้ในเพจ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; จากนั้นก็ใช้คลาส HttpFileCollection&amp;nbsp; เพื่อรวบรวมไฟล์ทั้งหมดที่ถูกส่งเข้ามาโดยใช้ออปเจ็กต์&amp;nbsp; Request แนวทางนี้จะช่วยให้คุณอัพโหลดไฟล์จำนวนมากได้อย่างที่คุณต้องการจากเพจเพียงเพจเดียวได้ 
&lt;p&gt;จากตัวอย่างนี้ คุณสามารถสร้างเพจ&amp;nbsp; ASP.NET ที่มีกรอบรับไฟล์ 4 ช่องบวกกับปุ่ม Submit อีกหนึ่งปุ่มได้ เมื่อผู้ใช้คลิกที่ปุ่ม&amp;nbsp; Submit แล้ว ชื่อไฟล์จะถูกส่งไปยังเซิร์ฟเวอร์ โค้ดที่อยู่เบื้องหลังจะรับไฟล์และเซฟไฟล์ลงไปยังตำแหน่งที่ระบุในเซิร์ฟเวอร์ หลังจากที่ไฟล์ถูกเซฟแล้ว ข้อมูลของไฟล์จะถูกส่งไปแสดงผลในเพจ ASP.NET (ดูตัวอย่างโค้ดที่ 3) 
&lt;p&gt;ตัวอย่างโค้ดที่ 3: การอัพโหลดไฟล์จำนวนมากไปยังเซิร์ฟเวอร์&lt;pre&gt;VB.NET&lt;/pre&gt;&lt;pre&gt;&amp;lt;%@ Import Namespace=&amp;quot;System.IO&amp;quot; %&amp;gt;
&amp;lt;%@ Page Language=&amp;quot;VB&amp;quot; %&amp;gt;

&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;

    Sub SubmitButton_Click(Source As Object, e As EventArgs)
       Dim filepath As String = &amp;quot;C:\Uploads&amp;quot;
       Dim uploadedFiles As HttpFileCollection = Request.Files
       Dim i As Integer = 0
       
       Do Until i = uploadedFiles.Count
          Dim userPostedFile As HttpPostedFile = uploadedFiles(i)
          
          Try
             If (userPostedFile.ContentLength &amp;gt; 0) Then
                Span1.InnerHtml += &amp;quot;&amp;lt;u&amp;gt;File #&amp;quot; &amp;amp; (i+1) &amp;amp; &amp;quot;&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&amp;quot;
                Span1.InnerHtml += &amp;quot;File Content Type: &amp;quot; &amp;amp; _
                   userPostedFile.ContentType &amp;amp; &amp;quot;&amp;lt;br&amp;gt;&amp;quot;
                Span1.InnerHtml += &amp;quot;File Size: &amp;quot; &amp;amp; _
                   userPostedFile.ContentLength &amp;amp; &amp;quot;kb&amp;lt;br&amp;gt;&amp;quot;
                Span1.InnerHtml += &amp;quot;File Name: &amp;quot; &amp;amp; _
                   userPostedFile.FileName &amp;amp; &amp;quot;&amp;lt;br&amp;gt;&amp;quot;
    
                userPostedFile.SaveAs(filepath &amp;amp; &amp;quot;\&amp;quot; &amp;amp; _
                   Path.GetFileName(userPostedFile.FileName))
    
                Span1.InnerHtml += &amp;quot;Location where saved: &amp;quot; &amp;amp; _
                   filepath &amp;amp; &amp;quot;\&amp;quot; &amp;amp; _
                   Path.GetFileName(userPostedFile.FileName) &amp;amp; _
                   &amp;quot;&amp;lt;p&amp;gt;&amp;quot;
             End If
          Catch ex As Exception
             Span1.InnerHtml += &amp;quot;Error:&amp;lt;br&amp;gt;&amp;quot; &amp;amp; ex.Message
          End Try
          i += 1
       Loop       
    End Sub

&amp;lt;/script&amp;gt;

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
            Select File1:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File1&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
            Select File2:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File2&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
            Select File3:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File3&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
            Select File4:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File4&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;
            &amp;lt;input id=&amp;quot;Submit1&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Upload Files&amp;quot; 
             runat=&amp;quot;Server&amp;quot; onserverclick=&amp;quot;SubmitButton_Click&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;span id=&amp;quot;Span1&amp;quot; runat=&amp;quot;Server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;pre&gt;C#&lt;/pre&gt;&lt;pre&gt;&amp;lt;%@ Import Namespace=&amp;quot;System.IO&amp;quot; %&amp;gt;
&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;

&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;

    protected void SubmitButton_Click(Object sender, EventArgs e){
       string filepath = &amp;quot;C:\\Uploads&amp;quot;;
       HttpFileCollection uploadedFiles = Request.Files;
    
       for (int i = 0; i &amp;lt; uploadedFiles.Count; i++)
       {    
          HttpPostedFile userPostedFile = uploadedFiles&lt;img src="http://coredeveloper.net/emoticons/emotion-55.gif" alt="Idea" /&gt;;
    
          try
          {    
             if (userPostedFile.ContentLength &amp;gt; 0 )
             {
                Span1.InnerHtml += &amp;quot;&amp;lt;u&amp;gt;File #&amp;quot; + (i+1) + 
                   &amp;quot;&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&amp;quot;;
                Span1.InnerHtml += &amp;quot;File Content Type: &amp;quot; + 
                   userPostedFile.ContentType + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;
                Span1.InnerHtml += &amp;quot;File Size: &amp;quot; + 
                   userPostedFile.ContentLength + &amp;quot;kb&amp;lt;br&amp;gt;&amp;quot;;
                Span1.InnerHtml += &amp;quot;File Name: &amp;quot; + 
                   userPostedFile.FileName + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;
    
                userPostedFile.SaveAs(filepath + &amp;quot;\\&amp;quot; + 
                   Path.GetFileName(userPostedFile.FileName));
    
                Span1.InnerHtml += &amp;quot;Location where saved: &amp;quot; + 
                   filepath + &amp;quot;\\&amp;quot; + 
                   Path.GetFileName(userPostedFile.FileName) + 
                   &amp;quot;&amp;lt;p&amp;gt;&amp;quot;;
             }    
          } 
          catch (Exception Ex)
          {    
             Span1.InnerText += &amp;quot;Error: &amp;lt;br&amp;gt;&amp;quot; + Ex.Message;    
          }    
       }    
    }

&amp;lt;/script&amp;gt;

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form enctype=&amp;quot;multipart/form-data&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
        &amp;lt;p&amp;gt;
            Select File1:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File1&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
            Select File2:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File2&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
            Select File3:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File3&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
            Select File4:&amp;lt;br /&amp;gt;
            &amp;lt;input id=&amp;quot;File4&amp;quot; type=&amp;quot;file&amp;quot; runat=&amp;quot;Server&amp;quot; /&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;
            &amp;lt;input id=&amp;quot;Submit1&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Upload Files&amp;quot; 
             runat=&amp;quot;Server&amp;quot; onserverclick=&amp;quot;SubmitButton_Click&amp;quot; /&amp;gt;
            &amp;lt;br /&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;span id=&amp;quot;Span1&amp;quot; runat=&amp;quot;Server&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;ผู้ใช้สามารถเลือกไฟล์ได้มากถึง&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&amp;nbsp;&amp;nbsp;&amp;nbsp; ไฟล์ แล้วคลิกที่ปุ่ม&amp;nbsp;&amp;nbsp; Upload&amp;nbsp;&amp;nbsp; Files&amp;nbsp;&amp;nbsp; ซึ่งจะเป็นตัวเริ่มขั้นตอน SubmitButton_Click event การใช้คลาส HttpFileCollection ร่วมกับ Request Files property จะช่วยให้คุณควบคุมไฟล์ทั้งหมดที่ถูกอัพโหลดมาจากเพจนี้ได้ เมื่อไฟล์อยู่ในสภาพนี้ คุณสามารถทำอะไรกับไฟล์ก็ได้ ซึ่งในกรณีนี้จะมีการตรวจสอบคุณสมบัติของไฟล์และแจ้งกลับไปยังหน้าจอก็ได้ ซึ่งในที่สุดแล้วไฟล์จะถูกเซฟเอาไว้ในโฟลเดอร์ Uploads ในรูทไดเรกทอรีของเซิร์ฟเวอร์ ผลลัพธ์ของขั้นตอนนี้จะเป็นดังนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478971_aspnet-fileupload_05(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;คุณอาจสังเกตุพบว่าสิ่งที่น่าสนใจอย่างหนึ่งเกี่ยวกับตัวอย่างนี้ก็คือ สภาพของกรอบข้อความอินพุดไฟล์ไม่ได้ถูกเซฟไปพร้อมกับการโพสต์กลับไป ซึ่งคุณจะเห็นได้ในภาพที่&amp;nbsp; 5&amp;nbsp; การที่กรอบข้อความไฟล์อินพุดของ ASP.NET ไม่สามารถถูกเซฟได้เนื่องจากการทำแบบนั้นอาจส่งผลต่อความปลอดภัยได้ 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;สรุป&lt;/strong&gt; 
&lt;p&gt;คอนโทรล&amp;nbsp; File Field ใน ASP.NET จัดเป็นคอนโทรลประสิทธิภาพสูงที่ก่อนหน้านี้ในยุค Active Serve Pages 3.0&amp;nbsp; จัดเป็นงานที่ยากมาก แต่ในตอนนี้คุณสมบัติใหม่ดังกล่าวช่วยให้ผู้ใช้อัพโหลดไฟล์มากกว่าหนึ่งไฟล์ไปยังเซิร์ฟเวอร์ได้ แต่คุณต้องจำเอาไว้ว่าคุณสามารถควบคุมขนาดของไฟล์ที่จะอัพโหลดไปได้โดยการทำงานกับตัวแปรทั้งที่อยู่ในไฟล์ machine.config หรือ web.config ก็ได้&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=60" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/file+upload/default.aspx">file upload</category></item><item><title>Asynchronous Web Parts</title><link>http://coredeveloper.net/blogs/article/archive/2008/04/08/asynchronous-web-parts.aspx</link><pubDate>Tue, 08 Apr 2008 11:41:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:59</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=59</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/04/08/asynchronous-web-parts.aspx#comments</comments><description>&lt;p&gt;การสร้างเว็บไซต์ที่ปรับแต่งหน้าตาได้พร้อมทั้งสามารถเพิ่มเติมชุด&amp;nbsp;&amp;nbsp; Web&amp;nbsp;&amp;nbsp; Parts&amp;nbsp;&amp;nbsp; ลงไปได้ ถือเป็นเรื่องที่ง่ายดายอย่างมาก ถ้าหากคุณใช้โครงสร้างพื้นฐานประตูท่าของ&amp;nbsp; ASP.NET 2.0 โมเดลนี้จัดว่ามีความคล่องตัวอย่างมาก โดยยอมให้ผู้ใช้ใส่&amp;nbsp; Web&amp;nbsp; Parts&amp;nbsp; ลงไปตรงจุดใดก็ได้ในเว็บเพจ เพื่อที่พวกเขาจะสามารถปรับแต่งหน้าตาของเว็บไซต์ได้โดยอิสระ อย่างไรก็ตามปมเด่นต่างๆเหล่านี้อาจนำไปสู่ระบบที่ไร้ประสิทธิภาพจนทำให้ผู้ใช้ไม่พอใจได้ เนื่องจากคุณไม่มีทางทราบได้ก่อนว่าจะมีคอมโพเน้นต์ใดที่สามารถนำมาใช้ร่วมกันบ้าง ด้วยเหตุนี้คุณจึงไม่สามารถปรับแต่งให้การเรียกใช้ข้อมูลของคอมโพเน้นต์แต่ละชนิดมีประสิทธิภาพสูงสุดได้&lt;/p&gt;
&lt;p&gt;ปัญหาความไร้ประสิทธิภาพที่มักพบในไซต์ประตูท่าทั่วไปเกิดขึ้นเมื่อมี&amp;nbsp; Web Parts จำนวนมากเรียกขอข้อมูลจากระบบเครือข่ายพร้อมๆกัน คำสั่งแต่ละอัน (ไม่ว่าจะเป็นเว็บเซอร์วิสหรือรีโมทดาต้าเบสก็ตาม) มักจะทำให้การประมวลผลเพจโดยรวมเสียเวลานานขึ้น แม้ว่าคำสั่งเหล่านี้จะเป็นอิสระต่อกันและสามารถออกคำสั่งแบบคู่ขนานได้ก็ตาม 
&lt;p&gt;โชคดีที่ ASP.NET 2.0 มีโมเดลอะซิงโครนัสเพจที่ใช้ง่ายที่เมื่อใช้ร่วมกับการเรียกเว็บเซอร์วิสแบบอะซิงโครนัส และการเรียกใช้ดาต้าเบสแบบอะซิงโครนัสแล้วจะทำให้เวลาในการตอบสนองของเพจประตูท่าดีขึ้นอย่างมาก เนื่องจาก Web&amp;nbsp; Parts&amp;nbsp; อิสระจำนวนมากสามารถเรียกใช้ข้อมูลแบบคู่ขนานได้ ดังนั้นผมจะพูดถึงการสร้าง Web Parts ที่ทำการเรียกข้อมูลแยกมากขึ้น เพื่อทำให้เพจประตูท่าที่เก็บ Web Parts เหล่านี้เอาไว้ตอบสนองและขยายระบบได้ดีขึ้นกว่าเดิม&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;การใช้ Web Part&lt;/strong&gt; 
&lt;p&gt;เรามาเริ่มต้นโดยการพิจารณาตัวอย่างเพจประตูท่าที่แสดงอยู่ในภาพที่ 1 กันก่อน ในตัวอย่างนี้เรามี Web Parts จำนวน&amp;nbsp; 4&amp;nbsp; ชนิดอยู่ในเพจประตูท่า โดยแต่ละชนิดจะเรียกข้อมูลมาจากแหล่งข้อมูลที่แตกต่างกัน ซอร์ซโค้ดทั้งหมดของแอพพลิเคชันตัวอย่างนี้มีให้ดาวน์โหลดที่เว็บไซต์ของ&amp;nbsp;&amp;nbsp; MSDN&amp;nbsp; Magazine&amp;nbsp; และผมอยากให้คุณทบทวนแอพพลิเคชันดังกล่าวขณะที่คุณกำลังอ่านบทความนี้อยู่ ซึ่งในตัวอย่างนี้มี&amp;nbsp; Web&amp;nbsp; Parts สามอันเรียกข้อมูลมาจากเว็บเซอร์วิส โดยมีการรอ&amp;nbsp; 3&amp;nbsp; วินาทีก่อนที่จะส่งผลลัพธ์กลับมา ส่วน&amp;nbsp; Web&amp;nbsp; Parts อันที่ 4 ส่งคิวรี ADO.NET ไปยังดาต้าเบส SQL Server&amp;nbsp; ซึ่งก็มีการรอ 3 วินาทีเช่นกันก่อนที่จะส่งผลลัพธ์กลับมา แม้ปัญหานี้ดูออกจะเกินจริงอยู่บ้าง แต่ก็มีโอกาสเป็นไปได้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/afig01.gif" alt="" /&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;ภาพที่ 1 ตัวอย่างเพจประตูท่า 
&lt;p&gt;Web&amp;nbsp; Parts แต่ละอันในแอพพลิเคชันตัวอย่างถูกสร้างขึ้นมาโดยใช้ยูซเซอร์คอนโทรลและเชื่อมโยงผลลัพธ์ของข้อมูลที่ได้รับมาไปยังคอนโทรลที่ใช้แสดงผล โค้ดและมาร์กอัพของคอนโทรลแต่ละอันพยายามทำให้มีจำนวนน้อยที่สุดเพื่อที่ตัวอย่างจะได้เรียบง่ายที่สุด จากนั้นคุณก็จะหันไปให้ความสำคัญกับการทำให้ Web Parts ทำงานแบบอะซิงโครนัสได้ 
&lt;p&gt;นี่คือตัวอย่างไฟล์ยูซเซอร์คอนโทรล NewsWebPart.ascx 
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoEventWireup=&amp;quot;true&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeFile=&amp;quot;NewsWebPart.ascx.cs&amp;quot;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits=&amp;quot;webparts_&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NewsWebPart&amp;quot; %&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BulletedList ID=&amp;quot;_newsHeadlines&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:BulletedList&amp;gt; &lt;/p&gt;
&lt;p&gt;public partial class webparts_NewsWebPart : UserControl&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PortalServices ps = new PortalServices();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _newsHeadlines.DataSource = ps.GetNewsHeadlines();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _newsHeadlines.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;} &lt;/p&gt;
&lt;p&gt;หมายเหตุ:&amp;nbsp; ให้คุณลองสังเกตวิธีการที่ Web Parts โต้ตอบกับเว็บเซอร์วิสเพื่อเรียกดูข้อมูลพาดหัวข่าวตัวอย่างดู ในขณะที่&amp;nbsp; Web Part เรียกดูราคาหุ้นและ Web Part ข้อมูลพยากรณ์อากาศทำงานแบบเดียวกัน แต่ใช้ method ที่ต่างกันของเว็บเซอร์วิสเดียวกันเพื่อดึงข้อมูล สิ่งที่คล้ายคลึงกันก็คือภาพที่&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; แสดงไฟล์ยูซเซอร์คอนโทรล SalesReportWebPart.ascx&amp;nbsp; และไฟล์โค้ดเบื้องหลังที่เกี่ยวข้องเพื่อใช้กับ&amp;nbsp; Web Part ตัวอย่างรายงานยอดขาย ให้คุณลองสังเกตวิธีการใช้คอนโทรลใช้&amp;nbsp; ADO.NET&amp;nbsp; เพื่อดึงข้อมูลยอดขายมาจากดาต้าเบส แล้วนำเอาข้อมูลดังกล่าวไปใส่ไว้ในคอนโทรล GridView 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/afig03.gif" alt="" /&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;ภาพที่ 3 การประมวลผล Web Part เชิงเส้น 
&lt;p&gt;เมื่อเพจประตูท่าตัวอย่างเริ่มทำงาน ปัญหาก็เริ่มเห็นได้อย่างชัดเจนมากขึ้น ระบบต้องใช้เวลามากกว่า 12 วินาทีเพื่อเรียกการประมวลผล ซึ่งเป็นความล่าช้าที่จะทำให้ผู้ใช้ส่วนใหญ่ไม่กลับมาใช้แอพพลิเคชันนี้อีก สาเหตุที่เกิดความล่าช้านานขนาดนี้เหมือนอย่างที่แสดงเอาไว้ในภาพที่&amp;nbsp; 3 มีสาเหตุมาจากเส้นทางที่ใช้ในการประมวลผลคำสั่งขณะที่เพจถูกสั่งงาน สิ่งที่เหมือนกับคอนโทรลอื่นๆในโครงสร้างแยกสาขาคอนโทรลในเพจก็คือ&amp;nbsp; Web&amp;nbsp; Part&amp;nbsp; แต่ละอันจะถูกโหลดเรียงตามลำดับที่กำหนดโดยโครงสร้างแยกสาขาของคอนโทรลที่อยู่ในเพจ การที่การประมวลผลเป็นเชิงเส้น ดังนั้น Web&amp;nbsp; Part แต่ละอันจึงจำเป็นต้องรอให้ Web Part อันก่อนหน้าในโครงสร้างทำงานให้เสร็จเสียก่อน จึงจะเริ่มต้นเรียกใช้ข้อมูลของตนเองและเตรียมตัวที่จะทำการตอบสนองได้ การที่ความล่าช้าปลอม&amp;nbsp; 3&amp;nbsp; วินาทีเกิดขึ้นในช่วงของการเรียกใช้ข้อมูล ดังนั้นการตอบสนองทั้งหมดจึงต้องใช้เวลา&amp;nbsp; 12&amp;nbsp; วินาที Web Part แต่ละอันทำการดึงข้อมูลที่ไม่เกี่ยวข้องกันโดยสิ้นเชิงทีละอันจนกว่าจะเสร็จ สิ่งสำคัญที่พึงตระหนักก็คือการเรียกข้อมูลทั้งหมดควรเกิดขึ้นแบบคู่ขนาน ก็จะทำให้เวลาในการตอบสนองลดลงร้อยละ 75 นั่นคือเป้าหมายที่ผมวางเอาไว้ 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การเรียกใช้เว็บแบบอะซิงโครนัส&lt;/strong&gt; 
&lt;p&gt;ในตัวอย่างนี้&amp;nbsp; Web Parts สามอันใช้เว็บเซอร์วิสเพื่อดึงข้อมูลของตนเอง และ Web Part อีกอันหนึ่งใช้ ADO.NET เพื่อเรียกใช้ดาต้าเบส เราจะมาเริ่มต้นโดยการทำให้เว็บเซอร์วิสตัวนี้ทำงานแบบอะซิงโครนัสได้ เนื่องจากเครื่องมือ Web&amp;nbsp; Services&amp;nbsp; Description&amp;nbsp; Language ที่ชื่อ WSDL.exe (หรือเครื่องมือ Visual Studio 2005 Add Web&amp;nbsp; Service&amp;nbsp; Reference) สามารถสร้างบริการชั้นดีในเว็บเซอร์วิสพร็อกซีคลาสขึ้นมาได้สำหรับการเรียก Web method แบบอะซิงโครนัสนี้ได้ 
&lt;p&gt;เมื่อมีการสร้างเว็บเซอร์วิสพร็อกซีคลาสขึ้นมาใน&amp;nbsp; ASP.NET 2.0 ที่จริงแล้วมีการสร้างวิธีการที่แตกต่างกันออกไป 3 แบบสำหรับเรียก method ใดๆขึ้นมา โดยจะเป็นการเรียกแบบซิงโครนัสหนึ่งวิธี และเป็นแบบอะซิงโครนัสสองวิธี ตัวอย่างเช่นเว็บเซอร์วิสพร็อกซีที่&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Web&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Parts&amp;nbsp;&amp;nbsp;&amp;nbsp; กำลังใช้อยู่มี&amp;nbsp;&amp;nbsp;&amp;nbsp; method&amp;nbsp;&amp;nbsp;&amp;nbsp; เหล่านี้ให้ใช้สำหรับเรียก GetNewsHeadlines Web method ได้ 
&lt;p&gt;&amp;nbsp;&amp;nbsp; public string[] GetNewsHeadlines()&lt;br /&gt;&amp;nbsp;&amp;nbsp; public IAsyncResult BeginGetNewsHeadlines(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AsyncCallback callback, object asyncState) &lt;br /&gt;&amp;nbsp;&amp;nbsp; public string[] EndGetNewsHeadlines(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IAsyncResult asyncResult) &lt;br /&gt;&amp;nbsp;&amp;nbsp; public void GetNewsHeadlinesAsync() &lt;br /&gt;&amp;nbsp;&amp;nbsp; public void GetNewsHeadlinesAsync(&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object userState)&lt;br /&gt;&amp;nbsp;&amp;nbsp; public event&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetNewsHeadlinesCompletedEventHandler &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetNewsHeadlinesCompleted; 
&lt;p&gt;method&amp;nbsp; ชนิดแรกที่ชื่อ GetNewsHeadlines จัดเป็น method ซิงโครนัสแบบมาตรฐาน ส่วน method อีกสองอันก็คือ&amp;nbsp; BeginGetNewsHeadlines และ EndGetNewsHeadlines สามารถใช้เพื่อเรียก method แบบอะซิงโครนัสได้ และสามารถเชื่อมโยงเข้าหากลไกอะซิงโครนัสมากน้อยขนาดไหนก็ได้ใน&amp;nbsp;&amp;nbsp;&amp;nbsp; .NET&amp;nbsp;&amp;nbsp;&amp;nbsp; ผ่านทางอินเทอร์เฟซ IASyncResult แบบมาตรฐาน 
&lt;p&gt;แต่&amp;nbsp; method&amp;nbsp; ที่น่าสนใจที่สุดตามแนวทางนี้ก็คือ&amp;nbsp; method อันสุดท้ายที่ชื่อ GetNewsHeadlinesAsync การที่จะใช้ method&amp;nbsp; นี้ได้ ผมต้องลงจองสร้าง delegate ตัวหนึ่งขึ้นมาพร้อมกับเหตุการณ์ของพร็อกซีคลาส ที่ถูกสร้างขึ้นมาเพื่อรวบรวมผลลัพธ์ของคำสั่งแบบอะซิงโครนัส&amp;nbsp; (ในตัวอย่างนี้ก็คือ&amp;nbsp; GetNewsHeadlinesCompleted&amp;nbsp; event) จากนั้น delegate&amp;nbsp; signature&amp;nbsp; จะถูกกำหนดให้รับค่าที่คืนมาของ method เพื่อที่ผมจะได้ตัดต่อผลลัพธ์ใน method ไปใช้งาน 
&lt;p&gt;การใช้&amp;nbsp; method&amp;nbsp; อะซิงโครนัสที่อิงกับเหตุการณ์นี้ ช่วยให้การแก้ไขคำสั่ง Web method ที่อยู่ใน Web Part ข่าวพาดหัวให้สามารถทำงานแบบอะซิงโครนัสเป็นเรื่องที่ทำได้ง่ายมากเหมือนอย่างที่แสดงเอาไว้ในภาพที่ 4 ก่อนอื่นผมทำการจองตัวแทนให้แก่&amp;nbsp;&amp;nbsp;&amp;nbsp; GetNewsHeadlinesCompleted&amp;nbsp;&amp;nbsp;&amp;nbsp; event&amp;nbsp;&amp;nbsp;&amp;nbsp; ของพร็อกซีคลาส ตามด้วยการเรียก GetNewsHeadlinesAsync&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ส่วนวิธีการใช้&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ที่จองเอาไว้ให้แก่ GetNewsHeadlinesCompleted&amp;nbsp; event ผมได้เชื่อมผลลัพธ์ของการเรียก Web method ไปยัง BulletedList เพื่อส่งการแสดงผลไปยังไคล์เอ็นต์ สิ่งที่จำเป็นต้องพิจารณาอีกอย่างหนึ่งก็คือ method อะซิงโครนัสเหล่านี้จะทำงานได้ก็ต่อเมื่อ&amp;nbsp; Web&amp;nbsp; Part&amp;nbsp; ถูกใส่เอาไว้ในเพจโดยมีการกำหนดค่าของ&amp;nbsp; Async&amp;nbsp; ให้เป็น&amp;nbsp; true เท่านั้น ซึ่งคุณสามารถตรวจสอบการเขียนโปรแกรมได้โดยเข้าไปดูที่&amp;nbsp; IsAsync property ของเพจที่เก็บ Web Parts เอาไว้ ถ้าหากเพจที่ใส่&amp;nbsp; Web&amp;nbsp; Part&amp;nbsp; เอาไว้ไม่ได้มีค่าเป็นอะซิงโครนัส ผมจึงต้องใช้การเชื่อมโยงอะซิงโครนัสแบบมาตรฐานแทนเหมือนอย่างที่แสดงเอาไว้ในภาพที่ 4 
&lt;p&gt;ในตอนนี้เพื่อทำให้&amp;nbsp;&amp;nbsp; Web&amp;nbsp; Part&amp;nbsp; อะซิงโครนัสเรียกข้อมูลแบบอะซิงโครนัสได้ มันจะต้องใส่เอาไว้ในเพจที่ตัวแปร Async กำหนดให้เป็น true ดังนั้นผมจึงได้ทำการแก้ไข Page directive ของเพจประตูท่าให้มีหน้าตาแบบนี้ 
&lt;p&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot;&amp;nbsp; Async=&amp;quot;true&amp;quot; %&amp;gt; 
&lt;p&gt;หลังจากที่ผมทำการแก้ไข Web Parts อีกสองอันที่ใช้เว็บเซอร์วิสเพื่อดึงข้อมูลแบบอะซิงโครนัสแล้ว เพจประตูท่าก็จะตอบสนองได้ดีขึ้นกว่าเดิมมาก ที่จริงแล้วมันอาจแสดงผลไปยังไคล์เอ็นต์โดยใช้เวลาแค่&amp;nbsp; 3 วินาทีเท่านั้น ขึ้นอยู่กับลำดับการโหลด Web Parts (ถ้าหากมีการโหลด Web Parts รายงานยอดขายก่อน มันจะใช้เวลามากกว่า 6 วินาที) แม้ว่า&amp;nbsp; Web&amp;nbsp; Part รายงานยอดขายยังคงเรียกใช้ดาต้าเบสเชิงเส้นอยู่ก็ตาม แต่ในตอนนี้ Web Parts อื่นๆอีก 3 อันจะสั่งงานเว็บเซอร์วิสแบบอะซิงโครนัส ดังนั้นคำสั่งของการทำงานหลักจึงไม่จำเป็นต้องรอให้ Web Part อื่นๆทำงานเสร็จอีกต่อไป แน่ละผมต้องการให้งานทั้งหมดที่เกี่ยวข้องกับ I/O ทำงานแบบอะซิงโครนัสได้ เพื่อที่ไคล์เอ็นต์จะมีโอกาสใช้ทั้งเว็บเซอร์วิสและ Web Part ที่อิงกับดาต้าเบสได้โดยที่ไม่ต้องรออีกต่อไป 
&lt;p&gt;เหตุผลอื่นๆที่จะดัดแปลงให้งานที่เกี่ยวข้องกับ&amp;nbsp; I/O&amp;nbsp; กลายเป็นการเรียกใช้&amp;nbsp; I/O&amp;nbsp; แบบอะซิงโครนัสก็คือการช่วยให้การทำงานหลักกลับมาอยู่ในกลุ่มการทำงานเร็วขึ้นเพื่อช่วยให้สามารถให้บริการคำสั่งอื่นๆได้ ถ้าหากตอนนี้ผมดึงงานหลักกลับมาก็ต่อเมื่อการคิวรีดาต้าเบสรายงานยอดขายเสร็จแล้วเท่านั้น นั่นหมายความว่าผมต้องรอเฉยๆ&amp;nbsp; 3&amp;nbsp; วินาทีเต็มๆ ในขณะที่กลุ่มการทำงานน่าจะถูกใช้ไปให้บริการคำสั่งอื่นๆได้ ดังนั้นถ้าหากผมสามารถทำให้คำสั่งที่เกี่ยวกับ I/O&amp;nbsp;&amp;nbsp; อันสุดท้ายนี้เรียกใช้ข้อมูลแบบอะซิงโครนัสได้เช่นกัน เพจของผมก็จะใช้คำสั่งดังกล่าวโดยใช้เวลานานเท่ากับการทำ spool ให้คำสั่ง I/O แบบอะซิงโครนัสทั้งหมดเท่านั้นก็จะย้อนกลับมายังกลุ่มทำงานหลักได้ 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;วิธีการทำงาน&lt;/strong&gt; 
&lt;p&gt;ถ้าหากคุณเคยเขียนโปรแกรมอะซิงโครนัสมาก่อน คุณอาจมีความรู้สึกว่าการเปลี่ยนแปลงเล็กน้อยกับคำสั่งเว็บเซอร์วิสน่าจะยังไม่พอ ผมยังไม่ได้เข้าไปยุ่งกับอินเทอร์เฟซ&amp;nbsp; IAsyncResult&amp;nbsp; เลย แถมยังไม่ได้บอกให้เพจที่เก็บเว็บเซอร์วิสเอาไว้ทราบว่า ผมได้ทำงานแบบอะซิงโครนัสอยู่ (โดยการจองงานหรือการใช้เทคนิคอื่นๆ) แต่ดูเหมือนมันก็ใช้งานได้เหมือนอย่างที่ผมหวังเอาไว้ 
&lt;p&gt;ความลับอยู่ตรงที่การใช้&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; แบบอะซิงโครนัสของเว็บเซอร์วิสพร็อกซีคลาส รวมทั้งคลาสที่ชื่อ AsyncOperationManager&amp;nbsp;&amp;nbsp; ของ&amp;nbsp;&amp;nbsp; Microsoft&amp;nbsp; .NET&amp;nbsp; Framework&amp;nbsp; 2.0&amp;nbsp; ที่เข้ามาช่วย ถ้าหากผมเรียก GetNewsHeadlinesAsync&amp;nbsp; method&amp;nbsp; ของพร็อกซีคลาส ระบบจะทำการเทียบการเรียกกับ method ตัวช่วยที่ชื่อ InvokeAsync&amp;nbsp; ซึ่งอยู่ภายในคลาสพื้นฐานที่ชื่อ&amp;nbsp; SoapHttpClientProtocol โดยที่พร็อกซีคลาสก็มาจากที่นี่นั่นเอง InvokeAsync&amp;nbsp; ทำงานสำคัญ&amp;nbsp; 2 ประการก็คือมันจะจองการทำงานอะซิงโครนัสโดยการเรียก CreateOperation method&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ของ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AsyncOperationManager&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; จากนั้นก็เรียกคำสั่งแบบอะซิงโครนัสโดยใช้ BeginGetReguestStream ของคลาส WebRequest 
&lt;p&gt;เมื่อถึงจุดนี้จะมีการส่งค่ากลับมา และเพจจะเริ่มต้นการประมวลผลวงจรชีวิตของมัน แต่การที่เพจมีการกำหนดให้ Async เป็น true อยู่ ดังนั้นมันจะยังคงประมวลผลคำสั่งต่อไปผ่านทาง PreRender event และจะมีการส่งงานคำสั่งกลับไปยังกลุ่มทำงานหลังจากที่ทำคำสั่งเก็บแบบอะซิงโครนัสเสร็จแล้ว ระบบจะเรียก method ที่ผมจองเอาไว้กับ GetNewsHeadlinesCompleted&amp;nbsp; event&amp;nbsp; ของพร็อกซีในงานแยกต่างหากซึ่งดึงมาจากกลุ่มงาน I/O ถ้าหากงานนี้เป็นงานอะซิงโครนัสงานสุดท้ายที่ทำเสร็จ&amp;nbsp; (โดยมี&amp;nbsp; AsyncOperationManager&amp;nbsp; คอยเฝ้าติดตามดูอยู่) เพจจะถูกเรียกกลับมา และคำสั่งจะประมวลผลจนเสร็จงานที่ค้างอยู่โดยเริ่มจาก&amp;nbsp; PreRender Complete event ภาพที่ 5 แสดงวงจรชีวิตทั้งหมดเมื่อคุณใช้คำสั่งเว็บอะซิงโครนัสในขอบเขตของเพจแบบอะซิงโครนัส 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/afig05.gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 5 คำสั่งอะซิงโครนัสในเพจอะซิงโครนัส 
&lt;p&gt;AsyncOperationManager เป็นคลาสที่ถูกออกแบบมาเพื่อใช้ในสภาพแวดล้อมต่างๆสำหรับบริหารคำสั่ง method อะซิงโครนัสโดยตรง ตัวอย่างเช่นถ้าหากผมเรียกเว็บเซอร์วิสแบบอะซิงโครนัสจากแอพพลิเคชัน&amp;nbsp; Windows&amp;nbsp; Forms แล้วละก็ เว็บเซอร์วิสจะเชื่อมโยงกับคลาส AsyncOperationManager ด้วย ความแตกต่างของสภาพแวดล้อมแต่ละแบบก็คือ&amp;nbsp; SyncronizationContext&amp;nbsp; เกี่ยวข้องกับ&amp;nbsp; AsyncOperationManager ถ้าหากสั่งงานในขอบเขตของแอพพลิเคชัน&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;&amp;nbsp; แล้ว&amp;nbsp; SynchronizatioinContext&amp;nbsp; จะถูกกำหนดให้เป็น&amp;nbsp; instance&amp;nbsp; ของคลาส AspNetSynchronizationContext&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; จุดมุ่งหมายหลักตรงนี้ก็คือการคอยเฝ้าติดตามว่ายังมีคำสั่งอะซิงโครนัสอีกมากน้อยขนาดไหนที่ยังรออยู่ ดังนั้นเมื่อคำสั่งเหล่านี้ทำงานเสร็จแล้ว การประมวลผลคำสั่งของเพจก็จะทำต่อไป ในทางตรงกันข้าม ถ้าหากอยู่ในแอพพลิเคชันประเภท Windows Forms แล้ว SynchronizationContext จะถูกกำหนดให้เป็น&amp;nbsp; instance&amp;nbsp; ของคลาส&amp;nbsp; Windows Forms SynchronizatioinContext จุดมุ่งหมายหลักตรงนี้ก็คือการช่วยให้ควบคุมคำสั่งจากงานแบกกราวน์ไปยังงาน UI ได้ง่ายขึ้น 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การเรียกใช้ข้อมูลแบบอะซิงโครนัส&lt;/strong&gt; 
&lt;p&gt;ในตอนนี้เราจะย้อนกลับไปหาปัญหาการสร้าง&amp;nbsp; Web&amp;nbsp; Part&amp;nbsp; อันสุดท้ายให้ทำงานแบบอะซิงโครนัสได้ และปัญหาทั่วไปของการเรียกข้อมูลแบบอะซิงโครนัสโดยใช้&amp;nbsp; ADO.NET&amp;nbsp; โชคไม่ดีที่ไม่มีวิธีที่เท่าเทียมกับกลไกอะซิงโครนัสแบบง่ายๆที่เว็บเซอร์วิสพร็อกซีสามารถนำไปใช้เพื่อเรียกข้อมูลแบบอะซิงโครนัสได้ ดังนั้นผมจึงจำเป็นต้องทำงานเพิ่มเติมอีกเล็กน้อยเพื่อทำให้&amp;nbsp; Web&amp;nbsp; Part&amp;nbsp; อันสุดท้ายนี้ทำงานแบบอะซิงโครนัสได้ ผมสามารถทำงานกับ method อะซิงโครนัสอันใหม่ในคลาส&amp;nbsp; SqlCommand&amp;nbsp; รวมทั้งคุณสมบัติการทำงานแบบอะซิงโครนัสของ ASP.NET ได้ การใช้ SqlCommand ช่วยให้ในตอนนี้ผมสามารถเรียกคำสั่งแบบอะซิงโครนัสได้โดยใช้ methods ต่างๆดังต่อไปนี้ 
&lt;ul&gt;
&lt;li&gt;IAsyncResult BeginExecuteReader(AsyncCallback ac, object state) 
&lt;li&gt;IAsyncResult BeginExecuteNonQuery(AsyncCallback ac, object state) 
&lt;li&gt;IAsyncResult BeginExecuteXmlReader(AsyncCallback ac, object state) &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;และในตอนนี้ผมสามารถเรียก method ที่ช่วยทำงานให้เสร็จ หลังจากที่สตริงข้อมูลพร้อมแล้วโดยเริ่มการอ่าน 
&lt;ul&gt;
&lt;li&gt;SqlDataReader EndExecuteReader(IAsyncResult ar) 
&lt;li&gt;int EndExecuteNonQuery(IAsyncResult ar) 
&lt;li&gt;XmlReader EndExecuteXmlReader(IAsyncResult ar) &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;ถ้าหากต้องการใช้ method เรียกข้อมูลแบบอะซิงโครนัสเหล่านี้ คุณต้องเพิ่ม &amp;quot;async=true&amp;quot; ลงไปในสตริงเชื่อมต่อเสียก่อน ซึงถ้าหากดูจากตัวอย่างของเรา ผมต้องการใส่ข้อมูลลงไปใน GridView โดยการเชื่อมโยง GridView กับ SqlDataReader ดังนั้นผมจะใช้ BeginExecuteReader method เพื่อเริ่มการเรียกแบบอะซิงโครนัส 
&lt;p&gt;นอกจากนั้นเพื่อเป็นการเชื่อมโยงเข้าหาเพจอะซิงโครนัส&amp;nbsp; ASP.NET 2.0 ยังยอมให้คุณจองงานอะซิงโครนัสที่จำเป็นต้องประมวลผลก่อนที่เพจจะทำการแสดงผลเสร็จอีกด้วย โมเดลนี้มีความชัดเจนมากกว่าโมเดลที่ผมใช้กับเว็บเซอร์วิสพร็อกซี และมีความคล่องตัวมากกว่าด้วย ถ้าหากผมต้องการจองงานอะซิงโครนัส ผมจะสร้าง intance ของคลาส&amp;nbsp; PageAsyncTask&amp;nbsp; ขึ้นมา จากนั้นก็สั่งให้มันเริ่มทำงานโดยใช้ตัวแทน&amp;nbsp; 3 ชนิดก็คือ begin handler, end handler&amp;nbsp; และ&amp;nbsp; timeout handler โดยที่ begin handler จำเป็นต้องคืนอินเทอร์เฟซ LAsyncResult กลับมา ซึ่งตรงนี้จะเป็นจุดที่ผมเรียกคำสั่งข้อมูลแบบอะซิงโครนัสโดยใช้&amp;nbsp; BeginExecuteReader จากนั้นจะมีการเรียก end&amp;nbsp; handler เมื่องานเสร็จแล้ว (เมื่อมีข้อมูลพร้อมที่จะอ่านขึ้นมาได้ในตัวอย่างนี้) เพื่อที่ผมจะนำเอาผลลัพธ์ไปใช้ได้ APS.NET จะเป็นตัวคอยจัดการการเรียก begin handler ขึ้นมา ก่อนที่ปลดระหว่างงานคำสั่งเรียกข้อมูล (ทันทีหลังจากที่&amp;nbsp; PreRender event ทำงานเสร็จ) ภาพที่ 6 แสดงการอัพเดต Web Part รายงานยอดขาย ซึ่งมีการเรียกข้อมูลแบบอะซิงโครนัสโดยใช้การทำงานอะซิงโครนัสและ&amp;nbsp;&amp;nbsp; BeginExecuteReader&amp;nbsp;&amp;nbsp; อะซิงโครนัสของคลาส SqlCommand 
&lt;p&gt;&lt;em&gt;หมายเหตุ&lt;/em&gt;&lt;em&gt;: &lt;/em&gt;ผมใช้เทคนิคเดียวกันนี้กับการเรียกใช้เว็บเซอร์วิส โดยการใช้ methods อะซิงโครนัสอันอื่นที่อยู่ในพร็อกซีคลาส&amp;nbsp; (ตัวอย่างเช่น&amp;nbsp; BeginGetNewsHeadlines เป็นต้น) ปมเด่นอย่างหนึ่งของเทคนิคนี้ก็คือผมสามารถกำหนด timeout&amp;nbsp; handler ได้ ถ้าหากคำสั่งรีโมทไม่สามารถส่งค่ากลับมาได้ทันเวลา ระบบจะเรียก timeout handler ที่เกี่ยวข้องกันขึ้นมาแทน&amp;nbsp; timeout&amp;nbsp; handler ตัวนี้กำหนดเอาไว้ใน Page directive โดยใช้ AsyncTimeout attribute และกำหนดเวลาปกติเป็น 20 วินาที 
&lt;p&gt;สิ่งที่ผมอยากบอกอีกอย่างหนึ่งก็คือสิ่งที่ต่างจากการใช้รูปแบบอะซิงโครนัสที่อิงกับเหตุการณ์ก็คือ เมื่อมีการใช้&amp;nbsp; Page.RegisterAsyncTask&amp;nbsp;&amp;nbsp; แล้ว ผมไม่จำเป็นต้องแยกไปยังคำสั่งอะซิงโครนัสที่อิงกับผลลัพธ์ของ&amp;nbsp; Page.IsAsync อีกครั้ง การจัดการเพจอะซิงโครนัสใน Web Parts ทำงานได้เป็นอย่างดีในเพจซิงโครนัส แถมยังยอมให้มีการประมวลผล&amp;nbsp; Web Parts แบบคู่ขนานอีกด้วย ความแตกต่างหลักก็คือในเพจซิงโครนัส (เพจที่ไม่ได้กำหนดตัวแปร Async เป็น true) งานหลักของเพจจะไม่ได้ถูกปล่อยกลับมายังกลุ่มทำงานในช่วงการประมวผลลอะซิงโครนัส 
&lt;p&gt;ในตอนนี้เมื่อ&amp;nbsp; Web&amp;nbsp; Parts&amp;nbsp; ทั้งหมดสามารถทำงานแบบอะซิงโครนัสได้แล้ว ในตอนนี้ผมสามารถใช้&amp;nbsp; Web&amp;nbsp; Part เหล่านี้ได้ในเพจใดๆที่เป็นแบบอะซิงโครนัสได้ และผมจะมั่นใจว่าเวลาตอบสนองจะไม่เท่ากับเวลารวมที่&amp;nbsp;&amp;nbsp;&amp;nbsp; Web Parts&amp;nbsp; ทั้งหมดใช้ในการดึงข้อมูลอีกต่อไป แต่จะเป็นเวลาสูงสุดของ Web Part ตัวใดตัวหนึ่งเท่านั้น การกำหนดให้เพจเป็นแบบอะซิงโครนัสและใช้&amp;nbsp;&amp;nbsp; Web&amp;nbsp; Parts&amp;nbsp; ให้ทำงานกับ&amp;nbsp; I/O&amp;nbsp; แบบอะซิงโครนัสจะช่วยให้ความสามารถในการขยายเว็บไซต์ดีขึ้นอย่างมาก เนื่องจากเพจจะเปิดโอกาสให้การทำงานหลักให้บริการไคล์เอ็นต์อื่นๆที่รอข้อมูลอยู่ได้ 
&lt;p&gt;ของแถมอีกอย่างหนึ่งก็คือถ้าหากคุณสร้างไซต์ประตูท่าโดยใช้ ASP.NET 2.0 คุณควรจำเอาไว้ว่าคุณสมบัติอะซิงโครนัสแบบใหม่ทั้งหมดเพิ่งมีอยู่ในซอฟต์แวร์เวอร์ชันนี้ และคุณควรนำเอาคุณสมบัติเหล่านี้ไปใช้ปรับปรุงอัตราการตอบสนองและความสามารถในการขยายระบบของแอพพลิเคชันของคุณเอง ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับบริการอะซิงโครนัสใน ASP .NET 2.0 ให้คุณเข้าไปดูคอลัมน์ Wicked Code ของ Jeff Prosise นิตยสาร MSDN เดือนตุลาคม ปี 2005&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=59" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/web+part/default.aspx">web part</category></item><item><title>Hierarchical Data Binding in ASP.NET</title><link>http://coredeveloper.net/blogs/article/archive/2008/03/11/hierarchical-data-binding-in-asp-net.aspx</link><pubDate>Tue, 11 Mar 2008 11:02:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:58</guid><dc:creator>admin</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=58</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/03/11/hierarchical-data-binding-in-asp-net.aspx#comments</comments><description>&lt;p&gt;ใช้ได้กับ 
&lt;p&gt;Microsoft ASP.NET &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;สรุป:&lt;/strong&gt; 
&lt;p&gt;เรียนรู้เทคนิคการทำให้ ASP.NET เชื่อมโยงข้อมูลไปยังแหล่งข้อมูล โดยที่ข้อมูลจะเป็นแบบแยกสาขามีมากกว่า 2 มิติขึ้นไป &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;คำนำ&lt;/strong&gt; 
&lt;p&gt;ASP.NET&amp;nbsp; จัดเป็นโครงสร้างที่ใช้งานสะดวกสำหรับการเชื่อมโยงข้อมูลไปยังคอนโทรลในฝั่งเซิร์ฟเวอร์ จากนั้นคอนโทรลก็จะส่งการแสดงผลไปยังไคล์เอ็นต์ไม่ว่าคอนโทรลจะถูกออกแบบให้มีฟอร์แมทในการแสดงผลอย่างไรก็ตาม ตัวอย่างการเชื่อมโยงข้อมูลส่วนใหญ่ใน&amp;nbsp; ASP.NET เป็นตัวอย่างการเชื่อมโยงกับแหล่งข้อมูลแบบแบนราบนั่นก็คือการคิวรีไปยังดาต้าเบสเพียงชุดเดียวเท่านั้น แม้ว่าแอพพลิเคชันส่วนมากใช้วิธีการเชื่อมโยงข้อมูลในลักษณะนี้ก็ตาม แต่ในบางครั้งข้อมูลก็ไม่อาจใส่ลงไปในพื้นที่สองมิติแบบง่ายๆได้ และเทคนิคการเชื่อมโยงข้อมูลแบบมาตรฐานก็ไม่อาจนำมาใช้ได้ &lt;/p&gt;
&lt;p&gt;ในบทความนี้จะพูดถึงเทคนิคการเชื่อมโยงข้อมูลไปยังแหล่งข้อมูลที่มีมากกว่าสองมิติ แถมยังมีโครงสร้างแยกสาขาอีกด้วย &lt;/p&gt;&lt;!--more--&gt;
&lt;p&gt;&lt;strong&gt;การเชื่อมโยงข้อมูล&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;การเชื่อมโยงข้อมูลของ&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;&amp;nbsp; เป็นขั้นตอนการเชื่อมโยงข้อมูลในเซิร์ฟเวอร์ไปยังคอนโทรลในฝั่งเซิร์ฟเวอร์ จากนั้นก็จะมีการสร้างภาพผลลัพธ์ข้อมูลแบบใดแบบหนึ่งจากเซิร์ฟเวอร์ส่งไปยังไคล์เอ็นต์ ข้อจำกัดเพียงอย่างเดียวของการเชื่อมโยงข้อมูลก็คือคอนโทรลในฝั่งไคล์เอ็นต์จะต้องรองรับการทำงานของ&amp;nbsp; property&amp;nbsp; ที่ชื่อ DataSource และ&amp;nbsp;&amp;nbsp; method&amp;nbsp;&amp;nbsp; ที่ชื่อ&amp;nbsp;&amp;nbsp; DataBind()&amp;nbsp; รวมทั้งแหล่งข้อมูลที่คอนโทรลจะเชื่อมโยงไปหาต้องมีการใช้อินเทอร์เฟซ IEnumerable ด้วย 
&lt;p&gt;หมายเหตุ:&amp;nbsp; มีข้อยกเว้น&amp;nbsp; 2&amp;nbsp; ข้อเกี่ยวกับเงื่อนไขนี้ นั่นก็คือ&amp;nbsp; DataSet และ DataTable สาามารถเชื่อมโยงกับแหล่งข้อมูลโดยตรง ซึ่งจะส่งผลทำให้มีการเชื่อมโยงไปยัง&amp;nbsp; DataView ปกติของตารางปกติ (DataView มีการใช้ IEnumerable&amp;nbsp; อยู่แล้ว)&amp;nbsp; วิธีนี้ก่อให้เกิดความสะดวกอย่างมากเนื่องจาก DataSets และ DataTables มักถูกใช้เป็นแหล่งข้อมูลสำหรับการเชื่อมโยงข้อมูลอยู่แล้ว 
&lt;p&gt;ถ้าหากต้องการเชื่อมโยงข้อมูลไปหาคอนโทรล คุณต้องกำหนดแหล่งข้อมูลไปยัง&amp;nbsp; DataSource property ของคอนโทรล แล้วเรียก DataBind() method 
&lt;p&gt;ตัวอย่างเช่น ถ้าหากเป็นแหล่งข้อมูลนี้ก็จะมีการส่งข้อมูล ArrayList ในคลาส Item กลับมา 
&lt;p&gt;public class Item&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Item(string name) { _name = name; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get { return _name; } }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; public class TestDataSource&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static ArrayList GetData()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayList items = new ArrayList();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=0; i&amp;lt;10; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item item = new Item(&amp;quot;item&amp;quot; + i.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return items;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; } 
&lt;p&gt;การที่&amp;nbsp; ArrayList&amp;nbsp; มีการใช้&amp;nbsp; IEnumerable&amp;nbsp; อยู่แล้ว ผลลัพธ์ของ GetData() method ของเราที่อยู่ในคลาส TestDataSource&amp;nbsp; จึงเป็นแหล่งข้อมูลที่เหมาะสมสำหรับการเชื่อมโยงข้อมูลได้ เราจะใช้&amp;nbsp; Repeater&amp;nbsp; เป็นคอนโทรลในฝั่งเซิร์ฟเวอร์ ซึ่งเราจะใช้ในการเชื่อมโยงข้อมูล โดยที่เราจำเป็นต้องใส่ ItemTemplate เพื่ออธิบายว่าเราจะแสดงผลแหล่งข้อมูลอย่างไร ตัวอย่างของเราแสดงผลคอนโทรล&amp;nbsp;&amp;nbsp; CheckBox&amp;nbsp; โดยใช้ข้อความที่กำหนดให้ Name property ของ Item class instance ที่เชื่อมโยงกันอยู่&lt;pre&gt;&amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_itemsRepeater&amp;quot; 
              EnableViewState=&amp;quot;false&amp;quot;&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
    &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot; 
 Text=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39;
  /&amp;gt;
    &amp;lt;br/&amp;gt;
  &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;งานที่เหลือก็คือการเชื่อมโยงข้อมูลจริงๆไปยัง&amp;nbsp; Repeater&amp;nbsp; ของเรา ซึ่งโดยปกติแล้วมักจะทำในช่วงการจัดการการ Load ของคลาสที่ได้มาจาก Page ซึ่งแสดงเอาไว้ด้านล่างนี้ 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _itemsRepeater.DataSource = TestDataSource.GetData();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _itemsRepeater.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;ตัวอย่างของการแสดงผลเพจแสดงเอาไว้ด้านล่างนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_01(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 1: การเชื่อมโยงข้อมูลเพจ 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ข้อมูลแบบแยกสาขา&lt;/strong&gt; 
&lt;p&gt;ตัวอย่างแหล่งข้อมูลชนิดแรกของเราเป็นข้อมูลแบบแบนราบที่มีข้อมูลเพียงระดับเดียว ในตอนนี้สมมติว่าเราเพิ่มชุด item ย่อยให้แก่แต่ละ item ที่อยู่ในแหล่งข้อมูลของเราตามตัวอย่างนี้ 
&lt;p&gt;public class Item&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; string _name;&lt;br /&gt;&amp;nbsp; ArrayList _subItems = new ArrayList();&lt;br /&gt;&amp;nbsp; public Item(string name) { _name = name; }&lt;br /&gt;&amp;nbsp; public string&amp;nbsp;&amp;nbsp;&amp;nbsp; Name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { get { return _name;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } }&lt;br /&gt;&amp;nbsp; public ArrayList SubItems { get { return _subItems; } }&lt;br /&gt;} 
&lt;p&gt;จากนั้นเพิ่ม&amp;nbsp; method&amp;nbsp; ที่ชื่อ&amp;nbsp; GetData ลงไปในแหล่งข้อมูลของเรา โดยเราจะเพิ่ม item ย่อย 5 ชุดให้แก่แต่ละ item&lt;pre&gt;public class TestDataSource
{
  public static ArrayList GetData()
  {
    ArrayList items = new ArrayList();
    for (int i=0; i&amp;lt;10; i++)
    {
      Item item = new Item(&amp;quot;item&amp;quot; + i.ToString());
      for (int j=0; j&amp;lt;5; j++)
      {
        Item subItem = new Item(&amp;quot;subitem&amp;quot; + j.ToString());
        item.SubItems.Add(subItem);
      }
      items.Add(item);
    }
    return items;
  }
}
&lt;/pre&gt;
&lt;p&gt;ในตอนนี้โครงสร้างข้อมูลของเราเป็นแบบแยกสาขา โดยมีข้อมูลอยู่ต่ำกว่าระดับบนสุดอีกหนึ่งชุด การเชื่อมโยงข้อมูลที่เราทำเอาไว้ก่อนหน้านี้ยังคงทำงานได้อย่างถูกต้อง แต่มันจะแสดงข้อมูลในระดับแรกเท่านั้น โดยไม่สนใจ&amp;nbsp; item ย่อยในขณะแสดงผล สิ่งที่เราต้องการตรงจุดนี้เพื่อทำให้การแสดงผลข้อมูลทั้งหมดถูกต้องก็คือการเชื่อมโยงข้อมูลเชิงซ้อนของ item ย่อยที่อยู่ใน item หลัก โดยปกติแล้วสิ่งนี้หมายความว่าเราต้องใส่คอนโทรลเชื่อมโยงข้อมูลอีกอันหนึ่งลงไปภายใน&amp;nbsp; ItemTemplate&amp;nbsp; ของ Repeater ที่เรามีอยู่แล้ว จากนั้นทำการเชื่อมโยงไปหาชุด SubItems ของแต่ละ&amp;nbsp; Item&amp;nbsp; ที่กำหนดเอาไว้ใน Repeater ระดับบนสุด เราสามารถกำหนดองค์ประกอบดังกล่าวได้ภายในไฟล์ .aspx&amp;nbsp; ของเราโดยการเพิ่ม&amp;nbsp; Repeater&amp;nbsp; เชิงซ้อนลงไป ส่วนที่ค่อนข้างยุ่งยากก็คือการเทียบชุด SubItems ของ Item&amp;nbsp; ที่กำลังมีการเชื่อมโยงไปหา&amp;nbsp; DataSource&amp;nbsp; property ของ Repeater เชิงซ้อนอยู่ สิ่งที่เราต้องทำก็คือการกำหนด&amp;nbsp; DataSource&amp;nbsp; property ของ Repeater เชิงซ้อนให้แก่ data binding expression ซึ่งจะส่งผลต่อชุด SubItems เหมือนอย่างที่แสดงเอาไว้ด้านล่างนี้&lt;pre&gt;&amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_itemsRepeater&amp;quot; 
              EnableViewState=&amp;quot;false&amp;quot;&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
    &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot; 
    Text=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Name&amp;quot;) 
      %&amp;gt;&amp;#39; 
         /&amp;gt;
    &amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_subitemsRepeater&amp;quot;
                  EnableViewState=&amp;quot;false&amp;quot;
         DataSource=
   &amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;SubItems&amp;quot;) %&amp;gt;&amp;#39;&amp;gt;
         &amp;lt;ItemTemplate&amp;gt;
           &amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
           &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot;
                         Text=
      &amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39; 
        /&amp;gt;
         &amp;lt;/ItemTemplate&amp;gt;
    &amp;lt;/asp:Repeater&amp;gt;

    &amp;lt;br/&amp;gt;
  &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;ไม่มีอะไรเปลี่ยนแปลงเกิดขึ้นกับคลาสที่อยู่เบื้องหลังโค้ด เนื่องจากเราได้เชื่อมโยงแหล่งข้อมูลของเรากับ Repeater&amp;nbsp; ระดับบนสุดอยู่แล้ว การเชื่อมโยงข้อมูลเชิงซ้อนจะเกิดขึ้นเพียงครั้งเดียวต่อ Item ซึ่งอยู่ในชุดข้อมูลระดับบนสุด สิ่งสำคัญที่ต้องจำไว้ก็คือเมื่อคุณอ่านคอนโทรลเชื่อมโยงข้อมูลเชิงซ้อนหนึ่งคู่แบบนี้&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data-binding expression&amp;nbsp; (&amp;lt;%# %&amp;gt;) จะถูกกำหนดขอบเขตโดยคอนโทรลที่อยู่ใกล้ที่สุด ซึ่งในตัวอย่างของเรา data-binding expression&amp;nbsp; สองชุดแรก ถูกกำหนดขอบเขตโดยการเชื่อมโยงข้อมูลภายนอกของ Repeater ระดับบนสุด และแยกไปยัง&amp;nbsp; Item&amp;nbsp; ปัจจุบันในชุดข้อมูลระดับบนสุด ส่วน data-binding expression ชุดที่สามถูกกำหนดขอบเขตโดย Repeater&amp;nbsp; ภายใน และแยกไปยังองค์ประกอบในชุด&amp;nbsp; SubItems ของ Item ปัจจุบันที่เชื่อมโยงอยู่ ตัวอย่างการแสดงผลเพจนี้แสดงอยู่ด้านล่าง 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_02(en-us,MSDN_10).gif" alt="" /&gt;&amp;gt; 
&lt;p&gt;ภาพที่ 2: การแสดงผลเพจที่มีการเชื่อมโยงไปยัง Repeater 
&lt;p&gt;การเชื่อมโยงข้อมูลเชิงซ้อนนี้ไม่ได้จำกัดอยู่ที่เพียงระดับเดียว แต่สามารถขยายให้ลึกลงไปได้อย่างอิสระ ตราบเท่าที่คอนโทรลเชื่อมโยงข้อมูลเชิงซ้อนตรงกับคอลเลกชันเชิงซ้อนในแหล่งข้อมูลและแหล่งข้อมูลมีรูปทรงปติแล้วละก็ การเชื่อมโยงข้อมูลก็จะใช้การได้ ตัวอย่างเช่น เราลองมาขยายขอบเขตแหล่งข้อมูลให้มีข้อมูลอีกระดับหนึ่ง โดยการทำให้ SubItems ที่มีอยู่มี SubItems เป็นของตนเองด้วย&lt;pre&gt;public class TestDataSource
{
  public static ArrayList GetData()
  {
    ArrayList items = new ArrayList();
    for (int i=0; i&amp;lt;10; i++)
    {
      Item item = new Item(&amp;quot;item&amp;quot; + i.ToString());
      for (int j=0; j&amp;lt;5; j++)
      {
        Item subItem = new Item(&amp;quot;subitem&amp;quot; + j.ToString());
        item.SubItems.Add(subItem);
        for (int k=0; k&amp;lt;4; k++)
        {
          Item subsubItem = 
               new Item(&amp;quot;subsubitem&amp;quot; + k.ToString());
          subItem.SubItems.Add(subsubItem);
        }
      }
      items.Add(item);
    }
    return items;
  }
}
&lt;/pre&gt;
&lt;p&gt;การเปลี่ยนแปลงในเพจเพียงอย่างเดียวที่จำเป็นสำหรับการแสดงผลข้อมูลเชิงซ้อนชุดใหม่ก็คือการเพิ่ม&amp;nbsp;&amp;nbsp;&amp;nbsp; Repeater เชิงซ้อนอีกชุดหนึ่งลงไป โดยที่&amp;nbsp; DataSource property ของ Repeater เชื่อมโยงกับ SubItems property ของ Item ที่ขยายออกมาโดย Repeater ระดับที่สอง&lt;pre&gt;&amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_itemsRepeater&amp;quot;
              EnableViewState=&amp;quot;false&amp;quot;&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
    &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot; 
 Text=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39;
   /&amp;gt;
    &amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_subitemsRepeater&amp;quot;
         EnableViewState=&amp;quot;false&amp;quot;
         DataSource=
    &amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;SubItems&amp;quot;) %&amp;gt;&amp;#39;
      &amp;gt;
      &amp;lt;ItemTemplate&amp;gt;
        &amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
        &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot;
             Text=
       &amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Name&amp;quot;) 
         %&amp;gt;&amp;#39;/&amp;gt;
        &amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;
             DataSource=
    &amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;SubItems&amp;quot;) 
      %&amp;gt;&amp;#39;&amp;gt;
          &amp;lt;ItemTemplate&amp;gt;
            &amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
            &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot;
                          Text=
      &amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39; 
        /&amp;gt;
          &amp;lt;/ItemTemplate&amp;gt;
        &amp;lt;/asp:Repeater&amp;gt;
      &amp;lt;/ItemTemplate&amp;gt;
    &amp;lt;/asp:Repeater&amp;gt;
    &amp;lt;br /&amp;gt;
  &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;การแสดงผลบางส่วนของเพจอยู่ด้านล่างนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_03(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 3 เพจที่แสดง Repeater เชิงซ้อนอีกชุดหนึ่ง 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การเชื่อมโยงไปยังข้อมูลดาต้าเบสแยกสาขา&lt;/strong&gt; 
&lt;p&gt;ในตอนนี้เมื่อเรามีความรู้พื้นฐานเกี่ยวกับการเชื่อมโยงข้อมูลแยกสาขาแล้ว เราควรจะมาทดสอบกับแอพพลิเคชันที่เหมือนกับการใช้งานจริงมากขึ้นจะดีกว่า การที่การเชื่อมโยงข้อมูลส่วนใหญ่เกี่ยวข้องกับผลัพธ์ของการคิวรีดาต้าเบส ดังนั้นลำดับต่อไปเราจะดึงข้อมูลแยกสาขามาจากดาต้าเบสกัน โดยปกติแล้วข้อมูลแยกสาขาจะเก็บเอาไว้ในดาต้าเบสแบบรีเลชันแนลโดยการใช้ความสัมพันธ์หนึ่งต่อจำนวนมากระหว่างตารางต่างๆ ตัวอย่างเช่นในดาต้าเบสตัวอย่างที่ชื่อ Northwind&amp;nbsp; ที่มีอยู่ใน&amp;nbsp; SQL Server และ Microsoft Access นั้น เราจะพบความสัมพันธ์หนึ่งต่อจำนวนมากระหว่างตาราง&amp;nbsp; Customer&amp;nbsp; และตาราง&amp;nbsp; Orders สิ่งที่คล้ายคลึงกันก็คือ มีความสัมพันธ์หนึ่งต่อจำนวนมากระหว่างตาราง Orders และตาราง Order Details ด้วย ความสัมพันธ์ดังกล่าวแสดงเอาไว้ในภาพด้านล่างนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_04(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 4 ความสัมพันธ์ของตาราง 
&lt;p&gt;มีวิธีการหลายแบบที่เราสามารถใช้คิวรีข้อมูลเหล่านี้ได้ แต่เพื่อช่วยให้ง่ายที่สุดแถมยังช่วยลดจำนวนไปกลับดาต้าเบสให้เหลือแค่ครั้งเดียว ก็คือการดึงข้อมูลของตารางทั้งสามชุดไปอยู่ใน&amp;nbsp;&amp;nbsp; DataSet&amp;nbsp;&amp;nbsp; แล้วใช้ประโยชน์จากการกำหนดความสัมพันธ์ใน DataSet เพื่อนำมาตัดข้อมูลแยกสาขาบางส่วนออกมา โดยที่ Load handler ด้านล่างนี้เป็นตัวจัดการกับเรื่องนี้ จากนั้นทำการเชื่อมโยง&amp;nbsp;&amp;nbsp; DataSet&amp;nbsp;&amp;nbsp; ผลลัพธ์ให้แก่&amp;nbsp;&amp;nbsp; Repeater&amp;nbsp;&amp;nbsp; โดยใช้&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; ของ _customerRepeater&lt;pre&gt;private void Page_Load(object sender, EventArgs e)
{
  string strConn = 
       &amp;quot;server=.;trusted_connection=yes;database=northwind&amp;quot;;

  string strSql  = &amp;quot;SELECT CustomerID, CompanyName FROM &amp;quot; +
                   &amp;quot; Customers; &amp;quot;                         +
                   &amp;quot;SELECT OrderID, CustomerID, &amp;quot;         + 
                   &amp;quot;        EmployeeID FROM Orders;&amp;quot;      +
                   &amp;quot;SELECT OrderID, Products.ProductID,&amp;quot;  +
                   &amp;quot;ProductName, Products.UnitPrice FROM&amp;quot; +
                   &amp;quot; [Order Details], Products WHERE &amp;quot;    +
                   &amp;quot; [Order Details].ProductID = &amp;quot;        +
                   &amp;quot;Products.ProductID&amp;quot;;

  SqlConnection conn = new SqlConnection(strConn);
  SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
  da.TableMappings.Add(&amp;quot;Customers1&amp;quot;, &amp;quot;Orders&amp;quot;);
  da.TableMappings.Add(&amp;quot;Customers2&amp;quot;, &amp;quot;OrderDetails&amp;quot;);

  _ds = new DataSet();

  da.Fill(_ds, &amp;quot;Customers&amp;quot;);

  _ds.Relations.Add(&amp;quot;Customer_Order&amp;quot;, 
        _ds.Tables[&amp;quot;Customers&amp;quot;].Columns[&amp;quot;CustomerID&amp;quot;], 
        _ds.Tables[&amp;quot;Orders&amp;quot;].Columns[&amp;quot;CustomerID&amp;quot;]);
  _ds.Relations[0].Nested = true;
  _ds.Relations.Add(&amp;quot;Order_OrderDetail&amp;quot;, 
        _ds.Tables[&amp;quot;Orders&amp;quot;].Columns[&amp;quot;OrderID&amp;quot;], 
        _ds.Tables[&amp;quot;OrderDetails&amp;quot;].Columns[&amp;quot;OrderID&amp;quot;]);
  _ds.Relations[1].Nested = true;

  _customerRepeater.DataSource = _ds.Tables[&amp;quot;Customers&amp;quot;];
  _customerRepeater.DataBind();
}
&lt;/pre&gt;
&lt;p&gt;หลังจากที่ข้อมูลถูกโหลดเข้ามาสู่&amp;nbsp; DataSet&amp;nbsp; แล้ว ในตอนนี้เราจะสามารถค้นหาข้อมูลแยกสาขาได้ โดยการใช้ความสัมพันธ์ที่เรากำหนดขึ่นมา ตัวอย่างเช่นเมื่อเลือกแถวใดแถวหนึ่งในตาราง Customers ที่อยู่ภายใน DataSet เราสามารถเรียก&amp;nbsp; GetChildRows() พร้อมกับสตริง &amp;quot;Customer_Order&amp;quot; เพื่อดึงชุดของแถวจากตาราง Orders ที่เกี่ยวข้องกับลูกค้าคนนั้นออกมาได้ หรือขั้นตอนที่คล้ายคลึงกันก็คือเราสามารถค้นหารายการ&amp;nbsp; Order&amp;nbsp; Details ทั้งหมดที่เกี่ยวข้องกับรายการสั่งซื้อบางรายได้ โดยการเรียก&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetChildRows&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; พร้อมกับสตริง &amp;quot;Order_OrderDetail&amp;quot;&amp;nbsp; ในแถวใดแถวหนึ่งจากตาราง Orders เพื่อดึงรายการ Order Detail ทั้งหมดที่เกี่ยวข้องกับรายการสั่งซื้อนั้นขึ้นมา ถ้าหากดูจากจุดมุ่งหมายของเราแล้ว สิ่งที่มีประโยชน์มากขึ้นก็คือ CreateChildView method ของ DataRowView class ที่ส่ง DataView ซึ่งแสดงแถวทั้งหมดของความสัมพันธ์ดังกล่าวมาให้ 
&lt;p&gt;ในตอนนี้เมื่อเรามีข้อมูลที่เราเตรียมสำหรับการเชื่อมโยงข้อมูลแล้ว เราจำเป็นต้องเพิ่มคอนโทรลเชื่อมโยงข้อมูลกับข้อมูลเชิงซ้อนแต่ละระดับอย่างเหมาะสมสำหรับการแสดงผลข้อมูล สิ่งที่หมือนกับตัวอย่างก่อนหน้านี้ที่ใช้โครงสร้างข้อมูลพิเศษก็คือ ข้อมูลที่เรากำลังทำการเชื่อมโยงก็มีความลึก&amp;nbsp; 2&amp;nbsp; ระดับ ซึ่งนั่นหมายความว่าเราต้องการคอนโทรลเชิงซ้อนสองอันเพื่อแสดงผลข้อมูลย่อยแต่ละระดับ ถ้าหากพูดให้เจาะจงลงไปเราต้องการ Repeater ระดับบนสุดหนึ่งอัน เพื่อเชื่อมโยงไปหาตาราง&amp;nbsp; Customers ใน DataSet ต้องการ Repeader เชิงซ้อนอีกหนึ่งตัวเพื่อเชื่อมโยงไปยัง Orders&amp;nbsp; ทั้งหมดที่เกี่ยวข้องกับลูกค้าแต่ละราย และต้องการ Repeater เชิงซ้อนอีกหนึ่งอันเพื่อเชื่อมโยงไปยังรายการ&amp;nbsp; Order Detail ที่เกี่ยวข้องกับรายการสั่งซื้อแต่ละรายการ ส่วน DataSource ของ Repeater เชิงซ้อนทั้งสองอันจะเป็นผลลัพธ์ของการเรียก&amp;nbsp; CreateChildView&amp;nbsp; ในแถว&amp;nbsp; parent&amp;nbsp; โดยการระบุชื่อความสัมพันธ์ที่เหมาะสมลงไป ดังนั้นแทนที่จะพยายามสร้าง&amp;nbsp; DataView&amp;nbsp; ใน&amp;nbsp; expression&amp;nbsp; เพียงอันเดียว ที่อยู่ภายใน Repeater declaration วิธีการที่สะดวกกว่าก็คือการกำหนดฟังก์ชันเอาไว้ในโค้ดที่อยู่เบื้องหลังคลาสที่รับแถว parent และชื่อของความสัมพันธ์เข้ามา จากนั้นส่งกลับไปยัง DataView 
&lt;p&gt;protected DataView GetChildRelation(object dataItem, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string relation)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; DataRowView drv = dataItem as DataRowView;&lt;br /&gt;&amp;nbsp; if (drv != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return drv.CreateChildView(relation);&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br /&gt;} 
&lt;p&gt;เมื่อมีฟังก์ชันดังกล่าวและแหล่งข้อมูลพร้อมแล้ว ในตอนนี้เราสามารถเขียน&amp;nbsp; Repeater control declarations ในไฟล์ .aspx ของเราได้ ซึ่งเป็นตัวแทนของเลย์เอาท์แบบเรียบง่ายที่สุดของข้อมูลที่ใช้ breaks และ spaces&lt;pre&gt;&amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_customerRepeater&amp;quot; 
              EnableViewState=&amp;quot;false&amp;quot;&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
    Customer:
    &amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;CustomerID&amp;quot;) %&amp;gt;
   &amp;amp;nbsp; &amp;amp;nbsp;
    &amp;lt;%# DataBinder.Eval(Container.DataItem,&amp;quot;CompanyName&amp;quot;) %&amp;gt;
    &amp;lt;br /&amp;gt;
    &amp;lt;asp:Repeater runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;
         DataSource=
            &amp;#39;&amp;lt;%# GetChildRelation(Container.DataItem, 
                                  &amp;quot;Customer_Order&amp;quot;)%&amp;gt;&amp;#39;
    &amp;gt;
      &amp;lt;itemTemplate&amp;gt;
       &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
       Orderid:&amp;lt;b&amp;gt;
       &amp;lt;%#DataBinder.Eval(Container.DataItem, &amp;quot;OrderID&amp;quot;)%&amp;gt; 
       &amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;
       &amp;lt;asp:Repeater runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;
            DataSource=
                &amp;#39;&amp;lt;%# GetChildRelation(Container.DataItem, 
                                     &amp;quot;Order_OrderDetail&amp;quot;)%&amp;gt;&amp;#39;
       &amp;gt;
         &amp;lt;itemTemplate&amp;gt;
           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
           &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
           &amp;lt;b&amp;gt;&amp;lt;%# DataBinder.Eval(Container.DataItem, 
                                  &amp;quot;ProductName&amp;quot;) %&amp;gt;&amp;lt;/b&amp;gt;
           $&amp;lt;%# DataBinder.Eval(Container.DataItem, 
                                &amp;quot;UnitPrice&amp;quot;) %&amp;gt; &amp;lt;br/&amp;gt;
         &amp;lt;/itemTemplate&amp;gt;
       &amp;lt;/asp:Repeater&amp;gt;
     &amp;lt;/itemTemplate&amp;gt;
   &amp;lt;/asp:Repeater&amp;gt;
 &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;การเชื่อมโยงไปหาข้อมูล XML&lt;/strong&gt; 
&lt;p&gt;การพูดถึงข้อมูลแยกสาขาใดๆจะไม่สมบูรณ์แบบ ถ้าหากไม่ได้พูดถึง&amp;nbsp; XML&amp;nbsp; รวมลงไปด้วย เนื่องจากมันเป็นฟอร์แมทหลักของข้อมูลแยกสาขาในระบบส่วนใหญ่ของปัจจุบัน แต่การเชื่อมโยงเซิร์ฟเวอร์คอนโทรลไปยังข้อมูล XML ใน ASP.NET&amp;nbsp; มีทางเลือกไม่มากนัก ทางเลือกอย่างหนึ่งก็คือการอ่านข้อมูล&amp;nbsp; XML&amp;nbsp; ไปไว้ใน DataSet จากนั้นก็ใช้เทคนิคที่แสดงเอาไว้ในหัวข้อก่อนหน้านี้ ทางเลือกอีกแบบหนึ่งก็คือการใช้ XML API ใน .NET เพื่อโหลดข้อมูลขึ้นมาโดยตรง จากนั้นก็เชื่อมโยงกับคลาสที่ระบุเอาไว้ในข้อมูลที่โหลดขึ้นมา ทางเลือกสุดท้ายที่น่าจะเป็นทางเลือกที่ดีมากที่สุดก็คือการใช้เว็บคอนโทรล Xml พิเศษ ที่แสดงผลด้วยตนเอง โดยการแปลง XSL ไปเป็นเอกสาร XML 
&lt;p&gt;คลาส&amp;nbsp; XmlDocument ช่วยรองรับการใช้งาน XML DOM ใน .NET และสามารถใช้คู่กับคอนโทรลที่รองรับการเชื่อมโยงข้อมูลโดยตรงได้ ส่วนคลาสหลักที่ใช้ค้นหา&amp;nbsp; DOM ใน XmlDocument ก็คือ XmlNode ซึ่งใช้เป็นตัวแทนขององค์ประกอบอย่างหนึ่งในเอกสาร โชคดีสำหรับพวกเราที่คลาส XmlNode ใช้ IEnumerable เพื่อคืนค่า enumerator ไปยังลูกๆของมัน ซึ่งนั่นหมายความว่าเราสามารถใช้&amp;nbsp; XmlNode&amp;nbsp; ใดๆเป็นแหล่งข้อมูลสำหรับการเชื่อมโยงข้อมูลได้ นอกจากนั้นปรากฏว่า&amp;nbsp; XmlDocumnet&amp;nbsp; ยังได้รับมาจาก XmlNode อีกด้วย ซึ่งในรูปของเอกสาร มันจึงเป็นแค่โหนดเดียวที่มีลูกพ่วงมาด้วย ดังนั้นการค้นหาจะทำได้ง่ายดายอย่างยิ่ง โดยเราจะยกตัวอย่างเอกสาร XML ที่จัดเก็บเอาไว้ในไฟล์ publishers.xml&lt;pre&gt;&amp;lt;publishers&amp;gt;
  &amp;lt;publisher name=&amp;quot;New Moon Books&amp;quot; city=&amp;quot;Boston&amp;quot;
             state=&amp;quot;MA&amp;quot; country=&amp;quot;USA&amp;quot;&amp;gt;
    &amp;lt;author name=&amp;quot;Albert Ringer   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Is Anger the Enemy?&amp;quot; /&amp;gt;
      &amp;lt;title name=&amp;quot;Life Without Fear&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;John White   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Prolonged Data Deprivation &amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;Charlene Locksley   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Emotional Security: A New Algorithm&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;Marjorie Green   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;You Can Combat Computer Stress!&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
  &amp;lt;/publisher&amp;gt;
  &amp;lt;publisher name=&amp;quot;Binnet and Hardley&amp;quot; city=&amp;quot;Washington&amp;quot; 
             state=&amp;quot;DC&amp;quot; country=&amp;quot;USA&amp;quot;&amp;gt;
    &amp;lt;author name=&amp;quot;Sylvia Panteley   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Onions, Leeks, and Garlic&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;Burt Gringlesby   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Sushi, Anyone?&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;Innes del Castillo   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Silicon Valley Gastronomic Treats&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;Michel DeFrance   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;The Gourmet Microwave&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
    &amp;lt;author name=&amp;quot;Livia Karsen   &amp;quot;&amp;gt;
      &amp;lt;title name=&amp;quot;Computer Phobic AND Non-Phobic&amp;quot; /&amp;gt;
    &amp;lt;/author&amp;gt;
  &amp;lt;/publisher&amp;gt;
  &amp;lt;!-- ... --&amp;gt;
&amp;lt;/publishers&amp;gt;
&lt;/pre&gt;
&lt;p&gt;เราสามารถโหลดไฟล์นี้ไปไว้ในคลาส&amp;nbsp; XmlDocument&amp;nbsp; ใน&amp;nbsp; Load&amp;nbsp; handler&amp;nbsp; ของเพจได้ จากนั้นทำการเชื่อมโยงองค์ประกอบระดับบนสุดของข้อมูล Publishers ไปยัง repeater ดังนี้ 
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void Page_Load(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XmlDocument doc = new XmlDocument();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc.Load(Server.MapPath(&amp;quot;~/Publishers.xml&amp;quot;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _rep1.DataSource = doc.FirstChild;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _rep1.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;p&gt;ขั้นต่อมาเราจำเป็นต้องหาวิธีเขียนโค้ด&amp;nbsp; Repeaters&amp;nbsp; เชิงซ้อนที่จำเป็น เพื่อตัดข้อมูลบางส่วนมาจากเอกสาร XML และส่งหน้าจอไปให้ไคล์เอ็นต์ ถ้าหากดูจากสองตัวอย่างก่อนหน้านี้ เราสมารถสร้างโมเดลข้อมูลได้แบบเดียวกัน การที่เอกสารของเรามีข้อมูลอยู่สามระดับ (สำนักพิมพ์ ผู้แต่ง และชื่อเรื่อง) เราจะกำหนดคอนโทรล Repeater ขึ้นมา&amp;nbsp; 3&amp;nbsp; อัน โดยที่&amp;nbsp; Repeater&amp;nbsp; ผู้แต่งซ้อนอยู่ใน Repeater สำนักพิมพ์ และ Repeater ชื่อเรื่องซ้อนอยู่ภายใน Repeater ผู้แต่ง โดยได้โค้ดออกมาดังนี้&lt;pre&gt;&amp;lt;asp:Repeater id=&amp;quot;_rep1&amp;quot; runat=&amp;quot;server&amp;quot;
              EnableViewState=&amp;quot;false&amp;quot;&amp;gt;
  &amp;lt;itemTemplate&amp;gt;
    Publisher: &amp;lt;%# ((XmlNode)Container.DataItem).
                    Attributes[&amp;quot;name&amp;quot;].Value %&amp;gt;&amp;lt;br/&amp;gt;
    &amp;lt;asp:Repeater runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;
         DataSource=&amp;#39;&amp;lt;%# Container.DataItem %&amp;gt;&amp;#39; &amp;gt;
      &amp;lt;itemTemplate&amp;gt;
        &amp;amp;nbsp;&amp;amp;nbsp;Author: &amp;lt;%# 
          ((XmlNode)Container.DataItem)
                            .Attributes[&amp;quot;name&amp;quot;].Value 
                              %&amp;gt;&amp;lt;br/&amp;gt;
        &amp;lt;asp:Repeater runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;
                   DataSource=&amp;#39;&amp;lt;%# Container.DataItem %&amp;gt;&amp;#39; &amp;gt;
           &amp;lt;itemTemplate&amp;gt;
              &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;i&amp;gt;
           &amp;lt;%# ((XmlNode)Container.DataItem).
                         Attributes[&amp;quot;name&amp;quot;].Value %&amp;gt;
           &amp;lt;/i&amp;gt;&amp;lt;br /&amp;gt;
           &amp;lt;/itemTemplate&amp;gt;
         &amp;lt;/asp:Repeater&amp;gt;
      &amp;lt;/itemTemplate&amp;gt;
    &amp;lt;/asp:Repeater&amp;gt;
    &amp;lt;hr /&amp;gt;
  &amp;lt;/itemTemplate&amp;gt;
 &amp;lt;/asp:Repeater&amp;gt;
&lt;/pre&gt;
&lt;p&gt;และแสดงผลออกมาดังนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_05(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 5 ทดสอบการเชื่อมโยงข้อมูล 
&lt;p&gt;ขั้นตอนการเชื่อมโยงไปยังข้อมูล&amp;nbsp;&amp;nbsp;&amp;nbsp; XML&amp;nbsp;&amp;nbsp; ค่อนข้างแตกต่างจากสองตัวอย่างก่อนหน้านี้ ก่อนอื่นเราต้องขอบอกว่า Datasource&amp;nbsp; expression ที่เรากำหนดเอาไว้ค่อนข้างเรียบง่ายอย่างมาก นั่นก็คือ Container.DataItem นั่นเอง สาเหตุเนื่องจากแหล่งข้อมูลของการเชื่อมโยงข้อมูลแต่ละระดับเป็น XmlNode อันหนึ่ง ซึ่งใช้เป็นตัวกำหนดลูกๆของมัน นอกจากนั้นถ้าหากลองสังเกต เราจะพบว่าการแยกข้อมูลออกจากรายการข้อมูลปัจจุบันใช้วิธีส่ง Container.DataItem&amp;nbsp; ไปยัง&amp;nbsp; XmlNode แล้วตัด (ในกรณีนี้) attribute ออกมา ส่วน DataBinder.Eval() method ที่ปกติจะใช้งานได้อย่างสะดวกจะไม่มีประโยชน์ในกรณีนี้เนื่องจากมันถูกออกแบบให้ทำงานกับแหล่งข้อมูลดาต้าเบส ไม่ใช่แหล่งข้อมูล XML 
&lt;p&gt;โดยปกติแล้วการเชื่อมโยงข้อมูล&amp;nbsp; XML แยกสาขาอิสระโดยใช้คอนโทรลเชื่อมโยงข้อมูลมักเป็นเรื่องที่ยุ่งยากพอสมควร ตัวอย่างก่อนหน้านี้ใช้ข้อมูลที่ตัดมาจากชุดตารางดาต้าเบส ซึ่งถือเป็นเรื่องปกติและมีโครงสร้างที่ดี ซึ่งทำให้เราสามารถกำหนดชุดของคอนโทรลเชิงซ้อนที่สอดคล้องกับโครงสร้างของข้อมูลได้ แต่งานนี้จะยุ่งยากมากขึ้นถ้าหากข้อมูลผิดปกติ หรือถ้าหากข้อมูลไม่ได้แยกสาขาออกไป โดยให้คุณลองดูจากตัวอย่างเอกสาร XML ดังต่อไปนี้ 
&lt;p&gt;&amp;lt;animals&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;animal&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Dog&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;sound&amp;gt;woof&amp;lt;/sound&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;hasHair&amp;gt;true&amp;lt;/hasHair&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/animal&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;animal&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Cat&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;sound&amp;gt;meow&amp;lt;/sound&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;hasHair&amp;gt;true&amp;lt;/hasHair&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/animal&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;animal&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Pig&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;sound&amp;gt;oink&amp;lt;/sound&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;hasHair&amp;gt;false&amp;lt;/hasHair&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/animal&amp;gt;&lt;br /&gt;&amp;lt;/animals&amp;gt; 
&lt;p&gt;ถ้าหากเราใช้เทคนิคเกี่ยวกับตัวอย่างก่อนหน้านี้ เราอาจกำหนด&amp;nbsp; repeater&amp;nbsp; ระดับบนสุดหนึ่งตัวเพื่อเป็นตัวกำหนดรายชื่อของสัตว์แต่ละชนิด โดยมี repeater เชิงซ้อนอีกตัวหนึ่งเอาไว้แสดงผลสัตว์ที่อยู่ในระดับล่างลงไป 
&lt;p&gt;&amp;lt;asp:Repeater ID=&amp;quot;_animalRep&amp;quot; Runat=&amp;quot;server&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableViewState=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;false&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataSource=&amp;#39;&amp;lt;%# Container.DataItem %&amp;gt;&amp;#39; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%# ((XmlNode)Container.DataItem).InnerText %&amp;gt;&amp;lt;br &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:Repeater&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;hr /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/asp:Repeater&amp;gt; 
&lt;p&gt;อย่างไรก็ตามวิธีการนี้ไม่ค่อยดีนัก เนื่องจากมันแสดงผลข้อมูลของโหนดลูกแต่ละอัน โดยที่ไม่ได้ใช้ขององค์ประกอบที่เป็น&amp;nbsp; &amp;quot;ชื่อ&amp;quot;&amp;nbsp; แต่อย่างใด เนื่องจากไม่มีวิธีการง่ายๆที่จะบอกให้ Repeater แสดงผลแบบหนึ่งถ้าหากองค์ประกอบคือ &amp;quot;ชื่อ&amp;quot;&amp;nbsp;&amp;nbsp; แล้วแสดงผลอีกแบบหนึ่งถ้าหากองค์ประกอบเป็น&amp;nbsp;&amp;nbsp; &amp;quot;เสียง&amp;quot;&amp;nbsp;&amp;nbsp; ดังนั้นเราจึงมักต้องเขียน&amp;nbsp;&amp;nbsp; conditional expressions จำนวนมากเพื่อทำให้ XML แสดงผลในแบบที่เราต้องการได้ 
&lt;p&gt;เมื่อถึงจุดนี้สิ่งที่เห็นได้อย่างชัดเจนก็คือคอนโทรลเชื่อมโยงข้อมูลใน&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp; ไม่ได้ถูกออกแบบมาให้เชื่อมโยงกับเอกสาร&amp;nbsp; XML ที่แยกสาขาอิสระ ดังนั้นวิธีการที่สะดวกมากกว่าก็คือการใช้ภาษาแปลงสภาพ XML ชื่อ XSL ที่มีอยู่เพื่อแสดงผล&amp;nbsp; XML&amp;nbsp; แทน โดยที่ ASP.NET ได้จัดเตรียมวิธีการง่ายๆสำหรับการทำงานนี้แล้ว แม้จะเป็นการแสดงผลแค่เพียงบางส่วนของเพจโดยใช้คอนโทรล&amp;nbsp; Xml&amp;nbsp; ก็ทำได้ ระบบจะรับอินพุดเป็นเอกสาร XML จากตัวแปลงสภาพ XSL จากนั้นทำการแสดงผลโดยการนำเอาตัวแปลงสภาพไปใช้กับเอกสาร ดังนั้นถ้าหากดูจากตัวอย่างเอกสาร&amp;nbsp; XML สัตว์ต่างๆของเรา เราอาจเขียนโค้ด animal.xsl ให้มีหน้าตาแบบนี้ได้&lt;pre&gt;&amp;lt;xsl:transform 
   version=&amp;quot;1.0&amp;quot; 
   xmlns:xsl=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&amp;gt;

  &amp;lt;xsl:template match=&amp;quot;animal&amp;quot;&amp;gt;
    &amp;lt;hr /&amp;gt;
   &amp;lt;xsl:apply-templates /&amp;gt;
  &amp;lt;/xsl:template&amp;gt;

  &amp;lt;xsl:template match=&amp;quot;name&amp;quot;&amp;gt;
    &amp;lt;i&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;br/&amp;gt;
  &amp;lt;/xsl:template&amp;gt;

  &amp;lt;xsl:template match=&amp;quot;sound&amp;quot;&amp;gt;
    &amp;lt;b&amp;gt;&amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;!!!&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;
  &amp;lt;/xsl:template&amp;gt;

  &amp;lt;xsl:template match=&amp;quot;hasHair&amp;quot;&amp;gt;
    Has hair? &amp;lt;xsl:value-of select=&amp;quot;.&amp;quot; /&amp;gt;&amp;lt;br/&amp;gt;
  &amp;lt;/xsl:template&amp;gt;

&amp;lt;/xsl:transform&amp;gt;
&lt;/pre&gt;&lt;pre&gt;&amp;lt;asp:Xml Runat=&amp;quot;server&amp;quot; 
         DocumentSource=&amp;quot;animals.xml&amp;quot; 
         TransformSource=&amp;quot;animals.xsl&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;และจะได้ผลลัพธ์ออกมาดังนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_06(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 6: การแสดงผล animals.xsl &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การเรียกใช้คอนโทรลเชิงซ้อน&lt;/strong&gt; 
&lt;p&gt;จากตัวอย่างที่ผ่านมา เราเน้นไปที่การนำเสนอข้อมูลเท่านั้น แต่ไม่มีชุดข้อมูลจากผู้ใช้เลย แต่การดึงข้อมูลมาจากคอนโทรลที่เชื่อมโยงเป็นสาขาต่างๆลึกลงไปมักเป็นเรื่องที่ยุ่งยากอย่างมาก เนื่องจากเราต้องค้นหาในคอนโทรลที่ถูกสร้างขึ้นมาอยู่ตามชั้นต่างๆ จากนั้นก็ต้องดึงสภาพขึ้นมาให้ได้ วิธีการอีกแบบหนึ่งที่สะดวกมากกว่าก็คือการเพิ่มตัวแจ้งเตือนการเปลี่ยแปลงสภาพไปยังคอนโทรลที่ฝังอยู่ในคอนโทรลเชื่อมโยงข้อมูลอยู่ ดังนั้นเมื่อตัวแจ้งเตือนเริ่มทำงาน คุณก็สามารถตัดข้อมูลที่เกี่ยวข้องกับคอนโทรลตัวนั้นออกมาได้ 
&lt;p&gt;เพื่อเป็นการสาธิตการใช้เทคนิคนี้ เราสามารถใช้ตัวอย่างแรกของการเชื่อมโยง Repeater ไปยังข้อมูลพิเศษ และสร้างภาพของกรอบกาเครื่องหมายให้แก่แต่ละ&amp;nbsp; item&amp;nbsp; และ item ย่อยได้ ถ้าหากผู้ใช้กาเครื่องหมายลงไปในกรอบกาเครื่องหมายช่องใดช่องหนึ่ง แล้วส่งเพจมา เราสามารถพิมพ์ข้อเท็จจริงดังกล่าวออกมาว่าการกาเครื่องหมายที่อยู่ด้านล่างของเพจให้เป็น Label ได้ ซึ่งไฟล์ .aspx จะมีหน้าตาแบบนี้&lt;pre&gt;&amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_itemsRepeater&amp;quot; 
              EnableViewState=&amp;quot;False&amp;quot;&amp;gt;
  &amp;lt;ItemTemplate&amp;gt;
    &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot; 
         Text=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, 
                   &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39;
            OnCheckedChanged=&amp;quot;OnCheckedItem&amp;quot; /&amp;gt;
    &amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; ID=&amp;quot;_subitemsRepeater&amp;quot; 
                  EnableViewState=&amp;quot;False&amp;quot;
         DataSource=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, 
                                         &amp;quot;SubItems&amp;quot;) %&amp;gt;&amp;#39;&amp;gt;
      &amp;lt;ItemTemplate&amp;gt;
        &amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
        &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot;
             Text=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, 
                                       &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39;
             OnCheckedChanged=&amp;quot;OnCheckedItem&amp;quot; /&amp;gt;
        &amp;lt;asp:Repeater Runat=&amp;quot;server&amp;quot; EnableViewState=&amp;quot;False&amp;quot;
          DataSource=&amp;#39;&amp;lt;%# 
            DataBinder.Eval(Container.DataItem, 
                                          &amp;quot;SubItems&amp;quot;) %&amp;gt;&amp;#39;&amp;gt;
          &amp;lt;ItemTemplate&amp;gt;
            &amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;
            &amp;lt;asp:CheckBox Runat=&amp;quot;server&amp;quot;
               Text=&amp;#39;&amp;lt;%# DataBinder.Eval(Container.DataItem, 
                                         &amp;quot;Name&amp;quot;) %&amp;gt;&amp;#39; 
               OnCheckedChanged=&amp;quot;OnCheckedItem&amp;quot;/&amp;gt;
          &amp;lt;/ItemTemplate&amp;gt;
        &amp;lt;/asp:Repeater&amp;gt;
      &amp;lt;/ItemTemplate&amp;gt;
    &amp;lt;/asp:Repeater&amp;gt;
    &amp;lt;br /&amp;gt;
  &amp;lt;/ItemTemplate&amp;gt;
&amp;lt;/asp:Repeater&amp;gt;

&amp;lt;asp:Button Runat=&amp;quot;server&amp;quot; Text=&amp;quot;Submit&amp;quot; /&amp;gt;

&amp;lt;asp:Label EnableViewState=&amp;quot;False&amp;quot; Runat=&amp;quot;server&amp;quot;
           ID=&amp;quot;_message&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;p&gt;ในตอนนี้เมื่อใดก็ตามที่ไคล์เอ็นต์โพสต์เพจมา ระบบจะมีการเรียก OnCheckedItem handler ทุกครั้งสำหรับแต่ละ item ที่สภาพมีการเปลี่ยนแปลงได้ (กาเครื่องหมายเปลี่ยนไปเป็นไม่กาเครื่องหมายหรือไม่กาเครื่องหมายเปลี่ยนเป็นกาเครื่องหมาย)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; เราสามารถแยกแยะว่าคอนโทรลตัวใดมีการเปลี่ยนแปลงโดยไคล์เอ็นต์โดยดูที่&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sender parameter&amp;nbsp;&amp;nbsp; ที่ส่งไปให้ตัวจัดการเหตุการณ์ของเรา ตัวอย่างของการใช้ตัวจัดการเหตุการณ์ที่เขียนข้อความไปยังเพจระบุว่ากรอบกาเครื่องหมายมีการเปลี่ยนแปลงสภาพแสดงเอาไว้ด้านล่างนี้&lt;pre&gt;protected void OnCheckedItem(object sender, EventArgs e)
{
  CheckBox cb = sender as CheckBox;
  if (cb.Checked)
      _message.Text += string.Format(&amp;quot;{0} was checked&amp;lt;br 
        /&amp;gt;&amp;quot;, 
                                     cb.Text);
  else
     _message.Text += string.Format(&amp;quot;{0} was 
       unchecked&amp;lt;br/&amp;gt;&amp;quot;, 
                                    cb.Text);
}&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;การเชื่อมโยงแยกสาขาสำหรับ DataGrid และ DataList&lt;/strong&gt; 
&lt;p&gt;ตัวอย่างทั้งหมดที่ผ่านมาซึ่งเน้นไปที่คอนโทรล&amp;nbsp; Repeater เพื่อช่วยให้การทำงานง่ายขึ้น อย่างไรก็ตามมันเป็นไปได้ที่จะเชื่อมโยงข้อมูลแยกสาขากับทั้งคอนโทรล&amp;nbsp; DataList&amp;nbsp; และ DataGrid ได้ ที่จริงแล้วรายละเอียดของการเชื่อมโยงข้อมูลจะเหมือนกันไม่ว่าคุณจะใช้คอนโทรลตัวไหนอยู่ก็ตาม คุณสามารถนำเอาคอนโทรลเหล่านี้มาผสมผสานกันโดยสร้าง&amp;nbsp; Repeater&amp;nbsp; ที่มี DataList เชิงซ้อนได้ ตัวอย่างโค้ดของบทความนี้มีตัวอย่างที่เหมือนกับตัวอย่างการใช้ Repeater สำหรับคลาส DataList และ DataGrid ด้วย 
&lt;p&gt;คลาส&amp;nbsp;&amp;nbsp;&amp;nbsp; DatList&amp;nbsp;&amp;nbsp;&amp;nbsp; สร้างตารางขึ้นมาโดยที่เซลในตารางก็คือการสร้างแถวขึ้นมาในชุดผลลัพธ์ ถ้าหากเราใช้ DataList&amp;nbsp;&amp;nbsp; เพื่อเชื่อมผลลัพธ์แยกสาขาในตารางเชิงซ้อนที่แสดงผลอยู่จะทำให้เซลในคอนโทรลที่อยู่ระดับบนสุดบรรจุตารางทั้งหมดที่เอาไว้แสดงผลโดยคอนโทรลเชิงซ้อนได้ ภาพตัวอย่าง&amp;nbsp;&amp;nbsp; DataSet&amp;nbsp;&amp;nbsp; ของเราประกอบด้วยข้อมูล Northwind&amp;nbsp; ที่ใช้การเชื่อมโยงข้อมูลแยกสาขาสามระดับไปยัง DataList แสดงอยู่ด้านล่างนี้ (มีเซลบนสุดเพียงแค่เซลเดียวเท่านั้น) 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_07(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 7 DataSet ที่มีข้อมูลของ Northwind 
&lt;p&gt;คลาส&amp;nbsp; DataGrid สร้างตารางขึ้นมาโดยที่แต่ละแถวในตารางเป็นการแสดงผลแถวที่อยู่ในชุดผลลัพธ์ เราสามารถใช้ DataGrid&amp;nbsp; เพื่อเชื่อมโยงผลลัพธ์แยกสาขาในตารางเชิงซ้อนได้เช่นกัน แต่สิ่งที่ต่างจาก&amp;nbsp; DataList ก็คือมันขึ้นอยู่กับการตัดสินใจของคุณว่าจะใช้เซลใดเพื่อเก็บตารางเชิงซ้อนเอาไว้โดยการทำให้คอลัมน์นั้นเป็นเทมเพล็ตคอลัมน์และเพิ่ม&amp;nbsp; DataGrid&amp;nbsp; เชิงซ้อนลงไปเป็นส่วนหนึ่งของคำจำกัดความคอลัมน์ของเทมเพล็ต ภาพ DataSet ของเราประกอบด้วยข้อมูล&amp;nbsp; Northwind&amp;nbsp; ที่ใช้ข้อมูลแยกสาขา 3 ระดับเชื่อมโยงเข้าหา DataGrid เหมือนอย่างที่แสดงเอาไว้ด้านล่างนี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa478959_aspn-hierdatabinding_08(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 8 DataSet ที่มีข้อมูลของ Northwind 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ข้อจำกัดและประสิทธิภาพ&lt;/strong&gt; 
&lt;p&gt;สิ่งสำคัญที่ต้องจำเอาไว้ก็คือกลไกการเชื่อมโยงข้อมูลใน&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp; ถูกออกแบบมาเพื่อเชื่อมโยงกับแหล่งข้อมูลแบบแบนราบเท่านั้น และแม้ว่ามันสามารถใช้เพื่อเชื่อมโยงข้อมูลแยกสาขาได้เช่นกันก็ตาม แต่มันก็ไม่ใช่วิธีการที่ดีที่สุดสำหรับการแสดงผลข้อมูลแยกสาขาจริงๆแต่อย่างใด แหล่งข้อมูลจำเป็นต้องมีรูปร่างปกติ และเราไม่อาจเชื่อมโยงไปหาแหล่งข้อมูลที่ลึกลงไปสองระดับได้ในบางจุดรวมทั้งข้อมูลระดับ&amp;nbsp; 4 หรือ 5 ในจุดอื่นๆได้ ส่วน XSL เหมาะสำหรับการแสดงผลข้อมูลที่มีรูปทรงแยกสาขาที่ไม่แน่นอน ดังนั้นคุณควรแปลงข้อมูลไปเป็น&amp;nbsp; XML&amp;nbsp; และใช้&amp;nbsp; XSL แปลงสภาพร่วมกับคอนโทรล ASP Xml น่าจะเป็นทางเลือกที่ดีที่สุด 
&lt;p&gt;ถ้าสังเกตให้ดี คุณจะพบว่าตัวอย่างทั้งหมดในบทความนี้กำหนดให้&amp;nbsp; EnableViewState&amp;nbsp; flag&amp;nbsp; ในคอนโทรลเชื่อมโยงข้อมูลแต่ละอันเป็น&amp;nbsp; false&amp;nbsp; เราใช้&amp;nbsp; ViewState&amp;nbsp; เพื่อจัดเก็บสภาพแทนคอนโทรลระหว่าง POST requests ไปยังเพจเดิม โดยปกติแล้วคอนโทรลทั้งหมดในฝั่งเซิร์ฟเวอร์ของ&amp;nbsp; ASP.NET จะจัดเก็บสภาพของตนเอาไว้ระหว่าง POST&amp;nbsp; requests วิธีนี้ก่อให้เกิดความสะดวกเนื่องจากคุณสามารถใช้ประโยชน์จากสภาพที่เก็บเอาไว้ในคอนโทรลทั้งหมดของคุณได้ 
&lt;p&gt;อย่างไรก็ตามวิธีการนี้อาจทำให้เพจของคุณมีขนาดที่โตขึ้นอย่างมาก และถ้าหากคุณไม่ได้ใช้ประโยชน์จากสภาพที่เก็บเอาไว้ คุณต้องทำขั้นตอนการปิด ViewState ของคอนโทรลเหล่านี้ด้วย เทคนิคนี้จะส่งผลทำให้ ViewState โตขึ้น เนื่องจากโดยปกติเนื้อหาของคอนโทรลที่เชื่อมโยงกับข้อมูลอยู่และคอนโทรลลูกทั้งหมดจะจัดเก็บเอาไว้ใน ViewState 
&lt;p&gt;ส่วนใหญ่แล้วระบบจะไม่ได้ใช้เนื้อหาของ&amp;nbsp;&amp;nbsp;&amp;nbsp; ViewState&amp;nbsp;&amp;nbsp; เนื่องจากคอนโทรลเชื่อมโยงข้อมูลจะถูกเชื่อมโยงไปยังแหล่งข้อมูลซ้ำเมื่อได้รับคำสั่ง ไม่ว่าจะเป็นคำสั่ง&amp;nbsp; GET แรกที่ไปยังเพจหรือคำสั่ง POST ต่อๆมาที่ย้อนกลับไปยังเพจเดิมก็ตาม ดังนั้นถ้าหากคุณไม่มีเหตุผลอื่นๆที่ดีพอแล้วละก็ ผมขอแนะนำให้คุณกำหนด&amp;nbsp; EnableViewState&amp;nbsp; เป็น False&amp;nbsp;&amp;nbsp; ในคอนโทรลเชื่อมโยงข้อมูลทุกอันของคุณ โดยเฉพาะอย่างยิ่งถ้าหากคุณใช้เทคนิคเชื่อมโยงข้อมูลแยกสาขาตามที่ระบุเอาไว้ในบทความนี้ 
&lt;p&gt;แต่คุณสามารถเปิดการทำงานของ&amp;nbsp; ViewState&amp;nbsp; สำหรับคอนโทรลเชิงซ้อนในฝั่งเซิร์ฟเวอร์ที่อยู่ใน ItemTemplate ของคอนโทรลเชื่อมโยงข้อมูลได้เหมือนอย่างที่เราทำกับคอนโทรล&amp;nbsp; CheckBox ที่อยู่ภายในตัวอย่าง Repeater ของเรา แต่คุณต้องจำเอาไว้ว่าต้องปิด ViewState ของคอนโทรลเชื่อมโยงข้อมูลจริงด้วย ถ้าหากคุณเปิด ViewState ในคอนโทรล&amp;nbsp; Repeater ทั้งหมดในตัวอย่างของเราที่เชื่อมโยงกับ DataSet อยู่ คุณจะพบว่าฟิลด์ ViewState จะโตขึ้นเป็น 250,000 ตัวอักษรเลยทีเดียว ในขณะที่ตัวอักษรที่ใช้ในการแสดงผลเพจมีแค่ 100,000 ตัวอักษรเท่านั้น 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;สรุป &lt;/strong&gt;
&lt;p&gt;บทความนี้นำเสนอเทคนิคของการเชื่อมโยงไปยังข้อมูลแยกสาขาโดยการซ้อนคอนโทรลเชื่อมโยงข้อมูลเป็นชั้นๆ และค่อยๆกำหนดเข้าหาแหล่งข้อมูลของมัน เทคนิคนี้จัดว่ามีประโยชน์อย่างมากสำหรับการแสดงผลข้อมูลแยกสาขาที่มีโครงสร้างปกติที่มักพบในความสัมพันธ์ของตารางในดาต้าเบส นอกจากนั้นยังเป็นไปได้ที่จะแสดงผลแหล่งข้อมูลแยกสาขาโดยใช้เทคนิคนี้อีกด้วย แต่การทำงานจะค่อนข้างยุ่งยาก ถ้าหากข้อมูลไม่ได้มีมิติที่ปกติ เทคนิคอีกแบบหนึ่งก็คือการใช้ XSL ร่วมกับแหล่งข้อมูล XML ที่ปกติจะมีความแม่นยำมากกว่า และช่วยให้คุณควบคุมการแสดงผลได้ดีกว่าด้วย&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=58" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/databinding/default.aspx">databinding</category></item><item><title>เทคนิคการแปลง PHP ไปเป็น ASP.NET</title><link>http://coredeveloper.net/blogs/article/archive/2008/03/01/convert-php-to-asp-dot-net.aspx</link><pubDate>Sat, 01 Mar 2008 16:03:46 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:56</guid><dc:creator>admin</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=56</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/03/01/convert-php-to-asp-dot-net.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;ใช้ได้กับ&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Microsoft ASP.NET  &lt;li&gt;Microsoft Visual Basic .NET&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;b&gt;สรุป&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp;&amp;nbsp; เรียนรู้เกี่ยวกับเทคนิคการแปลงจาก&amp;nbsp; PHP&amp;nbsp; ไปเป็น&amp;nbsp; ASP.NET&amp;nbsp; เรียนรู้เกี่ยวกับคุณสมบัติ&amp;nbsp; ฟังก์ชัน&amp;nbsp; และโครงสร้างของระบบทั้งสองชนิด&lt;/p&gt; &lt;p&gt;บทความชิ้นนี้จะพูดถึงวิธีการแปลงจาก&amp;nbsp; PHP (PHP:Hypertext Preprocessor 4) ไปเป็น ASP.NET โดยจะทำการเปรียบเทียบจุดเหมือนและจุดต่างระหว่างซินแทกซ์พื้นฐานของ&amp;nbsp; PHP&amp;nbsp; กับ&amp;nbsp; Microsoft Visual Basic .NET รวมทั้งฟังก์ชันและโครงสร้างที่อยู่ภายในระบบทั้งสองชนิดอีกด้วย &lt;/p&gt; &lt;p&gt;แม้ว่าทั้ง&amp;nbsp; PHP และ ASP.NET ยอมให้คุณสร้างเว็บแอพพลิเคชันที่ซับซ้อนขึ้นมาได้เหมือนกันก็ตาม (อาทิเช่นเว็บไซต์อีคอมเมิร์ซ&amp;nbsp; อินทราเน็ต และประตูท่าสู่องค์กร) แต่ PHP และ ASP.NET ก็มีข้อแตกต่างกันหลายประการเชนกัน สิ่งที่ต่างจาก&amp;nbsp; PHP ก็คือ ASP.NET ไม่ใช่ภาษาหรือ parser แต่ ASP.NET เป็นชุดเทคโนโลยีซึ่งอยู่ใน Microsoft .NET&amp;nbsp; Framework&amp;nbsp; ที่ใช้สำหรับสร้างเว็บแอพพลิเคชันและเว็บเซอร์วิส&amp;nbsp; XML ขึ้นมามากกว่า เพจของ Microsoft ASP.NET&amp;nbsp; จะประมวลผลในเซิร์ฟเวอร์เหมือนกับ&amp;nbsp; PHP&amp;nbsp; จากนั้นก็สร้างมาร์กอัพขึ้นมา&amp;nbsp; อาทิเช่น HTML, WML หรือ XML&amp;nbsp; เป็นต้น&amp;nbsp; ซึ่งจะถูกส่งไปยังพีซีหรือโมไบล์แอพพลิเคชันอีกต่อหนึ่ง ส่วน ASP.NET ต่างออกไปในแง่ที่ว่ามันเป็นโมเดลเขียนโปรแกรมที่อิงกับเหตุการณ์ในรูปของออปเจ็กต์ประสิทธิภาพสูง&amp;nbsp; ซึ่งใช้สำหรับการพัฒนาเว็บเพจขึ้นมาได้พร้อมทั้งยังคงรูปแบบที่เรียบง่าย ซึ่งนักพัฒนา PHP คุ้นเคยเอาไว้เหมือนเดิม &lt;/p&gt; &lt;p&gt;แอพพลิเคชันของ&amp;nbsp; ASP.NET อิงกับแนวทาง Object Oriented Programming (OOP) ประสิทธิภาพสูง แทนที่จะใช้แนวทางการเขียนสคริปท์ขึ้นมา&amp;nbsp; วิธีการของไมโครซอฟท์จะช่วยให้มีการใช้คุณสมบัติ&amp;nbsp; OOP&amp;nbsp; ได้อย่างมีประสิทธิภาพมากกว่า&amp;nbsp; อาทิเช่น&amp;nbsp; inheritance, encapsulation และ reflection เป็นต้น แม้ว่าการทำงานแบบพื้นๆส่วนใหญ่สามารถแปลงจาก&amp;nbsp; PHP ไปเป็น ASP.NET ได้โดยง่ายก็ตาม แต่เราไม่อาจแปลงแอพพลิเคชันที่ซับซ้อนจาก PHP ไปเป็น&amp;nbsp; ASP.NET&amp;nbsp; ได้โดยง่าย และจำเป็นต้องมีการวางแผนอย่างรอบคอบเสียก่อน รวมทั้งต้องอิงกับแนวทาง OOP ให้มากขึ้นกว่าเดิมอีกด้วย &lt;/p&gt; &lt;p&gt;เนื้อหาของบทความนี้&amp;nbsp; เราคาดหวังว่าผู้อ่านมีประสบการณ์เกี่ยวกับ PHP การเขียนโปรแกรม และการพัฒนาซอฟต์แวร์เป็นอย่างดีอยู่แล้ว&amp;nbsp; เราจะเริ่มต้นเนื้อหาของบทความโดยทำการเปรียบเทียบข้อแตกต่างของโครงสร้าง รวมทั้งพูดถึงโมเดลการพัฒนาแบบ&amp;nbsp;&amp;nbsp; OOP&amp;nbsp; ตามด้วยการเปรียบเทียบคุณสมบัติ&amp;nbsp; ต่อด้วยการเปรียบเทียบซินแทกซ์และการทำงานพื้นฐานที่ใช้ในการพัฒนาเว็บแอพพลิเคชันโดยใช้ PHP และ ASP.NET &lt;/p&gt; &lt;p&gt;&lt;b&gt;หมายเหตุ&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&amp;nbsp; ถ้าหากคุณไม่ต้องการศึกษารายละเอียดวิธีการแปลงโปรแกรม แต่ต้องการทดสอบ ASP.NET เราขอแนะนำให้คุณข้ามไปยังหัวข้อ &amp;quot;คำแนะนำสำหรับการทำงานขั้นต่อไป&amp;quot; ได้เลย&lt;/p&gt; &lt;h2&gt;เปรียบเทียบโครงสร้าง&lt;/h2&gt; &lt;p&gt;ถ้าหากคุณอ่านเนื้อหาส่วนที่เป็นการเปรียบเทียบซินแทกซ์และภาษาในช่วงท้ายบทความนี้แล้ว&amp;nbsp; คุณจะพบว่า&amp;nbsp; PHP&amp;nbsp; และ ASP.NET&amp;nbsp; มีความคล้ายคลึงกันอย่างมากในแง่ของฟังก์ชันและซินแทกซ์&amp;nbsp; อย่างไรก็ตาม PHP แตกต่างจาก ASP.NET อย่างมากที่โครงสร้างระดับล่าง&amp;nbsp;&amp;nbsp; โดยที่&amp;nbsp;&amp;nbsp; PHP&amp;nbsp;&amp;nbsp; อิงอยู่กับโพรเซสเซอร์/กลไกซึ่งไม่ผูกติดกับแพลตฟอร์มที่ประมวลผลสคริปท์ PHP เพื่อใช้สำหรับการติดต่อกับดาต้าเบส การทำงานตามเงื่อนไขของอินเทอร์เน็ตโพรโตคอล และงานพื้นฐานอื่นๆอีกมากสำหรับเว็บแอพพลิเคชันแพลตฟอร์ม &lt;/p&gt; &lt;p&gt;ส่วน&amp;nbsp; ASP.NET เป็นเฟรมเวิร์กที่สร้างขึ้นมาจากเทคโนโลยีหลายชนิด อาทิเช่น CLR เป็นต้น แถมยังมีคลาสไลบราลีเป็นระเบียบที่กว้างขวางครอบคลุม&amp;nbsp; เพื่อนำไปใช้เป็นชุดฟังก์ชันส่วนใหญ่ที่ใช้ในเว็บแอพพลิเคชันได้&amp;nbsp; นอกจากนั้นคุณยังสามารถสร้างคอมโพเน้นต์เพื่อขยายขอบเขตการทำงานของเฟรมเวิร์กได้โดยง่ายอีกด้วย &lt;/p&gt; &lt;p&gt;แม้&amp;nbsp; PHP มีองค์ประกอบที่คล้ายคลึงกัน (อาทิเช่นไลบราลี PEAR) ก็ตาม แต่ PHP และ ASP.NET ก็ไม่ได้เหมือนกันเสียทีเดียว&amp;nbsp; เนื่องจากเฟรมเวิร์ก&amp;nbsp; ASP.NET สร้างขึ้นมาใหม่บนแนวทาง OOP และแนวคิดของ OOP แต่ PHP กลับไม่ได้เป็นแบบนั้น&amp;nbsp; ความแตกต่างดังกล่าวจะเห็นได้อย่างชัดเจนมากขึ้นในตอนที่คุณเรียกใช้คลาสและออปเจ็กต์ใน PHP และ ASP.NET&lt;/p&gt; &lt;h2&gt;การเขียนโปรแกรมเชิงออปเจ็กต์ใน PHP และ ASP.NET&lt;/h2&gt; &lt;p&gt;ทั้ง&amp;nbsp; PHP&amp;nbsp; และ&amp;nbsp; ASP.NET ใช้แนวทาง OOP ในการพัฒนาแอพพลิเคชันเหมือนกัน แต่ทว่าการทำงานกับแนวคิด OOP แบบต่างๆกลับแตกต่างกันออกไป&amp;nbsp; อาทิเช่น&amp;nbsp; encapsulation&amp;nbsp; และ&amp;nbsp; polymorphism เป็นต้น ตัวอย่างเช่น PHP รองรับการทำ encapsulation ได้เพียงบางส่วนเท่านั้น (อาทิเช่นการกำหนด methods และฟิลด์ในคลาสเป็นต้น) และทำ&amp;nbsp; polymorphism ได้เพียงบางส่วน (ไม่มี overloading ไม่มี abstraction) นอกจากนั้น PHP ยังขาดแนวคิดหลายอย่างไปอาทิเช่นการไม่สามาารถกำหนดให้ฟังก์ชันเป็นแบบ&amp;nbsp; private,&amp;nbsp; public หรือ protect ในคลาส&amp;nbsp; รวมทั้ง&amp;nbsp; overloading&amp;nbsp; ด้วย แม้ว่าผู้ที่สนับสนุน OOP อาจออกมาแย้งว่า ASP.NET และภาษาอื่นๆก็ไม่ได้ใช้งานกับแนวคิดทุกอย่างของแนวทาง&amp;nbsp; OOP&amp;nbsp; เช่นกัน คำพูดดังกล่าวเป็นความจริงที่เกิดขึ้นกับภาษาส่วนใหญ่ที่ทำงานแบบ OOP ได้อาทิ C++ และจาวาเป็นต้น &lt;/p&gt; &lt;p&gt;เรื่องนี้มีทั้งข้อดีและข้อเสีย&amp;nbsp; ข้อเสียก็คือนักพัฒนาเว็บบางคนอาจจะต้องเสียเวลาในการเรียนรู้&amp;nbsp; ASP.NET&amp;nbsp; นานกว่า PHP&amp;nbsp; เนื่องจาก PHP ใช้แนวทางการเขียนสคริปท์ที่นักพัฒนาใช้ในการสร้างเว็บไซต์อยู่แล้ว อย่างไรก็ตามนักพัฒนาที่มีภูมิหลังเรื่องภาษา OOP และ/หรือ Vwill จะคุ้นเคยและเรียนรู้ ASP.NET ได้โดยง่ายเช่นกัน &lt;/p&gt; &lt;p&gt;ข้อดีของการที่&amp;nbsp; ASP.NET&amp;nbsp; สนับสนุนแนวคิด&amp;nbsp; OOP หมายความว่าแอพพลิเคชัน ASP.NET ส่วนใหญ่จะมีโค้ดที่ออกแบบมาดีกว่า&amp;nbsp; แยกแยะเนื้อหาโลจิกและข้อมูลได้ชัดเจนมากกว่า&amp;nbsp; ดังนั้นการให้บริการตลอดวงจรชีวิตการใช้แอพพลิเคชันที่ยาวนานจึงทำได้ง่ายกว่า&amp;nbsp;&amp;nbsp; นอกจากนั้นการที่&amp;nbsp; ASP.NET&amp;nbsp; สามารถทำงานกับเทคโนโลยีเอนเตอร์ไพรซ์ชนิดต่างๆได้โดยตรง&amp;nbsp; อาทิเช่น&amp;nbsp; Message&amp;nbsp; Queuing,&amp;nbsp; Transactions (พบได้ในคลาส System EnterpriseServices ของ&amp;nbsp; .NET&amp;nbsp; Framework) SNMP และเว็บเซอร์วิสเป็นต้น ดังนั้นการพัฒนาแอพพลิเคชันประสิทธิภาพสูงที่ขยายระบบได้จึงทำได้ง่ายกว่า &lt;/p&gt; &lt;p&gt;คุณสามารถอ่านเนื้อหาเบื้องต้นขององค์ประกอบหลักสำหรับการเขียนโปรแกรมเชิงออปเจ็กต์&amp;nbsp;&amp;nbsp; (จากมุมมองของภาษา Visual Basic) ในหัวข้อ Object-Oriented Programming ใน Visual Basic&lt;/p&gt; &lt;h2&gt;การคอมไพล์&lt;/h2&gt; &lt;p&gt;&lt;b&gt;PHP&lt;/b&gt;&lt;/p&gt; &lt;p&gt;เมื่อมีการเรียกเพจ&amp;nbsp; PHP&amp;nbsp; ระบบจะทำการคอมไพล์&amp;nbsp; HTML&amp;nbsp; และสคริปท์&amp;nbsp; PHP&amp;nbsp; ไปเป็น&amp;nbsp; Zend Opcodes โดยที่ Opcodes&amp;nbsp;&amp;nbsp; เป็นคำสั่งไบนารีระดับต่ำที่ใช้เพื่อรองรับการทำงานของเพจ&amp;nbsp;&amp;nbsp; PHP&amp;nbsp; ซึ่งเมื่อมีการคอมไพล์แล้ว&amp;nbsp; Zend Engines&amp;nbsp; จะสั่งงาน&amp;nbsp; opode&amp;nbsp; (คล้ายคลึงกับวิธีการที่กลไกรันไทม์ของจาวาสั่งงานไบท์โค้ด)&amp;nbsp; จากนั้นก็มีการสร้าง HTML ขึ้นมาแล้วส่งไปยังไคล์เอ็นต์&lt;/p&gt; &lt;p&gt;ในตลาดมีผลิตภัณฑ์เชิงพาณิชย์หลายชนิดที่สามารถนำมาใช้เพื่อเพิ่มความเร็วในการประมวลผลเพจ&amp;nbsp;&amp;nbsp;&amp;nbsp; PHP&amp;nbsp;&amp;nbsp; ได้โดยการปรับแต่งให้&amp;nbsp; opcodes ทำงานได้อย่างเต็มประสิทธิภาพ วิธีการอื่นๆที่ช่วยเพิ่มประสิทธิภาพของสคริปท์ PHP ประกอบด้วยการทำแคชให้แก่ opcode และการทำแคชให้แก่ HTML ที่สร้างขึ้นมาเป็นต้น&lt;/p&gt; &lt;p&gt;&lt;b&gt;ASP.NET&lt;/b&gt;&lt;/p&gt; &lt;p&gt;เมื่อมีคำสั่งส่งไปยัง&amp;nbsp; IIS&amp;nbsp; (Internet Information Services) หรือเว็บเซิร์ฟเวอร์ชนิดอื่นๆเพื่อเรียกเพจ .aspx&amp;nbsp; (หรือนามสกุลอื่นๆที่ใช้กับ ASP.NET ได้) คำสั่งจะถูกส่งไปยัง ASP.NET เพื่อทำการประมวลผล ถ้าหากเป็นการเรียกเพจเป็นครั้งแรก&amp;nbsp; ASP.NET&amp;nbsp; จะทำการคอมไพล์เพจไปเป็น&amp;nbsp; MSIL (ภาษาที่ใช้ชั่วคราวของไมโครซอฟท์) จากนั้น CLR (common language runtime) จะทำการประมวลผลโค้ด MSIL ไปเป็นภาษาเครื่อง ต่อมาคำสั่งจะเริ่มทำงานโดยใช้โค้ดที่คอมไพล์แล้ว โค้ดภาษาเครื่องชุดนี้จะจัดการกับคำสั่งครั้งต่อๆไปเอง ถ้าหากเพจไม่มีการแก้ไข&lt;/p&gt; &lt;p&gt;สิ่งสำคัญที่ต้องบอกเอาไว้ก็คือไบนารีโค้ดซึ่งสร้างขึ้นมาโดย&amp;nbsp; CLR จะสมบูรณ์แบบมากที่สุดอยู่แล้ว โดยไม่จำเป็นต้องใช้ผลิตภัณฑ์เสริมเพื่อทำให้ประสิทธิภาพดีขึ้น&lt;/p&gt; &lt;p&gt;สิ่งสำคัญอีกอย่างหนึ่งก็คือทุกอย่างใน&amp;nbsp; ASP.NET จะถูกคอมไพล์เป็นภาษาเครื่องก่อนที่จะทำงาน แม้แต่ข้อความ HTML ก็จะถูกแปลงไปเป็น&amp;nbsp; string&amp;nbsp; literal control และถูกใส่เอาไว้เรียงตามลำดับที่ถูกต้องในโครงสร้างควบคุมก็ตาม&lt;/p&gt; &lt;h2&gt;เปรียบเทียบคุณสมบัติ&lt;/h2&gt; &lt;table class="" border="1" cellspacing="0" cellpadding="4" width="700"&gt;  &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p align="center"&gt;คุณสมบัติ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p align="center"&gt;&lt;b&gt;PHP&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p align="center"&gt;&lt;b&gt;ASP.NET&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;ภาษาที่ใช้เขียนโค้ด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;C, ภาษาเขียนสคริปทสไตล์ C++ พร้อมกับใช้ mark up สไตล์ ASP รุ่นเก่า รองรับแนวคิด OOP ได้บางส่วน&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ใช้ได้กับ&amp;nbsp; 25 ภาษา แต่ภาษาที่ได้รับความนิยมมากที่สุด 2 ชนิดก็คือ Visual Basic .NET และ C# นักพัฒนาส่วนใหญ่เลือกใช้ภาษาเพียงภาษาเดียว แต่สามารถใช้ร่วมกับคอมโพเน้นต์ที่เขียนขึ้นมาจากภาษาอื่นๆใน 25 ภาษานี้ได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;แนวคิดเรื่องแอพพลิเคชันที่คอมไพล์แล้ว&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;สามารถคอมไพล์และสั่งงานเป็นโปรแกรมที่ประมวลผลได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ทำได้ ทั้งในรูปของการคอมไพล์ขณะทำงาน และการคอมไพล์เอาไว้ก่อน&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำแคชเพจเอาท์พุดทั้งหมด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ไม่มีบริการโดยตรง&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ทำได้&amp;nbsp; สามารถทำแคชเพจเวอร์ชันต่างๆโดยอิงกับตัวแปรตั้งแต่หนึ่งแบบขึ้นไปของ URL ประเภทของบราวเซอร์ ฟังก์ชันเฉพาะ หรือเงื่อนไขผสมผสานอื่นๆ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำแคชเพจเอาท์พุดบางส่วน&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ไม่มีบริการโดยตรง&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;มีบริการในตัวผ่านการใช้&amp;nbsp; User&amp;nbsp; Controls&amp;nbsp; เราสามารถทำแคชข้อมูลและออปเจ็กต์อื่นๆ&amp;nbsp; พ่วงกับการกำหนดกฎเกณฑ์หมดอายุการใช้งานที่ซับซ้อนได้โดยใช้ Cache API ก็ได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การเรียกใช้ดาต้าเบส&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;มีไดรเวอร์สำหรับดาต้าเบสส่วนใหญ่ที่มีอยู่ในตลาด รวมทั้งดาต้าเบสแบบเปิดเผยซอร์ซโค้ดด้วย&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;รองรับการทำงานกับ&amp;nbsp; OLE-DB&amp;nbsp; และ&amp;nbsp; ODBC&amp;nbsp; โดยตรง&amp;nbsp; รวมทั้งมีไดรเวอร์โดยตรงสำหรับ&amp;nbsp; Microsoft&amp;nbsp; SQL Server และ Oracle อีกด้วย&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;ดาต้าเบสเอาท์พุด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ชุดข้อมูลจะถูกส่งกลับมาในรูปตัวแปรของ PHP และสามารถส่งเอาท์พุดออกไปเหมือนกับตัวแปรอื่นๆ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ทำเท็มเพล็ตการเชื่อมข้อมูลไปยังระบบควบคุมในฝั่งของเซิร์ฟเวอร์เพื่อช่วยให้การพัฒนาทำได้ง่ายขึ้น&amp;nbsp; หรือทำลูปด้วยตนเองก็ได้ตามความพอใจ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;คอมโพเน้นท์ภายนอก&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;นักพัฒนาสามารถเรียกแพกเก็จได้หลายชนิด&amp;nbsp; และยังสามารถแก้ไขกลไก&amp;nbsp; Zend&amp;nbsp; ได้โดยตรงอีกด้วย เนื่องจากเป็นซอฟต์แวร์แบบเปิดเผยซอร์ซโค้ด นอกจากนั้นโปรแกรมเมอร์ที่รับผิดชอบ Zend อยู่กำลังหาทางทำให้ PHP เรียกใช้ออปเจ็กต์ของ .NET ได้อีกด้วย&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;รองรับการทำงานของไลบราลี&amp;nbsp; C และออปเจ็กต์ COM ได้ดีมาก รวมทั้งแอลเซมบลีที่สร้างขึ้นมาโดยใช้ภาษาต่างๆที่ตรงตามมาตรฐาน .NET อาทิเช่น Managed C++ เป็นต้น แต่ไม่มีบริการออปเจ็กต์ CORBA หรือจาวาคลาสโดยตรง&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;XML/XSLT&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ทำงานผ่านแพกเก็จเสริมและไลบราลี&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;มีบริการที่ใช้ง่ายและครอบคลุมสำหรับ&amp;nbsp; XML&amp;nbsp; DOM,&amp;nbsp; XSLT,&amp;nbsp; ระบบตรวจสอบความถูกต้องและมี&amp;nbsp; lightweight stream-oriented parsing สำหรับเอกสาร XML ด้วย&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;XML เว็บเซอร์วิส&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ในปัจจุบันมีการพัฒนาแพกเก็จ&amp;nbsp; PHP&amp;nbsp; ให้รองรับการทำงานเว็บเซอร์วิสโดยอิงกับกลไก Apahe AXIS รวมทั้งกลไกอื่นๆด้วย&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ซอฟต์รุ่นปัจจุบันใช้งานกับ&amp;nbsp; XML เว็บเซอร์วิสได้อย่างครบถ้วนและคล่องตัว ซึ่งจะทำให้การเผยแพร่และใช้เว็บเซอร์วิสทำได้ง่ายมาก&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;สภาพของเซสชัน&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;บริหารเซสชันโดยอิงกับคุ๊กกี้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;สภาพเซสชันโดยอิงกับคุ๊กกี้หรือไม่มีคุ๊กกี้ก็ได้โดยใช้&amp;nbsp; in-memory&amp;nbsp; store&amp;nbsp; ในเซิร์ฟเวอร์เพียงเครื่องเดียว เซิร์ฟเวอร์จุดศูนย์กลาง&amp;nbsp;&amp;nbsp; หรือดาต้าเบสแบกเอนด์ก็ได้&amp;nbsp;&amp;nbsp; นอกจากนั้นโครงสร้างที่ขยายขอบเขตได้ยังช่วยให้มีการสร้างโมดูลสภาพเซสชันลักษณะเฉพาะขึ้นมา&amp;nbsp; เพื่อนำไปใช้แทนที่ออปชันต่างๆที่มีอยู่เดิมก็ได้ เซสชันที่ไม่มีคุ๊กกี้อาศัยการแก้ไขตัวแปรเพียงชุดเดียวก็ใช้งานได้แล้ว&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;ฟังก์ชันในตัว&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;PHP&amp;nbsp; มีฟังก์ชันในตัวที่ครอบคุมงานพื้นฐานต่างๆที่เว็บแอพพลิชันต้องทำ&amp;nbsp; นอกจากนั้น&amp;nbsp; PHP ยังเรียกใช้จาวาคลาสไลบราลีได้ โดยการเขียนโปรแกรมพิเศษเพิ่มเติม&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ASP&amp;nbsp; .NET&amp;nbsp; สามารถเรียกใช้คลาสไลบราลีทั้งหมดของ .NET Framework ได้ ซึ่งประกอบด้วยฟังก์ชันเป็นจำนวนมาก&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;regular expression&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;รองรับซินแทกซ์ expression ปกติที่คอมแพททิเบิลกับ POSIX และ Perl&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;รองรับซินแทกซ์&amp;nbsp; regular&amp;nbsp; expression ที่คอมแพตทิเบิลกับ Perl-5 พร้อมทั้งมีคุณสมบัติอื่นๆเพิ่มเติมอีกอาทิเช่นการจับคู่จากขวาไปซ้าย&amp;nbsp; express&amp;nbsp; ที่คอมไพล์ไว้แล้ว&amp;nbsp; การตั้งชื่อ&amp;nbsp; groups ใช้กับ Unicode ได้อย่างเต็มที่ นอกจากนั้นยังยอมให้ผู้ใช้กำหนดให้มีการเรียกฟังก์ชันได้ในช่วงขั้นตอนการเปลี่ยน regular expression อีกด้วย&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การดีบัก&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;PHP ไม่ได้มีการดีบักที่กว้างขวางครอบคลุมมากนัก แต่โปรแกรมของบริษัทซอฟต์แวร์อื่นๆและ Zend ยอมให้มีการดีบักและการทดสอบเพิ่มขึ้นได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;มีระบบติดตามผลและข้อมูลสภาพแวดล้อมที่ครอบคลุมที่สามารถใส่ลงไปในเพจหรือแสดงผลในเพจต่างหากก็ได้&amp;nbsp;&amp;nbsp; โปรแกรม&amp;nbsp; Microsoft Visual Studio .NET ยอมให้มีการดีบักเพจขณะที่กำลังประมวลผลได้ นอกเหนือจากการดีบักสคริปท์ในฝั่งไคล์เอ็นต์และ stored procedures ของ SQL Server แล้ว&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;ระบบจัดการความผิดพลาด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ไม่มีบริการดักความผิดพลาด แต่มีฟังก์ชันจัดการและบันทึกความผิดพลาด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;รองรับการทำงานของ&amp;nbsp; structured&amp;nbsp; exception handling (นอกเหนือจากด่านป้องกัน &amp;quot;ขั้นสุดท้าย&amp;quot; สำหรับโค้ดที่ประมวลผลไม่ว่าจะมีความผิดพลาดเกิดขึ้นหรือไม่ก็ตาม),&amp;nbsp; raising&amp;nbsp; customer&amp;nbsp; exceptions และการกำหนด custom error pages สำหรับความผิดพลาดที่ไม่อาจแก้ไขได้แบบต่างๆ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;ระบบปรับแต่งภาพ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ไม่มีบริการในตัวโดยตรง แต่ใช้ร่วมกับคอมโพเน้นต์ของบริษัทซอฟต์แวร์อื่นๆได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;มีคุณสมบัติการสร้างและปรับแต่งภาพจำนวนมาก (ดูที่คลาส System Drawing ของ .NET Framework)&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การนำโค้ดกลับมาใช้ใหม่&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ฟังก์ชันที่ผู้ใช้กำหนดเอง มีความสามารถในการสร้าง Classes และใส่ไฟล์ลงไปได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;User Controls, Server Controls, คลาสลักษณะเฉพาะตัว และใส่ไฟล์ลงไปได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำงานหลายๆงานพร้อมกัน&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;PHP มีโมเดลการทำงานหลายๆงานพร้อมกันที่ดี&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;รองรับการทำงานได้อย่างเต็มที่&amp;nbsp; ซึ่งไม่เพียงแต่เรียกเพจพร้อมกันในงานแยกจากกันแล้ว และถ้าจำเป็นแต่ละเพจยังสร้างงานของตนเองขึ้นมา เพื่อทำพร้อมกันหรือทำงานต่างช่วงเวลากันก็ได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำแคชข้อมูล&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;มีคุณสมบัติการทำแคชข้อมูลในตัวจำกัด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;มี&amp;nbsp; cache API ที่ทำงานได้อย่าครอบคลุม เพื่อจัดเก็บข้อมูลแทบทุกประเภท (อาทิเช่นผลลัพธ์การคิวรีดาต้าเบสเป็นต้น)&amp;nbsp;&amp;nbsp; โดยมีจุดสิ้นสุดการใช้งานโดยอิงกับเวลา&amp;nbsp;&amp;nbsp; การใช้งาน&amp;nbsp; หรือการอ้างอิงกับไฟล์อื่นๆหรือข้อมูลอื่นๆในแคชก็ได้ นอกจากนั้นเรายังสามารถเรียกฟังก์ชันที่ผู้ใช้กำหนดขึ้นมาเองได้เมื่อข้อมูลบางอย่างหายไปจากแคชแล้ว&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำงานกับภาษาต่างๆ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ใช้กับ Unicode ได้อย่างเต็มที่&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ใช้งานกับสตริง&amp;nbsp; Unicode&amp;nbsp; และการเข้ารหัสตัวอักษรแบบต่างๆหลายชนิด ส่วนฟังก์ชันวันที่ ตัวเลข และสกุลเงินจะอิงกับการใช้งานในประเทศต่างๆ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; และจะมีการปรับแต่งเอาท์พุดขึ้นอยู่กับการกำหนดประเทศปัจจุบันแทนที่จะต้องเรียกฟังก์ชันอีกชนิดหนึ่ง) รองรับการใช้ resource files เพื่อแปลงแอพพลิเคชันให้เหมาะสมกับการใช้งานในประเทศต่างๆได้ในทันที&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;SMTP, HTTP, FTP, POP3&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ใช้งานกับอินเทอร์เน็ตโพรโตคอลหลากชนิดได้โดยตรง&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;บริการ&amp;nbsp; SMTP&amp;nbsp; จะขึ้นอยู่กับ ITS SMTP Service ส่วนบริการ HTTP จะทำงานได้เป็นอย่างดี แม้ .NET ไม่มีบริการ&amp;nbsp; FTP หรือ POP3 ก็ตาม แต่ผู้ใช้ยังสามารถหาคอมโพเน้นต์ที่วางจำหน่ายหรือแจกฟรีมาใช้สำหรับฟังก์ชันดังกล่าวได้&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;สภาพแวดล้อมในการพัฒนาแบบเบ็ดเสร็จ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;มีเครื่องมือพัฒนาจำนวนมากที่มีคุณสมบัติหลากหลายให้เลือกใช้ได้ฟรีไปจนถึงรุ่นที่มีราคาหลายร้อยดอลลาร์&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;มีเครื่องมือแจกฟรีสำหรับการพัฒนา&amp;nbsp; ASP.NET จากไมโครซอฟท์ที่ชื่อว่า ASP .NET Web Matrix ส่วนเครื่องมือที่ได้รับความนิยมมากที่สุดก็คือ&amp;nbsp; Visual&amp;nbsp; Studio&amp;nbsp; .NET ใช้ได้กับภาษา .NET ทุกชนิด มีเครื่องมือดาต้าเบสสำหรับสร้าง&amp;nbsp; SQL และทดสอบดาต้าเบส มีเครื่องมืออกแบบเว็บที่มีระบบควบคุมเวอร์ชัน ระบบดีบักที่ทันสมัยและคุณสมบัติอื่นๆอีกมากในตัว&amp;nbsp; ถ้าต้องการดูรายชื่อเครื่องมือทั้งหมดให้เข้าไปดูได้ที่&amp;nbsp; MSDN Visual Studio Developer Center ส่วนเครื่องมืออื่นๆอาทิเช่น&amp;nbsp; Borland&amp;nbsp; C# Builder และ Macromedia Dreamweaver MX ก็รองรับการทำงานของ ASP.NET ได้เช่นกัน&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำงานกับเว็บเซิร์ฟเวอร์&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="232"&gt; &lt;p&gt;ใช้งานกับเว็บเซิร์ฟเวอร์ได้เกือบทุกชนิด&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="235"&gt; &lt;p&gt;ใช้ได้กับ IIS และ Apache 2.0 เวอร์ชันเชิงพาณิชย์ของ Covalent&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td class="" valign="top" width="231"&gt; &lt;p&gt;การทำงานกับระบบปฏิบัติการ&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="264"&gt; &lt;p&gt;สามารถแปลงไปใช้ได้กับโอเอสแทบทุกชนิด&amp;nbsp;&amp;nbsp; อาทิเช่น&amp;nbsp; Microsoft&amp;nbsp; Windows,&amp;nbsp; Mac,&amp;nbsp; OS&amp;nbsp; X,&amp;nbsp; Amiga, Solaris, Free BSD, Linux, AIX และอื่นๆอีกมาก&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td class="" valign="top" width="307"&gt; &lt;p&gt;ปัจจุบันใช้ได้กับ Windows 2000, Windows XP และ Windows Sever 2003 เท่านั้น&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;h2&gt;การเปรียบเทียบซินแทกซ์และงานพื้นฐานต่างๆ&lt;/h2&gt; &lt;p&gt;หัวข้อต่อไปนี้จะเป็นการเปรียบเทียบระหว่างซินแทกซ์ของ PHP และ .NET รวมทั้งการเขียนโปรแกรมพื้นฐานต่างๆ&lt;/p&gt; &lt;p&gt;&lt;b&gt;การเขียนคอมเมนต์&lt;/b&gt;&lt;/p&gt; &lt;p&gt;PHP&amp;nbsp; ยอมให้คุณใส่ความเห็นลงไปในโค้ดโดยใช้&amp;nbsp; C,&amp;nbsp; C++&amp;nbsp; และซินแทกซ์สไตล์เชลล์ของ&amp;nbsp; Unix&amp;nbsp; ข้อความที่อยู่ในกรอบความเห็นจะไม่ถูกประมวลผล โดยทั่วไปแล้ว ถ้าหากต้องการใส่ความเห็นลงไปในโค้ด Visual Basic .NET ใน ASP.NET คุณก็เพียงแต่ใช้ &amp;lt;%-- เพื่อเปิด Comment และใช้ --%&amp;gt; เพื่อปิด โค้ดตัวอย่างชุดที่ 1 แสดงวิธีการเขียนความเห็นในสภาพแวดล้อมแต่ละแบบ&lt;/p&gt; &lt;table border="1" cellspacing="0" cellpadding="4" width="701"&gt;  &lt;tr&gt; &lt;td valign="top" width="349"&gt;PHP&lt;br /&gt; &lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:b6ccf244-4a67-4113-859e-b843d7a15133" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;span style="color:#008000;"&gt;
This is a block of text
That has been commented out
&lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:0e9c87fd-753d-4de4-9adb-c1b1c31d3683" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;%-- &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;This is a comment. --%&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;b&gt;ตัวแปร&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;แม้ว่า&amp;nbsp; PHP&amp;nbsp; และ&amp;nbsp; Visual&amp;nbsp; Basic .NET มีโครงสร้างภาษาที่คล้ายคลึงกันก็ตาม แต่ซินแทกซ์ที่ใช้กลับแตกต่างกันอย่างมาก&amp;nbsp; ส่วน&amp;nbsp; Visual&amp;nbsp; Basic .NET สร้างขึ้นมาโดยอิงกับโมเดล OOP การกำหนดตัวแปรจึงเข้มงวดมากกว่า PHP เนื่องจาก PHP ใช้วิธีการกำหนดตัวแปรโดยการใส่เครื่องหมายดอลลาร์ ($) หน้าชื่อตัวแปรเท่านั้น &lt;/p&gt;
&lt;p&gt;คุณกำหนดตัวแปรใน&amp;nbsp; Visual Basic .NET โดยการกำหนดชื่อและคุณสมบัติ ข้อความกำหนดตัวแปรใช้คีย์เวิร์ด Dim ในขณะที่ตำแหน่งและเนื้อหาจะเป็นตัวกำหนดคุณสมบัติของตัวแปร นอกจากนั้นยังมีการกำหนดตัวแปรออกเป็นระดับต่างๆอีกด้วย อาทิเช่น local and module, ประเภทข้อมูล, lifetimes และ accessibitlity เป็นต้น &lt;/p&gt;
&lt;p&gt;ในตอนแรกแนวทางนี้อาจดูซับซ้อนเกินไปอยู่บ้างเมื่อเทียบกับการกำหนดตัวแปรของ&amp;nbsp; PHP&amp;nbsp; แต่วิธีการนี้จะช่วยให้นักพัฒนาทำงานได้สบายมากขึ้น&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;&amp;nbsp; เน้นไปที่การช่วยให้นักพัฒนาสร้างแอพพลิเคชันประสิทธิภาพสูง&amp;nbsp; และการกำหนดประเภทของข้อมูลช่วยให้งานต่างๆง่ายขึ้นอาทิเช่น&amp;nbsp; การทำความสะอาดตัวแปร การดีบัก การจัดการกับข้อยกเว้นและความผิดพลาด และการแก้ไขโค้ดเป็นต้น โค้ดตัวอย่าง 2 แสดงวิธีกำหนดตัวแปรในสภาพแวดล้อมแต่ละชนิด&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:37c81519-2cb0-4735-b6e1-71eb7699acd1" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#800080;"&gt;$head_count&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$foo&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$X&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$obj&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:20aab6b6-70f2-4bab-8940-019fab89f63c" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; head_count &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; foo &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; X &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Date&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; Obj &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;object&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;b&gt;การกำหนดประเภทข้อมูล&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;วลี&amp;nbsp; AS&amp;nbsp; ในประโยคกำหนดประเภทข้อมูลจะช่วยให้คุณกำหนดประเภทข้อมูลหรือประเภทออปเจ็กต์ของตัวแปรที่คุณต้องการขึ้นมาได้ คุณสามารถกำหนดตัวแปรประเภทต่างๆดังต่อไปนี้ได้ &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ประเภทข้อมูลเบื้องต้น อาทิเช่น Boolean, Long หรือ Decimal 
&lt;li&gt;ประเภทข้อมูลแบบ composite อาทิเช่น array หรือ structure 
&lt;li&gt;ประเภทออปเจ็กต์หรือคลาสจาก Visual Basic หรือแอพพลิเคชันอื่นๆอาทิเช่น Label หรือ Textbox &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;คุณสามารถกำหนดตัวแปรหลายๆอันที่เป็นประเภทเดียวกันในบรรทัดเดียวกันได้&amp;nbsp;&amp;nbsp; โดยไม่จำเป็นต้องกำหนดประเภทข้อมูลซ้ำ&amp;nbsp; ซึ่งในประโยคต่อไปนี้ตัวแปร&amp;nbsp; numStudents,&amp;nbsp; numGTA&amp;nbsp; และ&amp;nbsp; numProfessors กำหนดให้เป็นประเภท Integer เหมือนกัน&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:88dc3fb6-e0de-4a03-89b0-d0a6bd7e07cf" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; numStudents, numGTA , numProfessors &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt; All three are Integer variables.&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt; ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับประเภทข้อมูลดู&amp;nbsp; Data&amp;nbsp; Types&amp;nbsp; ถ้าหากต้องการทราบข้อมูลเกี่ยวกับการเขียนโปรแกรมเชิงออปเจ็กต์เพิ่มเติม ดูหัวข้อ Object-Oriented Programming in Visual Basic&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การกำหนด &lt;/b&gt;&lt;b&gt;lifetime&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;lifetime&amp;nbsp; เป็นตัวแปรที่ใช้กำหนดว่าตัวแปรแต่ละตัวจะมีการใช้งานนานขนาดไหน ตัวแปรแบบ local ที่กำหนดเอาไว้ในคำสั่ง&amp;nbsp; Dim&amp;nbsp; จะมีอยู่นานตราบเท่าที่มีการประมวลผล&amp;nbsp; procedure อยู่ ถ้าหาก procedure หยุดทำงาน ตัวแปรแบบโลคอลทั้งหมดจะหายไป รวมทั้งค่าที่อยู่ในตัวแปรด้วย &lt;/p&gt;
&lt;p&gt;แนวคิดของ&amp;nbsp; lifetime&amp;nbsp; มีประโยชน์อย่างมากในการช่วยให้นักพัฒนาสร้างแอพพลิเคชันขึ้นมา โดยที่ไม่จำเป็นต้องกังวลเกี่ยวกับปัญหาจำนวนมากที่เกิดขึ้นในแอพพลิเคชันขนาดใหญ่&amp;nbsp; อาทิเช่นการบริหารเมมโมรีอย่างมีประสิทธิภาพเป็นต้น ถ้าหากมีการกำหนด&amp;nbsp; lifetime ให้ตัวแปรอย่างเหมาะสมแล้ว คุณสามารถกำหนดให้ .NET ทำความสะอาดตัวแปรที่ไม่ได้ใช้งานอีกได้ &lt;/p&gt;
&lt;p&gt;ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ lifetime ดูหัวข้อ Lifetime&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การกำหนดขอบเขต&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ตัวแปรแบบ&amp;nbsp; local&amp;nbsp; อีกชนิดหนึ่งที่กำหนดเอาไว้ภายใน&amp;nbsp; procedure&amp;nbsp; (procedure มีความหมายเท่ากับฟังก์ชัน) ส่วนตัวแปรแบบ non-local จะกำหนดเอาไว้ภายนอก procedure โดยจะอยู่ภายใน class หรือ structure &lt;/p&gt;
&lt;p&gt;ตัวแปรแบบ&amp;nbsp; non-local ที่อยู่ใน class หรือ structure อาจกำหนดให้เป็นแบบใช้ร่วมกันหรือไม่ก็ได้ ถ้าหากกำหนดโดยใช้คีย์เวิร์ด&amp;nbsp; Shared&amp;nbsp; ตัวแปรตัวนี้จะใช้ร่วมกันได้&amp;nbsp; และตัวแปรจะมีเพียงชุดเดียวในกลุ่มของ&amp;nbsp; class หรือ structure&amp;nbsp; ทั้งหมด&amp;nbsp; ถ้าหากไม่ได้ใช้คีย์เวิร์ด&amp;nbsp; Shared ตัวแปรแบบนี้เป็นแบบ instance ซึ่งคุณต้องสร้างตัวแปรแต่ละก็อปปี้ให้แก่&amp;nbsp; class&amp;nbsp; หรือ structure แต่ละชุด ตัวแปร instance แต่ละก็อปปี้จะใช้ได้กับ instance ซึ่งเป็นผู้สร้างตัวแปรขึ้นมาเท่านั้น &lt;/p&gt;
&lt;p&gt;ขอบเขตของตัวแปรก็คือการที่โค้ดทั้งหมดสามารถอ้างอิงกับตัวแปรได้โดยที่ไม่จำเป็นต้องเรียกชื่อตัวแปร&amp;nbsp; เราสามารถแยกแยะขอบเขตของตัวแปรได้โดยดูว่ามีการกำหนดตัวแปรเอาไว้ที่ไหน&amp;nbsp;&amp;nbsp; โค้ดที่อยู่ในแต่ละส่วนสามารถใช้ตัวแปรที่กำหนดเอาไว้ในส่วนนั้นโดยที่ไม่จำเป็นต้องเรียกชื่อตัวแปรเหล่านั้นก่อน&amp;nbsp; การกำหนดขอบเขตต้องปฏิบัติตามกฎเกณฑ์ดังต่อไปนี้ &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ขอบเขตของตัวแปรแบบ shared หรือ instance อยู่ภายใน structure หรือ class ที่เป็นตัวกำหนดตัวแปรดังกล่าวขึ้นมา&amp;nbsp; &lt;li&gt;ขอบเขตของตัวแปรแบบ local อยู่ใน procedure ซึ่งกำหนดตัวแปรนั้นขึ้นมา &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;อย่างไรก็ตามถ้าหากคุณกำหนดตัวแปรแบบ&amp;nbsp; local&amp;nbsp; เอาไว้ภายใน block ขอบเขตของตัวแปรจะอยู่ใน block นั้นเท่านั้น&amp;nbsp; ตัวแปรแบบ local จะทำงานอยู่ภายใน control block ที่กำหนด โดยที่ control block อาจจะเป็น procedure, คำสั่ง if, คำสั่งวนลูปและอื่นๆอีกมาก &lt;/p&gt;
&lt;p&gt;ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ scope ดูที่ Scope&lt;/p&gt;
&lt;p&gt;&lt;b&gt;กำหนด &lt;/b&gt;&lt;b&gt;accessibility&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;.NET&amp;nbsp;&amp;nbsp; มีแนวคิดพื้นฐานเรื่องความสามารถในการเรียกใช้&amp;nbsp;&amp;nbsp; (accessibility)&amp;nbsp; ตัวแปรซึ่งจะช่วยให้นักพัฒนาควบคุมว่าจะให้โค้ดชุดใดที่เรียกใช้ตัวแปรแต่ละตัวได้บ้าง&amp;nbsp; ตัวอย่างเช่นถ้าหากคุณต้องการค่าคงที่สำหรับสูตร&amp;nbsp; และต้องการความมั่นใจว่าค่าคงที่ของคุณจะไม่มีการเปลี่ยนแปลงโดยโค้ดอื่นๆที่อยู่ภายนอกคลาส&amp;nbsp; คุณต้องกำหนดตัวแปรเป็นแบบ private ลักษณะนี้&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:d23a6a65-8a78-43a0-bd30-45f68ecb20c4" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Private&lt;/span&gt;&lt;span style="color:#000000;"&gt; myConstant &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;คุณสามารถใช้คีย์เวิร์ดตั้งแต่หนึ่งตัวขึ้นไป&amp;nbsp; (อาทิ&amp;nbsp; Dim, Public, Protected, Friend, Protected Friend หรือ&amp;nbsp; Private)&amp;nbsp; ในคำสั่งกำหนดตัวแปร เพื่อใช้เป็นการกำหนดรูปแบบ accessibility ให้แก่ตัวแปร ซึ่งโดยทั่วไปแล้ว คุณมักจะใช้แค่ public หรือ private เท่านั้น &lt;/p&gt;
&lt;p&gt;คุณสามารถกำหนดคีย์เวิร์ดเหล่านี้ให้แก่ตัวแปร&amp;nbsp; module, structure, class หรือ instance ได้ แต่ถ้าหากอยู่ใน procedure จะยอมให้มีการใช้แค่คีย์เวิร์ด Dim เท่านั้น และ accessibility ต้องเป็น private เสมอ&lt;/p&gt;
&lt;p&gt;&lt;b&gt;เอาท์พุด&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;วิธีการปกติในการเอาท์พุดข้อมูลใน&amp;nbsp; PHP ผ่านทาง echo() language construct รูปแบบที่ใกล้เคียงมากที่สุดใน ASP.NET&amp;nbsp; ก็คือ&amp;nbsp; Response.Write()&amp;nbsp; method&amp;nbsp; หรือ &amp;lt;%= %&amp;gt; construct ซึ่งใช้เป็นตัวย่อของ Response.Write() นั่นเอง โค้ดตัวอย่าง 3 แสดงซินแทกซ์พื้นฐานสำหรับการเขียนค่าๆหนึ่งขึ้นมาในเพจ&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:db66d0d5-0b2f-4951-b309-a4e4643150c3" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;php
 
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$hello&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;hi how are you\n&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;echo&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$hello&lt;/span&gt;&lt;span style="color:#000000;"&gt;; 
 
&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:e6592008-c0da-4804-80dc-8a1e39ee67a8" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;%
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; Hello &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hi how are you&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; vbcrlf
Response.Write(Hello) 
%&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;อย่างไรก็ตามวิธีการส่งเอาท์พุดไปให้บราวเซอร์ในลักษณะนี้ ก็เพื่อทำให้คอมแพตทิเบิลย้อนหลังไปหา ASP รุ่นเก่าเท่านั้น&amp;nbsp; โมเดลควบคุมที่อิงกับเหตุการณ์แบบใหม่ของ ASP.NET ยอมให้มีการเอาท์พุดข้อมูลไปยังบราวเซอร์ได้โดยการกำหนดคุณสมบัติเอาไว้ใน&amp;nbsp; server control เทคนิคนี้จะช่วยให้มีการแยกเลย์เอาท์กับโค้ดออกจากกันโดยเด็ดขาด ทำให้การแก้ไขโค้ดทำได้ง่ายขึ้น และจำเป็นต้องสร้างโค้ดน้อยกว่ามากในสถานการณ์ที่ซับซ้อนเมื่อเทียบกับ PHP&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:296px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:960065f7-02b7-414f-adc1-1f9e4da93a17" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;language&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;VB&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; runat&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:376px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:5d7ef0d9-e08a-4e11-9870-1c94eadf61c0" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; Page_Load(sender &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Object&lt;/span&gt;&lt;span style="color:#000000;"&gt;, e &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; EventArgs)
   TheDate.Text &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DateTime.Now 
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:3ed728c7-15cd-41a3-9d25-34584deef74f" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;The current date is: &lt;/pre&gt;&lt;pre&gt;&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:8fe06481-1c0a-4c73-bd6e-65facc129f65" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:Label &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;TheDate&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; runat&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p&gt;ตัวอย่างนี้เป็นการกำหนด&amp;nbsp; Label&amp;nbsp; control ในฝั่งเซิร์ฟเวอร์ที่มีชื่อว่า TheDate และในช่วงที่ทำการ Load เพจ ก็จะมีการกำหนดคุณสมบัติ&amp;nbsp; Text&amp;nbsp; ของ&amp;nbsp; label&amp;nbsp; ตัวนี้ให้แก่วันที่และเวลาปัจจุบัน เอาท์พุด HTML ตัวนี้จะเหมือนกับอีกสองเวอร์ชัน ยกเว้นการแสดงผล Label control จะอยู่ในรูปของ span tag ซึ่งบรรจุอะไรก็ตามที่กำหนดเอาไว้เป็นข้อความของ label&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การประมวลผลตามเงื่อนไข&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;IF/ELSE&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;PHP&amp;nbsp; มีการประมวลผลตามเงื่อนไขหลายชนิด&amp;nbsp; อาทิเช่น for, while, switch และ foreach แต่รูปแบบที่มีการใช้งานมากที่สุดก็คือ if/else ส่วน Visual Basic .NET มีโครงสร้างที่คล้ายคลึงกันและใช้ซินแทกซ์ที่คล้ายคลึงกัน โค้ดตัวอย่าง 4 แสดงการใช้ตรรกะเงื่อนไขที่เท่ากันใน PHP และ Visual Basic .NET&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:afcecd97-e7f9-48c1-8634-25ae174cbbf9" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;a is bigger than b&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
} &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;elseif&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$b&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;a is equal to b&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
} &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;else&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;a is smaller than b&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:0fe39848-fdfa-4711-991e-420e3d4b6686" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;If&lt;/span&gt;&lt;span style="color:#000000;"&gt; a &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; b 
   Response.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a is bigger than b&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;ElseIf&lt;/span&gt;&lt;span style="color:#000000;"&gt; a &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; b &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Then&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   Response.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a is equal to b&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   Response.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;a is smaller than b&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;If&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Switch&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;คำสั่ง&amp;nbsp;&amp;nbsp; switch&amp;nbsp;&amp;nbsp; เป็นโครงสร้างภาษาพื้นฐานสำหรับภาษาเขียนโปรแกรมส่วนใหญ่&amp;nbsp;&amp;nbsp; เมื่อตอนที่คุณต้องการทดสอบ expression&amp;nbsp; เพียงชุดเดียวกับค่าหลายๆชุด&amp;nbsp; ปกติแล้วเรามักจะใช้&amp;nbsp; switch แทนคำสั่ง if ในกรณีที่บล็อกมีคำสั่ง else/if/else จำนวนมากเกินไป &lt;/p&gt;
&lt;p&gt;โค้ดตัวอย่าง&amp;nbsp; 5&amp;nbsp; แสดงการเปรียบเทียบระหว่างคำสั่ง switch ของ PHP กับคำสั่ง Select Case ของ Visual Basic&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:84ed58ba-a862-4a93-b520-3ff08e5aaa05" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;switch&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;i equals 0&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;i equals 1&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;i equals 2&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;break&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;default&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;i is not equal to 0, 1 or 2&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:b6813eb8-12bb-4343-9d2f-ccd0fac5ccaa" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Select&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Case&lt;/span&gt;&lt;span style="color:#000000;"&gt; Number i
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      Wesponse.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i equals 0&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      Response.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i equals 1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      Response.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i equals 2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Case&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Else&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt; i is not equal to 0, 1 or 2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      Response.Write (&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;i is not equal to 0, 1 or 2 &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Select&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;b&gt;การวนลูป&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;โครงสร้าง&amp;nbsp; control แบบพื้นฐานอีกชนิดหนึ่งก็คือการวนลูป โดยที่ทำ PHP และ .NET รองรับการวนลูปแที่แตกต่างกันออกไปหลายชนิด&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:355af492-958c-4a67-a73d-0e4d0d550dea" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;for&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:d6583aba-ef25-4537-84f9-a7823f1ebb68" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; sum &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;To&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Step&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   sum &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color:#000000;"&gt;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; i &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;To&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;100&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   Response.Write (i)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color:#000000;"&gt; I
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;ถ้าหากพูดถึง Visual Basic การวนลูปชนิดนี้มีชื่อว่า For... Next ส่วนใน PHP ใช้ชื่อว่าการวนลูปแบบ For ซึ่งในตัวอย่างนี้เครื่องหมาย&amp;nbsp; += ใช้เป็นตัวย่อสำหรับ sum = sum+counter เราสามารถหยุดการวนลูปใน PHP โดยใช้คำสั่ง Break ส่วนการหยุดลูป For... Next ใช้คำสั่ง Exit For&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การวนลูปแบบมีเงื่อนไข&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;การวนลูปแบบมีเงื่อนไขเอาไว้จัดการทำคำสั่งเดิมซ้ำแล้วซ้ำเล่าซึ่งจะหยุดทำงานก็ต่อเมื่อเงื่อนไขที่กำหนดเอาไว้เป็นจริงขึ้นมา โค้ดตัวอย่าง 7 แสดงตัวอย่างการวนลูปแบบมีเงื่อนไขในแต่ละภาษา&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:7b902163-4b1d-47db-9bda-48aacb2ac7ea" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
   &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;endwhile&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:706d0a3e-5cd2-42f6-95a4-5777743f2c89" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Do&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;While&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;10&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   Response.Write(i)
   counter i &lt;/span&gt;&lt;span style="color:#000000;"&gt;+=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Loop&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;การวนลูปประเภทนี้ใน&amp;nbsp; Visual&amp;nbsp; Basic มีชื่อว่าคำสั่ง Do... Loop หรือการวนลูปแบบชั่วคราว นอกจากนั้น PHP ยังรองรับการวนลูปแบบ&amp;nbsp; Do...&amp;nbsp; Whileอีกด้วย ซึ่งคล้ายคลึงกับการวนลูปแบบชั่วคราว ยกเว้นการตรวจสอบเงื่อนไขว่าเป็นจริงหรือไม่จะกระทำตอนสิ้นสุดการวนรอบแต่ละครั้งแทนที่จะเป็นตอนเริ่มต้นการวนลูป&amp;nbsp;&amp;nbsp;&amp;nbsp; ความแตกต่างหลักจากการวนลูปชั่วคราวปกติก็คือ&amp;nbsp;&amp;nbsp; ระบบจะรับประกันว่าการวนลูป&amp;nbsp; Do...&amp;nbsp; While&amp;nbsp; รอบแรกจะทำงานอย่างแน่นอน (การตรวจสอบว่าเป็นจริงตามเงื่อนไขจะเกิดขึ้นในตอนท้ายของการวนลูป)&amp;nbsp; ในขณะที่การวนลูปแบบชั่วคราวอาจไม่จำเป็นต้องทำงานก็ได้&amp;nbsp;&amp;nbsp; (การตรวจเช็คเงื่อนไขก็เป็นจริงหรือไม่จะเกิดขึ้นในตอนแรกแต่ละรอบ&amp;nbsp;&amp;nbsp; ถ้าหากเงื่อนไขเป็น FALSE ตั้งแต่แรก การประมวลผลลูปจะหยุดทันที)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ตัวอย่างโค้ด &lt;/strong&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:bf509897-4c70-4f57-982c-b7e379f683cf" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;do&lt;/span&gt;&lt;span style="color:#000000;"&gt; {
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
} 
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;while&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;การวนลูปแบบนี้จะทำงานแค่ครั้งเดียวเท่านั้น&amp;nbsp;&amp;nbsp; เนื่องจากเมื่อผ่านรอบแรกแล้วและมีการตรวจสอบเงื่อนไขว่าเป็นจริงหรือไม่ จะได้ค่าเป็น FALSE ($i ไม่ได้มากกว่า 0) การประมวลผลผลลูปก็จะหยุดลง ใน Visual Basic .NET คุณสามารถเขียนโปรแกรมได้ใกล้เคียงกัน&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:be2b2131-c13c-4dee-a2ec-e515a0d8f3ff" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter i &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Do&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   Response.Write (i)counter
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Loop&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;While&lt;/span&gt;&lt;span style="color:#000000;"&gt; counter i &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;อย่างไรก็ตาม&amp;nbsp; Visual&amp;nbsp; Basic&amp;nbsp; .NET&amp;nbsp; มีคุณสมบัติการวนลูปในตัวแบบที่ PHP ไม่มี นั่นก็คือการตรวจสอบเงื่อนไขทุกครั้งจนกว่าจะเป็นจริง&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การวนลูปแบบ &lt;/b&gt;&lt;b&gt;Foreach&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;PHP&amp;nbsp; 4 (ไม่ใช่ PHP 3) มีคำสั่ง foreach ด้วย เหมือนกับ ASP.NET และภาษาอื่นๆบางภาษา วิธีการนี้จะช่วยให้วนลูปอะเรย์ทำได้ง่ายขึ้น&amp;nbsp; foreach จะทำงานกับตัวแปร array เท่านั้น และจะแจ้งเตือนว่ามีความผิดพลาดเกิดขึ้นเมื่อคุณพยายามที่จะใช้&amp;nbsp; foreach กับตัวแปรที่ใช้ข้อมูลประเภทอื่นๆ หรือใช้กับตัวแปรแบบ uninitialized ส่วนคำสั่งที่เท่าเทียมกันใน&amp;nbsp; Visual&amp;nbsp; Basic .NET ก็คือคำสั่ง For Each... Next โค้ดตัวอย่าง 8 แสดงวิธีการวนลูปกับ array ในแต่ละภาษา&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:4e5dac19-f4a7-4278-ab71-24420d801554" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$v&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
{
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;print&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;\$Key[&lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;]&lt;/span&gt;&lt;span style="color:#800080;"&gt;$v&lt;/span&gt;&lt;span style="color:#000000;"&gt; \n&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
   &lt;/span&gt;&lt;span style="color:#800080;"&gt;$i&lt;/span&gt;&lt;span style="color:#000000;"&gt;++&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:36cb1151-25cf-401b-8613-cf78bccaac6e" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;For&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Each&lt;/span&gt;&lt;span style="color:#000000;"&gt; v &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;In&lt;/span&gt;&lt;span style="color:#000000;"&gt; a

   Response.Write a(v) (v &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; vbcrlf)

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Next&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Array&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;array&amp;nbsp; ใน PHP ทำงานต่างจาก array ใน Visual Basic .NET อย่างมาก ที่จริงแล้ว array ใน PHP เป็น associative&amp;nbsp; array&amp;nbsp; แต่ใช้เหมือนกับเป็น&amp;nbsp; index หรือ associative arrays ส่วน arrays ใน Visual Basic&amp;nbsp; .NET&amp;nbsp; เป็น&amp;nbsp; index&amp;nbsp; arrays&amp;nbsp; อย่างไรก็ตาม&amp;nbsp; Visual&amp;nbsp; Basic&amp;nbsp; .NET ไม่ได้รองรับการทำงานของ associative&amp;nbsp; array&amp;nbsp; แบบนี้&amp;nbsp; (แต่คุณสามารถสร้างขึ้นมาเองได้ -ดูตัวอย่างด้านล่าง) ภาษาอื่นๆของ ASP.NET รองรับการใช้&amp;nbsp; array&amp;nbsp; แบบนี้ แต่ Visual Basic .NET ทำไม่ได้ ดังนั้นเรื่องนี้อาจก่อปัญหาบางอย่างกับนักพัฒนา PHP&amp;nbsp; ที่ไม่คุ้นเคยกับการใช้ index array แบบพื้นฐานมากกว่า และอยากสร้างโมเดลเป็น associative array ใน&amp;nbsp; Visual&amp;nbsp; Basic .NET ก็เป็นได้ โค้ดตัวอย่าง 9 แสดง array แบบง่ายๆใน PHP และ Visual Basic .NET&lt;/p&gt;
&lt;p&gt;โค้ดตัวอย่าง 9 ตัวอย่างการสร้าง array PHP&lt;/p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:4a6da631-b680-4e2b-861b-cbdd6ed5f24d" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#800080;"&gt;$a&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;array&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ใน Visual Basic .NET&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:cf17c88d-3eda-48c1-8b0e-82ae12682785" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; MySingleArraya() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Integer&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;) {&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#800080;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Array ของ&amp;nbsp; Visual Basic .NET มีการกำหนดตัวแปรต่างๆแบบเดียวกับตัวแปรอื่นๆโดยใช้คำสั่ง Dim คุณต้องปฏิบัติตามกฎการตั้งใช้ตัวแปรโดยใช้วงเล็บมากกว่าหนึ่งคู่ขึ้นไป&amp;nbsp; เพื่อระบุว่านี่เป็น array แทนที่จะเป็น scalar (ตัวแปรที่เก็บค่าเพียงค่าเดียว) &lt;/p&gt;
&lt;p&gt;นอกจากนั้นเมื่อตอนที่สร้าง&amp;nbsp; array&amp;nbsp; ของ&amp;nbsp; Visual&amp;nbsp; Basic .NET ขึ้นมา จำเป็นต้องมีการกำหนดให้เก็บข้อมูลได้เพียงชนิดเดียวอีกด้วย&amp;nbsp; ถ้าหากกำหนดประเภทเป็น&amp;nbsp; Object (ประเภทพื้นฐานที่ใช้กับออปเจ็กต์ได้ทุกชนิดใน .NET) array&amp;nbsp;&amp;nbsp; จะสามารถจัดเก็บข้อมูลได้ทุกประเภท&amp;nbsp; แต่ค่าจะต้องถูกแปลงไปเป็นประเภทเดิมเสียก่อนจึงจะเรียกออกมาจาก array ได้ &lt;/p&gt;
&lt;p&gt;array ของ Visual Basic .NET อาจเป็น array ที่ซ้อนกันอยู่หรือเป็น array หลายมิติก็ได้ รวมทั้งยังมีฟังก์ชันอีกหลายชนิดที่เอาไว้จัดการกับ&amp;nbsp; array&amp;nbsp; ได้ที่คล้ายคลึงกับการทำงานของ PHP โดยมีข้อยกเว้นอยู่ข้อหนึ่งก็คือ เนื่องจาก&amp;nbsp; Visual&amp;nbsp; Basic .NET ไม่มีการใช้ associative array ดังนั้นจึงไม่มีฟังก์ชันเพื่อเรียกใช้หรือทำอินเด็กซ์หรือทำอะไรบางอย่างกับ &amp;quot;Key&amp;quot; ของ array ได้ เพราะองค์ประกอบส่วนนี้ไม่มีอยู่ใน Visual Basic .NET &lt;/p&gt;
&lt;p&gt;แม้เราบอกไปแล้วหลายครั้งว่า&amp;nbsp; Visual&amp;nbsp; Basic .NET ไม่ได้รองรับการทำงานของ associative arrays แต่เราอาจสร้างสิ่งที่เรียกว่า&amp;nbsp; collection&amp;nbsp; ขึ้นมาแทนที่&amp;nbsp; array&amp;nbsp; ได้ โดยที่ collection จะทำงานคล้ายคลึงกับ associative arrays สำหรับใช้แก้ปัญหาที่คล้ายคลึงกันได้ &lt;/p&gt;
&lt;p&gt;ในบางสถานการณ์การจัดเก็บ item ต่างๆเอาไว้ใน collection จะมีประสิทธิภาพมากกว่า array เสียอีก &lt;/p&gt;
&lt;p&gt;คุณอาจต้องการใช้&amp;nbsp; collection&amp;nbsp; ถ้าหากคุณทำงานกับ items กลุ่มเล็กๆที่มีการเปลี่ยนแปลงอยู่ตลอดเวลา ถ้าหากต้องการสร้าง collection สิ่งที่คุณต้องทำก็คือกำหนดและยกตัวอย่างตัวแปร Collection เหมือนอย่างที่แสดงเอาไว้ด้านล่างนี้&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:8eb07138-fe2d-46ff-a37f-513480fed295" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; myCollection &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; Collection()
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;จากนั้นคุณสามารถใช้&amp;nbsp; Add&amp;nbsp; method&amp;nbsp; เพื่อเพิ่ม&amp;nbsp; members&amp;nbsp; ให้แก่ collection นี้ได้ ซึ่งในตัวอย่างนี้ เราสร้างสตริงขึ้นมา&amp;nbsp; 4&amp;nbsp; ชุด&amp;nbsp; จากนั้นก็เพิ่มลงไปใน collection คุณสามารถเพิ่มค่า string เฉพาะเป็น key สำหรับ members&amp;nbsp; ใน collection ได้ ค่านี้จะถูกส่งต่อไปยัง collection ในรูปของ argument ชุดที่สองสำหรับ Add method&lt;/p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:b714969b-0645-4e09-8fc9-87b552ae48ac" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; w, x, y, z &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;

w &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
x &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
y &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key3&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
z &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;key4&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

myCollection.Add(w, &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
myCollection.Add(x, &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
myCollection.Add(y, &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;3&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
myCollection.Add(z, &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;4&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;แม้ว่าวิธีการนี้อาจดูเหมือนการสร้าง&amp;nbsp; associative array ใน PHP ก็ตาม แต่ collection จะมีความแตกต่างออกไปอย่างมาก&amp;nbsp; เนื่องจากมันเป็นออปเจ็กต์โดยตัวของมันเอง&amp;nbsp; ถ้าหากคุณเป็นนักพัฒนา PHP ที่ต้องการย้ายมาพัฒนา ASP&amp;nbsp; แล้วละก็ เราขอแนะนำให้คุณใช้ทบทวนสเปกภาษาของ Microsoft Visual Basic .NET ให้ดีเสียก่อนที่จะพยายามย้าย model associative array มายัง Visual Basic .NE&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การบริหาร &lt;/b&gt;&lt;b&gt;state&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;งานพื้นฐานอย่างหนึ่งในเว็บแอพพลิเคชันทั่วไปก็คือการบริหาร&amp;nbsp;&amp;nbsp;&amp;nbsp; state&amp;nbsp;&amp;nbsp; ซึ่งปกติแล้วจะทำงานโดยใช้คุ๊กกี้&amp;nbsp;&amp;nbsp; หรือโครงสร้างบริหารสภาพของแอพพลิเคชัน อาทิเช่นตัวแปรแบบ Session เป็นต้น Visual Basic .NET มีวิธีการจัดการกับ state คล้ายคลึงกับ PHP&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การกำหนดและเรียกใช้คุ๊กกี้&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;การกำหนดคุ๊กกี้ในสภาพแวดล้อมทั้งสองชนิดทำได้ง่ายมาก&amp;nbsp; โค้ดตัวอย่าง&amp;nbsp; 10&amp;nbsp; แสดงวิธีการสร้างและการอ่านคุ๊กกี้ในแต่ละภาษา&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:77134322-e097-4937-94c6-f08a7c368240" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;php
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$value&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;something from somewhere&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;

&lt;/span&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;span style="color:#008000;"&gt; expire in 1 hour &lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;setcookie&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TestCookie&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$value&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#008080;"&gt;time&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;+&lt;/span&gt;&lt;span style="color:#000000;"&gt;3600&lt;/span&gt;&lt;span style="color:#000000;"&gt;);

&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
 
&lt;/span&gt;&lt;span style="color:#008000;"&gt;/*&lt;/span&gt;&lt;span style="color:#008000;"&gt; and to retive the set cookie &lt;/span&gt;&lt;span style="color:#008000;"&gt;*/&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;echo&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$_COOKIE&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TestCookie&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;];
&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:c3811681-0722-4bf4-8b0e-a5c791a5b103" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; value &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;something from somewhere&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; myCookie &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; HttpCookie(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Something from somewhereTestCookie&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; now &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;as&lt;/span&gt;&lt;span style="color:#000000;"&gt; DateTime &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DateTime.Now
 
myCookie.Value &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; now.ToString()value
myCookie.Expires &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; now.AddHour(&lt;/span&gt;&lt;span style="color:#800080;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
Response.Cookies.Add(myCookie)
 
&lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt;and to retrieve the set cookie&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;Response.Write(Request.Cookies[&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;What we setTestCookie&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;].Value)
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;b&gt;การกำหนดและการเรียกใช้ตัวแปร &lt;/b&gt;&lt;b&gt;session&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ตัวแปร&amp;nbsp; session ใน ASP.NET มีความคล้ายคลึงกับตัวแปร session ใน PHP โดยที่ตัวแปร session ในสภาพแวดล้อมทั้งสองชนิดเอาไว้รองรับการจัดการต่างๆ&amp;nbsp; รวมทั้งการดัดแปลงคุ๊กกี้ เพื่อทำให้การเข้าไปในเว็บแอพพลิเคชันใดๆมีสภาพที่คงเส้นคงวาเหมือนเดิม &lt;/p&gt;
&lt;p&gt;ความแตกต่างจุดสุดท้ายก็คือเมื่อได้รับค่าจากออปเจ็กต์&amp;nbsp; session&amp;nbsp; ของ&amp;nbsp; ASP.NET&amp;nbsp; ค่าที่ส่งกลับไปจะอยู่ในรูปของ System&amp;nbsp; Object&amp;nbsp; พื้นฐานที่คุณสามารถจัดเก็บข้อมูลประเภทใดก็ได้ แต่ค่านี้จะต้องแปลงกลับไปเป็นประเภทเดิมเสียก่อนจึงจะใช้งานได้ โค้ดตัวอย่าง 11 แสดงวิธีการใช้ตัวแปรแบบ session&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:533ea864-1cb8-4c15-a175-8cb84bec459e" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;php 
   &lt;/span&gt;&lt;span style="color:#008080;"&gt;session_start&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
   &lt;/span&gt;&lt;span style="color:#008080;"&gt;session_register&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;today&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
   &lt;/span&gt;&lt;span style="color:#800080;"&gt;$today&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#008080;"&gt;getdate&lt;/span&gt;&lt;span style="color:#000000;"&gt;(); 
&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
 
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;?=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$today&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:4b8bd2f5-c8e7-43b4-9461-b20076ffbcf4" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Session(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Today&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; DateTime.Now
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; today &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Date&lt;/span&gt;&lt;span style="color:#000000;"&gt;
today &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;CDate&lt;/span&gt;&lt;span style="color:#000000;"&gt;(Session(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Today&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
Response.Write(today)
Response.Write (session(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Today&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;นอกจากนั้น&amp;nbsp; ASP.NET&amp;nbsp; ยังมีการบริหาร state อีกรูปแบบหนึ่งที่มีชื่อว่า Application State ซึ่งคล้ายคลึงกับตัวแปรแบบ&amp;nbsp; session&amp;nbsp; แต่จะคงอยู่จนกระทั่งสิ้นสุดการใช้แอพพลิเคชัน วิธีการนี้จะช่วยให้คุณจัดเก็บข้อมูลต่างๆได้หลายแบบ อาทิเช่นข้อมูลตัวแปร หรือ database connection strings ที่จะไม่มีการเปลี่ยนแปลงขณะที่แอพพลิเคชันทำงานอยู่ &lt;/p&gt;
&lt;p&gt;ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้&amp;nbsp; กรุณาเข้าไปดูได้ที่หัวข้อ&amp;nbsp; Application&amp;nbsp; State&amp;nbsp; ของ .NET Framework Development Guide&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Regular Expression&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ASP.NET&amp;nbsp; รองรับการใช้คุณสมบัติยอดนิยมของการใช้ regular expression ในภาษาอื่นๆได้ อาทิที่มีอยู่ใน Perl และ&amp;nbsp; awk เป็นต้น องค์ประกอบส่วนหนึ่งของ ASP.NET ถูกออกแบบมาให้คอมแพตทิเบิลกับ regular expression ของ&amp;nbsp; Perl&amp;nbsp; 5 นอกจากนั้น ASP.NET ยังรองรับคุณสมบัติ regular expression ที่ไม่มีอยู่ในภาษาอื่นๆด้วย อาทิเช่นการจับคู่ขวาไปซ้ายและการคอมไพล์อย่างรวดเร็ว&amp;nbsp; การที่ ASP.NET คอมแพตทิเบิลกับ regular expression ของ Perl และเนื่องจากนักพัฒนา PHP ส่วนมากใช้ regular expression ที่คอมแพตทิเบิลกับ Perl ดังนั้นคุณจึงไม่จำเป็นต้องแปลงซินแทกซ์จากภาษาหนึ่งไปสู่อีกภาษาหนึ่ง&amp;nbsp;&amp;nbsp; ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับ&amp;nbsp; regular expression ของ .NET ให้เข้าไปดูได้ที่ .NET Framework Regular Expressions&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การจัดการกับ Exception (Error)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;เฟรมเวิร์กของ&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;&amp;nbsp; มีบริการจัดการกับ Exception ที่มีโครงสร้าง&amp;nbsp; โดยใช้โครงสร้างภาษาที่ทุกคนคุ้นเคยกันดีอยู่แล้วอย่าง&amp;nbsp; Try/Catch&amp;nbsp; โดยมีความสามารถที่จะดักข้อแม้ที่อาจเกิดขึ้นในโค้ดได้&amp;nbsp; ตอนนี้&amp;nbsp; PHP ยังไม่มีคุณสมบัติข้อนี้ แต่น่าจะถูกเพิ่มลงไปใน PHP 5&lt;/p&gt;
&lt;p&gt;กรอบด้านล่างก็คือการทำงานของโค้ดใน Visual Basic .NET&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:158381e7-3683-41ef-87bc-341cfb4fae44" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Try&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt; code that might cause an error here&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Catch&lt;/span&gt;&lt;span style="color:#000000;"&gt; e &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; ExceptionType
   &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt; code to handle the error&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt; Optional: More Catch blocks here&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Finally&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#008000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#008000;"&gt; code that is always executed&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Try&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;สิ่งที่ต้องบอกเอาไว้ก็คือภายในกรอบ Try อาจจะมีกรอบ Catch มากกว่าหนึ่งชุดขึ้นไปได้ หรือกรอบ Finally หนึ่งชุด&amp;nbsp; หรือทั้งสองแบบก็ได้&amp;nbsp; หรือพูดอีกแง่หนึ่งก็คือภายในสถานการณ์ที่คุณทราบว่าไม่มีทางที่จะแก้ไขความผิดพลาดได้ แต่คุณจำเป็นต้องกำจัดออปเจ็กต์บางอย่างทิ้งไป ไม่ว่าจะเกิดความผิดพลาดขึ้นมาหรือไม่ก็ตาม คุณสามารถใช้กรอบ Try. ..Finally โดยที่ไม่มีคำสั่ง Catch ก็ได้&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การคิวรีดาต้าเบส&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ภายใน&amp;nbsp; PHP มีวิธีการพื้นฐานสองแบบสำหรับเรียกใช้ดาต้าเบส นั่นก็คือการใช้ส่วนขยายเฉพาะของดาต้าเบสหรือการใช้ไลบราลี PEAR DB อิสระของดาต้าเบสก็ได้ &lt;/p&gt;
&lt;p&gt;ใน&amp;nbsp; ASP.NET การเรียกใช้ดาต้าเบสจะกระทำผ่านชุดของออปเจ็กต์ที่มีชื่อว่า ADO.NET ซึ่งทำฟังก์ชันส่วนใหญ่เหมือนกับไลบราลี&amp;nbsp; PEAR&amp;nbsp; DB&amp;nbsp; ส่วนการประมวลผลดาต้าเบสคิวรีที่แท้จริงจะกระทำผ่านชุดของคอนเนกชัน&amp;nbsp; คำสั่ง พารามิเตอร์&amp;nbsp; และดาต้าอะแดปเตอร์ออปเจ็กต์&amp;nbsp; โดยที่ออปเจ็กต์เหล่านี้แต่ละประเภทมีอยู่หลายเวอร์ชันขึ้นอยู่กับประเภทของดาต้าเบสที่เรียกใช้&amp;nbsp; ตัวอย่างเช่นมีชุดของดาต้าเบสที่ใช้ไดรเวอร์&amp;nbsp; OLE-DB&amp;nbsp; (อาทิเช่น&amp;nbsp; Microsoft&amp;nbsp; Access) รวมทั้งชุดดาต้าเบสที่ใช้ไดรเวอร์&amp;nbsp; ODBC&amp;nbsp; แต่ไม่มีไดรเวอร์ OLE-DB ก็มี นอกจากนั้นยังมีผู้พัฒนาระบบจัดสรรข้อมูลพิเศษออกมาสำหรับ Oracle และ Microsoft SQL Server ที่ปรับแต่งมาเพื่อให้เรียกใช้ดาต้าเบสแต่ละชนิดได้เต็มประสิทธิภาพสูงสุดอีกด้วย นอกจากนั้นยังมีบางบริษัทที่พัฒนาดาต้าเบสของตนเองขึ้นมาด้วย อาทิ MySQL เป็นต้น ซึ่งตัวอย่างในหัวข้อนี้จะใช้ออปเจ็กต์&amp;nbsp; SQL&amp;nbsp; Server&amp;nbsp; เป็นหลัก&amp;nbsp; เนื่องจากมันเป็นดาต้าเบสที่มีการใช้งานกับ&amp;nbsp; ASP.NET อย่างแพร่หลายมากที่สุด &lt;/p&gt;
&lt;p&gt;System.Data,&amp;nbsp; System.Data.SqlClient&amp;nbsp; และ System.Data.oledb เป็นการกำหนดชื่อ (namespaces) ที่ใช้กำหนดวิธีการเรียกใช้ดาต้าเบสใน&amp;nbsp; ADO.NET&amp;nbsp; ถ้าหากต้องการกำหนดการเรียกเพจให้แก่คลาสต่างๆ คุณจำเป็นต้องอิมพอร์ตชื่อ System.Data และ System.Data.SqlClient ให้แก่เพจของคุณเสียก่อน&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:06201787-375e-43d8-be89-31e2ad44878c" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;%@ Import &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Namespace&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;System.Data&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; %&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;%@ Import &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;Namespace&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; %&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;โค้ดตัวอย่าง&amp;nbsp; 12&amp;nbsp; แสดงตัวอย่างวิธีการประมวลผลคิวรีในแต่ละภาษา&amp;nbsp; โดยใน&amp;nbsp; PHP เราแสดงการเชื่อมต่อโดยใช้ PEAR&amp;nbsp; ซึ่งไม่เพียงแต่เป็นวิธีการเชื่อมต่อกับดาต้าเบสที่ได้รับความนิยมมากที่สุดเท่านั้น&amp;nbsp; แต่ยังคล้ายคลึงกับ ADO.NET มากที่สุดอีกด้วย&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;โค้ดตัวอย่าง 12 การประมวลผลคิวรีใน PHP&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:762b291a-0b0b-4cb7-a284-1654065aaf59" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;php
&lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;connect&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;require_once&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DB.PHP&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$db&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt;DB&lt;/span&gt;&lt;span style="color:#000000;"&gt;::&lt;/span&gt;&lt;span style="color:#000000;"&gt;connect (&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;mysql://mydbvie w:user@localhost/mydb&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (DB&lt;/span&gt;&lt;span style="color:#000000;"&gt;::&lt;/span&gt;&lt;span style="color:#000000;"&gt;iserror(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$db&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) {
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;die&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$db&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;getMessage());
 
   &lt;/span&gt;&lt;span style="color:#800080;"&gt;$sql&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;select * from mytable&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
   &lt;/span&gt;&lt;span style="color:#800080;"&gt;$q&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$db&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;query(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$sql&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (DB&lt;/span&gt;&lt;span style="color:#000000;"&gt;::&lt;/span&gt;&lt;span style="color:#000000;"&gt;iserror(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$q&lt;/span&gt;&lt;span style="color:#000000;"&gt;)) {
     &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;die&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$q&lt;/span&gt;&lt;span style="color:#000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;getMessage());
}
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;tr&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;td&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;lt;?=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$row&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;td&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;td&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;lt;?=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$row&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;td&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;td&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&amp;lt;?=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$row&lt;/span&gt;&lt;span style="color:#000000;"&gt;[&lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;] &lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;td&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;tr&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;โค้ดตัวอย่าง 12 การประมวลผลคิวรีใน Visual Basic .NET&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;width:813px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:347af7dd-e2c1-4f33-8563-3ee604f06e8a" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;script runat&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;server&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt; Page_Load(Sender &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Object&lt;/span&gt;&lt;span style="color:#000000;"&gt;, E &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; EventArgs)
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; myConnection &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; SqlConnection(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;server=(local)\NetSDK;database=mydb;Trusted_Connection=yes&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; myCommand &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; SqlDataAdapter(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;select * from mytable&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, myConnection)
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; ds &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; DataSet()

   myCommand.Fill(ds, &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;myDataset&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
   myDataGrid.DataSource &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; myDataset
   myDataGrid.DataBind()

&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Sub&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;script&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt;---&lt;/span&gt;&lt;span style="color:#000000;"&gt; outputting the resutlt &lt;/span&gt;&lt;span style="color:#000000;"&gt;---&lt;/span&gt;&lt;span style="color:#000000;"&gt;%&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;form runat&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;server&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
   &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;asp:DataGrid id&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;myDataGrid&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; runat&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;server&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;form&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ใน&amp;nbsp; PHP&amp;nbsp; ผลลัพธ์ของการคิวรีจะจัดเก็บเอาไว้ในตัวแปรที่มีชื่อว่า&amp;nbsp; result set ในขณะที่ ADO.NET เรียกว่าออปเจ็กต์&amp;nbsp; Dataset&amp;nbsp; โดยที่เราจะเรียกดูข้อมูลของ&amp;nbsp; result set ได้เท่านั้น ในขณะที่ .NET Dataset เป็นข้อมูลที่เก็บเอาไว้ในเมมโมรีจริง&amp;nbsp; รวมทั้งจะทำการอ่านและบันทึกข้อมูลได้&amp;nbsp; ซึ่งจะทำให้นักพัฒนา&amp;nbsp; .NET แก้ไขข้อมูลที่ได้รับกลับมาจากแหล่งข้อมูลได้ง่ายขึ้น &lt;/p&gt;
&lt;p&gt;เมื่อตอนที่มีการเอาท์พุดข้อมูล&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp;&amp;nbsp; มีวิธีการหลายแบบที่ใช้แสดงผลข้อมูลไปยังผู้ใช้หรือไคล์เอ็นต์&amp;nbsp;&amp;nbsp; วิธีการแรกคล้ายคลึงกับ&amp;nbsp; PHP&amp;nbsp; ซึ่งจะมีการวนลูปผ่านทาง result set โดยใช้ออปเจ็กต์ SQLDataReader เพื่อเขียนข้อมูลที่เราต้องการแสดงผลจากคิวรี&amp;nbsp; ส่วนวิธีการพื้นฐานมากที่สุด (ซึ่งไม่เหมือนกับ PHP) ก็คือการใช้ data binding ของ ASP.NET วิธีการนี้ช่วยให้นักพัฒนาสร้าง User Interface และ Display control ที่สามารถนำไปใช้หรือใช้ซ้ำในทุกส่วนของแอพพลิเคชันใดๆได้&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; รวมทั้งยังช่วยให้มีการตัดต่อข้อมูลหรือโลจิกบางส่วนมาแสดงผลได้อย่างคล่องตัวมากขึ้นด้วย&amp;nbsp; ซินแทกซ์ที่คล่องตัวของ&amp;nbsp; data&amp;nbsp; binding ไม่เพียงแต่ช่วยให้คุณเชื่อมโยงเข้าหาแหล่งข้อมูลได้เท่านั้น&amp;nbsp;&amp;nbsp; แต่ยังเชื่อมโยงเข้าหา&amp;nbsp; properties&amp;nbsp; collection,&amp;nbsp; expression&amp;nbsp; แบบง่ายๆหรือแม้แต่ผลลัพธ์ที่ส่งกลับมาจาก method calls อีกด้วย &lt;/p&gt;
&lt;p&gt;ถ้าหากต้องการทำ&amp;nbsp; data&amp;nbsp; binding คุณจำเป็นต้องกำหนดแหล่งข้อมูลบางอย่างเสียก่อน อาทิเช่นผลลัพธ์การคิวรีให้แก่คุณสมบัติ&amp;nbsp; DataSource&amp;nbsp; ของ&amp;nbsp; server&amp;nbsp; control ที่ใช้กับข้อมูลได้ (อาทิเช่น DataGrid) หรือคุณอาจจะกำหนดข้อมูลการทำฟอร์แมทเพิ่มเติมให้แก่แต่ละคอลัมน์&amp;nbsp; แล้วเรียก&amp;nbsp; DataBind()&amp;nbsp; method&amp;nbsp; ก็ได้&amp;nbsp; จากนั้น server control จะจัดการงานที่เหลือให้เอง&lt;/p&gt;
&lt;p&gt;ตัวอย่างเช่นในโค้ดตัวอย่าง 12 เราใช้ซินแทกซ์ data binding เพื่อเอาท์พุดผลลัพธ์การทำคิวรีออกไปในลักษณะนี้&lt;/p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:cce5cf8e-e506-457b-9dc0-639e046adaf3" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;%--- &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;In page load event
---%&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
myDataGrid.DataSource = myDataset
myDataGrid.DataBind()
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;%--- &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;outputting the resutlt ---%&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:DataGrid &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;myDataGrid&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; runat&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;p&gt;server&amp;nbsp; control ที่ใช้กับข้อมูลได้จะจัดสรรฟังก์ชันเพิ่มเติมให้เอง อาทิเช่นบริการสำหรับการทำเพจหรือการแก้ไขข้อมูลในขณะที่แสดงผลเป็นต้น&amp;nbsp;&amp;nbsp; ถ้าหากต้องการทราบข้อมูลและดูตัวอย่างเพิ่มเติมกรุณาดูที่หัวข้อ&amp;nbsp;&amp;nbsp; Data&amp;nbsp; Binding Server Controls&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การทำแคชข้อมูลและการทำแคชเพจ&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;การทำแคชข้อมูลที่มีการเรียกใช้บ่อยๆจะช่วยให้เวลาในการตอบสนองของเว็บไซต์ดีขึ้นอย่างมาก&amp;nbsp;&amp;nbsp; เนื่องจากการประมวลผลเพจไม่จำเป็นต้องรอคิวรีดาต้าเบสอีกต่อไป ส่วนการทำแคช HTML ซึ่งสร้างมาจากคำสั่งเรียกใช้เพจจะช่วยทำให้เวลาในการตอบสนองดียิ่งขึ้นไปอีก&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; เนื่องจากเพจที่อยู่ในแคชแล้วไม่จำเป็นต้องประมวลผลอีก&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ภาษาทั้งสองชนิดรองรับการทำแคชทั้งสองแบบได้&amp;nbsp; อย่างไรก็ตาม&amp;nbsp; ASP.NET มีวิธีการในการทำแคชและบริหารข้อมูลมากกว่า PHP ซึ่งจะทำให้นักพัฒนาเลือกวิธีและนโยบายที่เหมาะกับประสิทธิภาพของแอพพลิเคชันของตนมากที่สุดได้&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การทำแคชเพจ&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;การทำแคชเอาท์พุด&amp;nbsp; HTML&amp;nbsp; ของการเรียกเพจจัดเป็นวิธีการพื้นฐานที่ลดภาระการทำงานของเว็บแอพพลิเคชัน แม้ว่า PHP&amp;nbsp;&amp;nbsp; ไม่มีบริการทำแคชเพจโดยตรง&amp;nbsp;&amp;nbsp; แต่เราสามารถเขียนโปรแกรมให้ทำขั้นตอนนี้ได้&amp;nbsp; หรือดาวน์โหลดโปรแกรมของบริษัทอื่นๆมาใช้ได้&amp;nbsp; โดยปกติแล้วการทำแคชเพจมักเกิดขึ้นในฝั่งของเซิร์ฟเวอร์ได้หลายวิธี ตั้งแต่การทำแคชโค้ดที่คอมไพล์แล้วไปจนถึงการสร้างเอาท์พุดของเพจไปเก็บไว้ในไฟล์แยกต่างหาก&amp;nbsp;&amp;nbsp; โดยจะมีการอัพเดตไฟล์ทุกครั้งที่มีการอัพเดตโค้ด &lt;/p&gt;
&lt;p&gt;ส่วนการทำแคชเพจของ&amp;nbsp;&amp;nbsp; ASP.NET&amp;nbsp; จะกระทำผ่าน&amp;nbsp; OutputCache&amp;nbsp; API&amp;nbsp; ระดับล่าง&amp;nbsp; หรือ&amp;nbsp; @OutputCache directive&amp;nbsp;&amp;nbsp; ระดับสูงก็ได้&amp;nbsp; ถ้าหากมีการเปิดการทำงานของการทำแคชเอาท์พุดแล้ว&amp;nbsp; รายการแคชของเอาท์พุดจะถูกสร้างในคำสั่ง&amp;nbsp; GET อันแรกที่อยู่ในเพจ ในขณะที่คำสั่ง GET หรือ HEAD ลำดับต่อๆมาจะเรียกใช้รายการแคชเอาท์พุดโดยตรง จนกว่าจะสิ้นสุดช่วงเวลาที่ใช้เรียกแคช &lt;/p&gt;
&lt;p&gt;เอาท์พุดแคชจะขึ้นอยู่กับนโยบายสิ้นสุดเวลาใช้งานและการตรวจสอบความถูกต้องของเพจ&amp;nbsp; ถ้าหากมีเพจอยู่ในเอาท์พุดแคชและมีการกำหนดนโยบายว่าเพจจะสิ้นสุดอายุการใช้งานภายในเวลา&amp;nbsp; 60&amp;nbsp; นาทีนับตั้งแต่ถูกสร้างขึ้นมา ดังนั้นเมื่อเวลาผ่านไป&amp;nbsp; 60 นาที เพจก็จะถูกลบออกไปจากเอาท์พุดแคช ถ้าหากได้รับคำสั่งอื่นๆหลังจากช่วงเวลาดังกล่าว ก็จะมีการประมวลผลเพจโค้ดใหม่&amp;nbsp; จากนั้นเพจก็จะถูกทำแคชอีกครั้งหนึ่ง นโยบายการกำหนดการสิ้นสุดอายุการใช้งานมีชื่อว่า absolute expiration นั่นก็คือเพจจะใช้งานได้ตามช่วงเวลาที่กำหนดเท่านั้น &lt;/p&gt;
&lt;p&gt;นอกเหนือจากการทำแคชเอาท์พุดของทั้งเพจแล้ว&amp;nbsp; ASP.NET&amp;nbsp; ยังมีวิธีการง่ายๆในการทำแคชเฉพาะบางส่วนของเพจเท่านั้น&amp;nbsp;&amp;nbsp; ซึ่งเรียกว่าการทำแคชบางส่วน&amp;nbsp; (fragment&amp;nbsp; caching)&amp;nbsp; คุณสามารถเลือกพื้นที่บางส่วนของเพจโดยใช้ user&amp;nbsp; control&amp;nbsp; แล้วกำหนดให้พื้นที่ดังกล่าวเป็นแคชโดยใช้&amp;nbsp; @ OutputCache directive เหมือนอย่างที่ได้อธิบายไปในหัวข้อก่อนหน้านี้โดยที่&amp;nbsp; directive&amp;nbsp; ดังกล่าวจะกำหนดช่วงเวลา&amp;nbsp; (เป็นวินาที)&amp;nbsp; ว่าเอาท์พุดของ&amp;nbsp; user control จะทำแคชในเซิร์ฟเวอร์นานขนาดไหน รวมทั้งเงื่อนไขอื่นๆเพิ่มเติมอีกก็ได้&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การทำแคชข้อมูล&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;มีวิธีการหลายแบบสำหรับทำแคชผลลัพธ์การคิวรีใน&amp;nbsp; PHP&amp;nbsp; แต่ทว่าไม่ใช่วิธีการโดยตรงของภาษานี้ การสร้าง class หรือ&amp;nbsp; system&amp;nbsp; ของ&amp;nbsp; Data Caching ใน PHP อาจอยู่ในรูปของข้อมูลขนาดเล็กที่ใช้ตัวแปร Session และ/หรือคุ๊กกี้&amp;nbsp; หรืออาจเป็นการทำแคชข้อมูลขนาดใหญ่ที่มีความซับซ้อนโดยการสร้างคลาส Data caching ของคุณเองขึ้นมาก็ได้&amp;nbsp;&amp;nbsp; ปัญหาก็คือเมื่อคุณทำงานกับข้อมูลหลายประเภทที่มีความซับซ้อน&amp;nbsp;&amp;nbsp; การทำงานแบบนี้จะไม่มีประสิทธิภาพ&amp;nbsp; มีความผิดพลาดเกิดขึ้นได้ง่าย และต้องเขียนโปรแกรมที่ซับซ้อนด้วย &lt;/p&gt;
&lt;p&gt;ส่วน&amp;nbsp; ASP.NET มีวิธีการทำแคชข้อมูลทั้งระบบ (DataSets, arrays, collections, ออปเจ็กต์ XML และอื่นๆอีกมาก)&amp;nbsp; ผ่านทางออปเจ็กต์&amp;nbsp; Page Cache ส่วนแอพพลิเคชันที่ต้องการฟังก์ชันที่ซับซ้อนกว่านี้ ASP.NET สามารถทำแคชเฉพาะได้อีก 3 แบบก็คือ expiration, scavenging และ file and key dependencies &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;แคชประเภท expiration ยอมให้นักพัฒนาควบคุมว่าแคชจะหมดอายุเมื่อไหร่ โดยเราอาจกำหนดเป็นเวลาเฉพาะได้ อาทิเช่น 01:00 หรือเป็นเวลาที่สัมพันธ์กับการใช้ข้อมูลนี้เป็นครั้งสุดท้ายก็ได้ อาทิเช่นหมดอายุ 20 นาที หลังจากใช้ข้อมูลเป็นครั้งสุดท้าย และเมื่อข้อมูลหมดอายุแล้ว มันจะถูกลบออกจากแคชและถ้าหากมีความพยายามจะใช้แคชตัวนี้ในอนาคตก็จะได้รับค่าว่างกลับมา เว้นเสียแต่จะมีการใส่ข้อมูลเดิมลงไปในแคชเสียก่อน&amp;nbsp; &lt;li&gt;แคชแบบ scavenging พยายามที่จะกำจัดข้อมูลที่ไม่ได้ใช้งานบ่อยครั้งหรือไม่สำคัญทิ้งไปในตอนที่เหลือเมมโมรีไม่มากนัก นักพัฒนาสามารถควบคุมได้ว่าจะกำจัดข้อมูลเหล่านี้ทิ้งไปได้อย่างไร รวมทั้งยังบอกใบ้ระบบกำจัดข้อมูลในแคชให้ทราบได้ตอนที่มีการใส่ข้อมูลต่างๆลงไปในแคชเพื่อบอกว่าการสร้างข้อมูลประเภทนี้ยุ่งยากขนาดไหน และข้อมูลนี้ควรมีอัตราการเรียกใช้บ่อยครั้งขนาดไหนจึงจัดว่าเป็นข้อมูลที่มีประโยชน์&amp;nbsp; &lt;li&gt;แคชประเภท file and key dependencies ยอมให้มีการตรวจสอบความถูกต้องของข้อมูลในแคชโดยอิงกับไฟล์ภายนอกหรือข้อมูลอื่นๆในแคชก็ได้ ถ้าหากการเชื่อมโยงมีการเปลี่ยนแปลงเกิดขึ้น ข้อมูลที่อยู่ในแคชจะไม่ถูกต้องอีกต่อไปและจะถูกลบออกจากแคช ตัวอย่างของการใช้ฟังก์ชันนี้ในแอพพลิเคชันก็คือถ้าหากคุณมีรายงานขนาดใหญ่ที่ต้องแก้ไขและดาวน์โหลดไปให้พนักงานของคุณโดยตรง แอพพลิเคชันจะประมวลผลข้อมูลที่อยู่ในไฟล์และรายงาน จากนั้นแอพพลิเคชันจะทำการแคชข้อมูล รวมทั้งใส่ความสัมพันธ์ลงไปว่าข้อมูลอ่านมาจากไฟล์ได้ ถ้าหากไฟล์มีการอัพเดต ข้อมูลจะถูกลบออกจากแคช แอพพลิเคชันจะอ่านข้อมูลซ้ำ แล้วใส่ข้อมูลที่อัพเดตแล้วลงไปในแคช &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;การทำแคชข้อมูลของ&amp;nbsp; ASP.NET ช่วยให้โปรแกรมเมอร์มีวิธีการที่ต่างออกไปสำหรับบริหารแอพพลิเคชัน ซึ่งจะทำให้แอพพลิเคชันตอบสนองและมีประสิทธิภาพดีขึ้นด้วย&amp;nbsp;&amp;nbsp;&amp;nbsp; ถ้าหากต้องการทราบข้อมูลเพิ่มเติมดูหัวข้อ&amp;nbsp;&amp;nbsp; Cache&amp;nbsp;&amp;nbsp; Class documentation for the Cache object&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การส่งอีเมล์&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;ทั้ง&amp;nbsp; PHP&amp;nbsp; และ&amp;nbsp; ASP.NET มีคุณสมบัติในตัวเพื่อใช้เขียนโปรแกรมเกี่ยวกับอีเมล์โดยเฉพาะ ถ้าหากต้องการส่งอีเมล์โดยใช้ ASP.NET ในตัวอย่างนี้คุณจำเป็นต้องเซ็ตอัพบริการ IIS SMTP การที่คุณจำเป็นต้องติดตั้งบริการนี้ก่อนก็เนื่องจากเมล์ออปเจ็กต์ใน .NET จำเป็นต้องขึ้นอยู่กับออปเจ็กต์ของบริการนี้ อย่างไรก็ตาม .NET ยอมให้คุณทำงานกับเซิร์ฟเวอร์&amp;nbsp; SMTP ใดๆ หรือเมล์เซิร์ฟเวอร์อย่าง PHP ก็ได้ โค้ดตัวอย่าง 13 จะทำการเปรียบเทียบซินแทกซ์ของภาษาทั้งสองชนิด&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="4" width="700"&gt;

&lt;tr&gt;
&lt;td valign="top" width="350"&gt;PHP&lt;br /&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:5d6c0f1e-1cca-4595-b263-282a889cb5ed" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#800080;"&gt;$to&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;test@atnoaddress.com&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$from&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;me@nosuchaddress.com&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$subject&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;hi&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#800080;"&gt;$message&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;just wanted to say hi&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;mail&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800080;"&gt;$to&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#800080;"&gt;$subject&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#800080;"&gt;$message&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;$from&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td valign="top" width="350"&gt;VB.NET
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:d71432cc-80c0-454e-b349-52902358ecc2" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; myMail &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; MailMessage &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; MailMessage()

myMail.From &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;me@nosuchaddress.com&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
myMail.To &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;test@atnoaddress.com&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
myMail.Subect &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;hi&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
myMail.Body &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;just wanted to say hi&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;

SmtpMail.Send(myMail)
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;โค้ดตัวอย่าง 13 การส่งอีเมล์&lt;/p&gt;
&lt;p&gt;&lt;b&gt;การแก้ไข &lt;/b&gt;&lt;b&gt;XML และเว็บเซอร์วิส&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;บริการในตัวสำหรับการเขียนโปรแกรมและการแก้ไข&amp;nbsp; XML ใน PHP ค่อนข้างย่ำแย่อย่างมาก แม้ว่านักพัฒนาสามารถใช้บริการดังกล่าวเพื่อเขียนโปรแกรมและดัดแปลง&amp;nbsp; XML ได้ก็ตาม แต่ PHP ไม่มีการเขียนโปรแกรมของ DOM แม้ว่าการเขียนโปรแกรม&amp;nbsp; DOM&amp;nbsp; ช้ากว่าการเขียนโปรแกรม SAX ของ PHP ก็ตาม แต่การทำงานกับ DOM ทำได้ง่ายกว่า นอกจากนั้น&amp;nbsp; PHP&amp;nbsp; ยังไม่มีความสามารถในการตรวจสอบความถูกต้องของเอกสาร&amp;nbsp; XML&amp;nbsp; เทียบกับ DTD หรือ XML SCHEME&amp;nbsp; อีกด้วย&amp;nbsp; แถม PHP ยังไม่สามารถทำงานับ XSL/XSLT รวมทั้งเทคโนโลยีอื่นๆอีกมาก ซึ่งถือเป็นเรื่องปกติของผลิตภัณฑ์เว็บแอพพลิเคชันอื่นๆอีกหลายชนิดในตลาด&amp;nbsp; แม้ว่ามีแพกเก็จ PHP หลายชนิดที่ทำให้ PHP สามารถทำงานหลายอย่างที่เกี่ยวข้องกับ&amp;nbsp; XML ได้ก็ตาม แต่ .NET และ ASP.NET มีความสามารถที่หลากหลายเพื่อทำงานกับ XML โดยตรง&amp;nbsp; XML&amp;nbsp; จัดเป็นเทคโนโลยีที่ถือเป็นหัวใจสำคัญของแพลตฟอร์ม .NET คุณสามารถเรียนรู้เกี่ยวกับเว็บเซอร์วิสได้โดยการอ่านหัวข้อ &amp;quot;วิธีการทำงานของเว็บเซอร์วิสใน ASP.NET&amp;quot; &lt;/p&gt;
&lt;p&gt;.NET&amp;nbsp; Framework&amp;nbsp; สามารถทำงานกับเงื่อนไขทั้งหมดของ&amp;nbsp; XML&amp;nbsp; ที่กำหนดเอาไว้โดย W3C ได้ รวมทั้งยังรองรับการทำงานของ&amp;nbsp; XSL/XSLT,&amp;nbsp; XPath,&amp;nbsp; XQuery&amp;nbsp; รวมทั้งเทคโนโลยีอื่นๆอีกมาก อาทิเช่น UDDI, WSDL, SOAP for Web services เป็นต้น &lt;/p&gt;
&lt;p&gt;แม้ว่าเราสามารถสร้างกลไก XML-RPC ใน PHP ได้ก็ตาม แต่การสร้างเว็บเซอร์วิสกลับป็นเรื่องที่ยากกว่ามาก เว็บเซอร์วิสจะช่วยให้นักพัฒนาสามารถแลกเปลี่ยนข้อมูลและ&amp;nbsp; procedure โดยใช้โพรโตคอลและมาตรฐานพื้นฐานเพื่อใช้สำหรับ&amp;nbsp; discovery, data binding และ description ได้ ส่วน .NET สามารถทำงานกับเว็บเซอร์วิสได้อย่างครอบคลุม รวมทั้งเทคโนโลยีที่เกี่ยวข้องกัน อาทิ SOAP, WSDL และ UDDI นอกจากนั้น .NET ยังช่วยให้นักพัฒนาสร้างและพัฒนาเว็บเซอร์วิสขึ้นมาได้โดยง่ายอีกด้วย&amp;nbsp; ตัวอย่างเช่นนี่เป็นตัวอย่างการใช้เว็บเซอร์วิสเพื่อสร้างข้อความ &amp;quot;hello world&amp;quot; แบบง่ายๆขึ้นมา&lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:b344826f-d5ec-45cc-bd64-4b42f18788fe" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;%@ WebService Language&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;VB&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;HelloWorld&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; %&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
 
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Imports&lt;/span&gt;&lt;span style="color:#000000;"&gt; System
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Imports&lt;/span&gt;&lt;span style="color:#000000;"&gt; System.Web.Services
 
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Class&lt;/span&gt;&lt;span style="color:#000000;"&gt; HelloWorld :&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Inherits&lt;/span&gt;&lt;span style="color:#000000;"&gt; WebService
 
   &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;WebMethod()&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Function&lt;/span&gt;&lt;span style="color:#000000;"&gt; SayHelloWorld() &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt;
      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Return&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Hello World&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
   &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Function&lt;/span&gt;&lt;span style="color:#000000;"&gt;
 
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;End Class&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;.NET&amp;nbsp; Framework&amp;nbsp; SDK ยอมให้คุณสร้าง proxy classes โดยใช้คอมมานด์ไลน์ของเครื่องมือ Web Services Description&amp;nbsp; Language&amp;nbsp; (WSDL.exe) ได้ ถ้าหากต้องการสร้าง proxy class ที่ชื่อ HelloWorld.cs สำหรับตัวอย่างด้านบนให้คุณกรอกข้อความว่า &lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:9f8d7c7e-4f7c-416d-87fc-5c81815c3fe1" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;WSDL http:&lt;/span&gt;&lt;span style="color:#000000;"&gt;//&lt;/span&gt;&lt;span style="color:#000000;"&gt;someDomain.com&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;someFolder&lt;/span&gt;&lt;span style="color:#000000;"&gt;/&lt;/span&gt;&lt;span style="color:#000000;"&gt;HelloWorld.asmx&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&lt;/span&gt;&lt;span style="color:#000000;"&gt;WSDL
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;คลาสดังกล่าวมีหน้าตาเหมือนกับคลาสที่สร้างขึ้นมาในหัวข้อก่อน&amp;nbsp; โดยมันจะมี&amp;nbsp; method ที่เรียกว่า SayHelloWorld สำหรับส่งสตริงกลับไป&amp;nbsp; คุณสามารถคอมไพล์&amp;nbsp; proxy class นี้ไปเป็นแอพพลิเคชันแล้วเรียก method ของ proxy class นี้ โดยใช้ proxy class ที่หุ้มคำสั่ง SOAP ผ่าน HTTP และได้รับคำตอบ SOAP กลับมาในรูปของสตริง &lt;/p&gt;
&lt;p&gt;ถ้าหากอิงกับมุมมองของไคล์เอ็นต์ โค้ดจะเรียบง่ายอย่างมาก ซึ่งแสดงอยู่ในตัวอย่างด้านล่างนี้&lt;/p&gt;
&lt;div style="padding-right:0px;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;display:inline;" id="scid:F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:fcd76ecb-3ff2-4772-91cf-b90a44f88b72" class="wlWriterSmartContent"&gt;&lt;pre style="width:100%;"&gt;&lt;div&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; myHelloWorld &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;New&lt;/span&gt;&lt;span style="color:#000000;"&gt; HelloWorld()
&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;Dim&lt;/span&gt;&lt;span style="color:#000000;"&gt; sReturn &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;As&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;String&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; myHelloWorld.SayHelloWorld()
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;ทั้งหมดนี้ก็คือวิธีการสร้างเว็บเซอร์วิสแบบง่ายๆขึ้นมา&amp;nbsp; ถ้าหากทราบข้อมูลทั่วไปของ&amp;nbsp; XML&amp;nbsp; และข้อมูลเฉพาะของเว็บเซอร์วิส ให้เข้าไปที่หัวข้อ &amp;quot;วิธีการใช้ XML ใน .NET Framework&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;สรุป&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;โดยส่วนใหญ่แล้วการแปลงจาก&amp;nbsp; PHP&amp;nbsp; ไปเป็น&amp;nbsp; ASP.NET&amp;nbsp; ไม่ใช่เรื่องที่ซับซ้อนแต่อย่างใด ถ้าหากเป็นแอพพลิเคชันแบบง่ายๆที่มีขนาดเล็ก&amp;nbsp; แต่ความแตกต่างในเรื่องของโครงสร้างรวมทั้งแนวทางการใช้&amp;nbsp; OOP ของ ASP.NET ทำให้การแปลงแอพพลิเคชันที่ซับซ้อนจึงจำเป็นต้องมีการวางแผนอย่างรอบคอบเสียก่อน&amp;nbsp;&amp;nbsp;&amp;nbsp; คุณจึงจะได้ประโยชน์อย่างเต็มที่จากการแยกตรรกะออกจากข้อมูลอย่างเข้มงวดของ&amp;nbsp; ASP.NET จากนั้นคุณก็จะประหยัดเวลาในการสร้างฟังก์ชันต่างๆ เนื่องจากคุณจะเขียนโค้ดเพื่อทำงานใกล้เคียงกันน้อยลงนั่นเอง&lt;/p&gt;&lt;img src="http://coredeveloper.net/aggbug.aspx?PostID=56" width="1" height="1"&gt;</description><category domain="http://coredeveloper.net/blogs/article/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/php/default.aspx">php</category><category domain="http://coredeveloper.net/blogs/article/archive/tags/beginner/default.aspx">beginner</category></item><item><title>Creating a Pageable, Sortable DataGrid</title><link>http://coredeveloper.net/blogs/article/archive/2008/01/25/creating-a-pageable-sortable-datagrid.aspx</link><pubDate>Fri, 25 Jan 2008 10:04:00 GMT</pubDate><guid isPermaLink="false">86cc649a-bf28-4d34-a9ef-d75c61f34293:57</guid><dc:creator>admin</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://coredeveloper.net/blogs/article/rsscomments.aspx?PostID=57</wfw:commentRss><comments>http://coredeveloper.net/blogs/article/archive/2008/01/25/creating-a-pageable-sortable-datagrid.aspx#comments</comments><description>&lt;p&gt;ใช้ได้กับ 
&lt;p&gt;Microsoft ASP.NET &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;สรุป:&lt;/strong&gt; 
&lt;p&gt;เรียนรู้วิธีการสร้าง DataGrid ที่จัดเรียงเรกคอร์ดได้และ DataGrid ที่จัดเพจได้ เรียนรู้ขั้นตอนที่จำเป็นที่จะผสานเทคนิคทั้งสองชนิดไปเป็น&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp;&amp;nbsp; ที่จัดเรียงข้อมูลและจัดเพจได้เพียงชุดเดียว เว็บคอนโทรล DataGrid&amp;nbsp; ช่วยให้นักพัฒนา&amp;nbsp; ASP.NET สามารถนำอาข้อมูลไปแสดงผลได้อย่างรวดเร็วและง่ายดาย นอกจากแสดงผลข้อมูลแบบง่ายๆแล้ว&amp;nbsp; DataGrid&amp;nbsp; ยังยอมให้มีการจัดเรียง จัดเพจ และแก้ไขข้อมูลได้ด้วย แม้ว่าการใส่ระบบจัดเรียงข้อมูลและระบบจัดเพจลงไปใน&amp;nbsp; DataGrid&amp;nbsp; เป็นเรื่องที่ตรงไปตรงมาก็ตาม แต่การสร้าง DataGrid ที่ทั้งจัดเพจและจัดเรียงข้อมูลได้พร้อมกันจัดเป็นเรื่องที่มีความท้าทายมากกว่าปกติเล็กน้อย&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;คำนำ&lt;/strong&gt; 
&lt;p&gt;เรื่องที่มีประโยชน์มากที่สุดอย่างหนึ่งของ&amp;nbsp;&amp;nbsp; Microsoft&amp;nbsp; ASP.NET&amp;nbsp; ก็คือการนำเอาข้อมูลไปแสดงผลในเว็บเพจได้โดยง่าย&amp;nbsp; ASP.NET&amp;nbsp; มีดาต้าเว็บคอนโทรล&amp;nbsp; 3&amp;nbsp; ชนิดก็คือ DataGrid, DataList และ Repeater ซึ่งแต่ละชนิดถูกออกแบบมาให้แสดงผลข้อมูลได้อย่างสมบูรณ์แบบ ดาต้าเว็บคอนโทรลที่มีการใช้งานมากที่สุดก็คือ DataGrid เนื่องจากมีชุดคุณสมบัติที่มีประโยชน์ต่างๆในตัวคอนโทรลเลย คุณเพียงแต่กำหนด&amp;nbsp;&amp;nbsp;&amp;nbsp; properties&amp;nbsp;&amp;nbsp; เพียงสองสามตัว แล้วสร้าง ตัวจัดการเหตุการณ์สองสามอันขึ้นมา DataGrid ก็สามารถจัดเรียงข้อมูล จัดเพจ หรือแก้ไขข้อมูลได้แล้ว ถ้าหากต้องการทราบความแตกต่างของดาต้าเว็บคอนโทรลทั้ง&amp;nbsp; 3&amp;nbsp; ชนิด รวมทั้งการที่ควรจะนำคอนโทรลแต่ละชนิดมาใช้เมื่อไหร่ กรุณาอ่านบทความเรื่อง&amp;nbsp;&amp;nbsp; &amp;quot;การตัดสินใจว่าเมื่อไหร่ที่ควรจะใช้&amp;nbsp;&amp;nbsp; DataGrid,&amp;nbsp;&amp;nbsp; DataList&amp;nbsp; หรือ Repeater&amp;quot;&lt;/p&gt;
&lt;p&gt;แม้ว่าการสร้าง&amp;nbsp; DataGrid&amp;nbsp; ที่จัดเพจได้ หรือจัดเรียงข้อมูลได้อย่างใดอย่างหนึ่งเป็นเรื่องที่ตรงไปตรงมาก็ตาม แต่การสร้าง&amp;nbsp; DataGrid ที่ทั้งจัดเพจได้และจัดเรียงข้อมูลได้จัดเป็นเรื่องที่มีความท้าทายมากกว่าเล็กน้อย ในบทความนี้เราจะเริ่มต้นจากการศึกษาว่าจะสร้าง&amp;nbsp; DataGrid ที่จัดเรียงข้อมูลได้หรือจัดเพจได้อย่างไร จากนั้นทำการศึกษาว่าจะรวมเอาคุณสมบัติทั้งสองชนิดไปเป็น&amp;nbsp; Datagrid&amp;nbsp; เพียงอันเดียวได้อย่างไร บทความสองหัวข้อแรกจะพูดถึงวิธีการเพิ่มฟังก์ชันการจัดเรียงข้อมูลและฟังก์ชันการจัดเพจไปไว้ในคอนโทรล&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp; ถ้าหากคุณรู้เรื่องพวกนี้ดีอยู่แล้ว ให้คุณข้ามไปยังหัวข้อสุดท้ายได้เลย ซึ่งจะเป็นการเชื่อมคุณสมบัติทั้งสองชนิดเข้าด้วยกันใน Datagrid เพียงอันเดียว 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การสร้าง DataGrid ที่จัดเรียงข้อมูลได้&lt;/strong&gt; 
&lt;p&gt;ก่อนที่เราจะเริ่มต้นสร้าง&amp;nbsp; DataGrid ที่จัดเรียงข้อมูลได้ เราต้องการ DataGrid นี้แสดงข้อมูลแบบง่ายๆบางอย่างได้เสียก่อน ซึ่งตามจุดมุ่งหมายของบทความนี้ เราลองมาสร้าง&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp; แบบง่ายๆที่แสดงข้อมูลตาราง Products ในดาต้าเบส Northwind กันดีกว่า&lt;/p&gt;
&lt;p&gt;หมายเหตุ:&amp;nbsp; ดาต้าเบส&amp;nbsp; Northwind เป็นดาต้าเบสมาตรฐานที่ให้มาพร้อมกับผลิตภัณฑ์ดาต้าเบสชนิดต่างๆของไมโครซอฟท์ อาทิเช่น Microsoft SQL Server และ Microsoft Access เป็นต้น&lt;/p&gt;
&lt;p&gt;ให้เราสร้างเว็บเพจ&amp;nbsp; ASP.NET&amp;nbsp; อันใหม่ขึ้นมาโดยตั้งชื่อว่า SortableDataGrid.aspx แล้วเพิ่ม DataGrid ที่มี ID&amp;nbsp; property&amp;nbsp; set&amp;nbsp; ลงไปใน&amp;nbsp; dgProducts&amp;nbsp; ขั้นต่อมากำหนด AutoGenerateColumns property ให้เป็น False&amp;nbsp;&amp;nbsp; และปรับแต่ง&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp; เพื่อให้มันใช้&amp;nbsp; BoundColumns&amp;nbsp; สามชุดเพื่อแสดงฟิลด์&amp;nbsp; ProductName, UnitPrice&amp;nbsp;&amp;nbsp;&amp;nbsp; และ&amp;nbsp;&amp;nbsp;&amp;nbsp; UnitsInStock&amp;nbsp;&amp;nbsp; สิ่งที่เหลือที่จำเป็นต้องทำก็คือการคิวรีดาต้าเบสและเชื่อมผลลัพธ์ไปยัง DataGrid&amp;nbsp; โค้ดด้านล่างต่อไปนี้แสดง Page Load event handler และ method พิเศษที่ชื่อ BindData() ซึ่งควรจะเพิ่มเข้าไปให้คลาสที่อยู่เบื้องหลังโค้ดเพื่อให้ทุกอย่างทำงานได้&lt;/p&gt;&lt;pre&gt;private void Page_Load(object sender, System.EventArgs e)
{
   BindData();
}

private void BindData()
{
   // Connect to the Database
   SqlConnection myConnection = new SqlConnection(&lt;i&gt;connection string&lt;/i&gt;);

   // Retrieve the SQL query results and bind it to the Repeater
   string SQL_QUERY = &amp;quot;SELECT ProductName, UnitPrice, UnitsInStock &amp;quot; +
                      &amp;quot;FROM Products&amp;quot;;
   SqlCommand myCommand = new SqlCommand(SQL_QUERY, myConnection);

   myConnection.Open();
   dgProducts.DataSource = myCommand.ExecuteReader();
   dgProducts.DataBind();
   myConnection.Close();
}
&lt;/pre&gt;
&lt;p&gt;หมายเหตุ การที่จะทำให้โค้ดนี้ใช้งานได้ คุณจำเป็นต้องอิมพอร์ต System.Data.SqlClientnamespace ไปไว้ในคลาสที่อยูเบื้องหลังโค้ดเสียก่อน นอกจากนั้นคุณยังจำเป็นต้องทำการเปลี่ยนแปลง&amp;nbsp;&amp;nbsp; connection&amp;nbsp; string&amp;nbsp; ใน SqlConnection&amp;nbsp; constructor&amp;nbsp; ไปเป็น&amp;nbsp; connection&amp;nbsp; string ที่เชื่อมต่อกับดาต้าเบสด้วย หลังจากที่คุณใส่โค้ดนี้ลงไปแล้ว ให้คุณทำการ&amp;nbsp; build&amp;nbsp; โซลูชันขึ้นมาแล้วทำการทดสอบเว็บเพจนี้โดยการเข้าไปในเพจดังกล่าวผ่านทางเว็บบราวเซอร์ ภาพที่&amp;nbsp;&amp;nbsp; 1&amp;nbsp; แสดงหน้าจอของ&amp;nbsp; SortableDataGrid.aspx&amp;nbsp; (คุณสามารถทำให้หน้าตาของ DataGrid ดูโดดเด่นกว่านี้ได้โดยง่ายโดยการใช้เครื่องมือ Auto Format ของ Microsoft Visual Studio .NET)&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa479006_aspnet-pageablesortable-01.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;ภาพที่ 1: sortableDataGrid.aspx เมื่อดูจากบราวเซอร์&lt;/p&gt;
&lt;p&gt;วิธีการทำให้&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp; ใน&amp;nbsp; SortableDataGrid.aspx&amp;nbsp; จัดเรียงข้อมูลได้ คุณต้องเริ่มต้นโดยการกำหนด AllowSorting&amp;nbsp; property ของ DataGrid ให้เป็น True เสียก่อน ซึ่งหลังจากที่ property ถูกกำหนดให้เป็น True&amp;nbsp; แล้ว&amp;nbsp; DataGrid&amp;nbsp; จะแสดงผลหัวเรื่องของแต่ละคอลัมน์เป็น LinkButton ซึ่งจะส่งผลทำให้การแสดงผลหัวเรื่องอของแต่ละคอลัมน์กลายเป็นไฮเปอร์ลิงก์ ผู้ใช้สามารถระบุว่าต้องการให้คอลัมน์ใดที่&amp;nbsp; DataGrid&amp;nbsp; ทำการจัดเรียงข้อมูลให้ โดยการคลิกไปที่ไฮเปอร์ลิงก์ที่เหมาะสมในหัวเรื่องของคอลัมน์&lt;/p&gt;
&lt;p&gt;เมื่อมีการคลิกที่ไฮเปอร์ลิงก์ของหัวเรื่องคอลัมน์ เว็บเพจ ASP.NET จะถูกโพสต์กลับไปและ Sortcommand event ของ&amp;nbsp; DataGrid&amp;nbsp; จะเริ่มทำงาน เราในฐานะของนักพัฒนาที่สร้างเว็บเพจนี้ขึ้นมา มีหน้าที่ต้องสร้างระบบจัดการเหตุการณ์ขึ้นมาตัวหนึ่งสำหรับ&amp;nbsp; SortCommand event ของ Datagrid จากนั้นเชื่อมโยง SortCommand event ของ Datagrid&amp;nbsp;&amp;nbsp;&amp;nbsp; กับระบบจัดการเหตุการณ์ที่เราสร้างขึ้นมา หน้าที่ของระบบจัดการเหตุการณ์ตัวนี้ก็คือการแยกแยะว่าคอลัมน์ใดที่ผู้ใช้ต้องการจัดเรียงข้อมูล จากนั้นทำการจัดเรียงข้อมูลใหม่ แล้วเชื่อมโยงข้อมูลกลับไปหา DataGrid&lt;/p&gt;
&lt;p&gt;ก่อนที่จะเขียนโค้ดสำหรับ&amp;nbsp; Sortcommand&amp;nbsp; event handler ก่อนอื่นเราต้องเพิ่มตัวจัดการเหตุการณ์ลงไป การใช้เครื่องมืออย่าง&amp;nbsp;&amp;nbsp; Visual&amp;nbsp;&amp;nbsp; Studio&amp;nbsp; .NET&amp;nbsp; ทำให้ในตอนนี้ง่ายดายอย่างมาก คุณแค่คลิกไปยัง&amp;nbsp; dgProducts DataGrid&amp;nbsp; ใน&amp;nbsp; Designes&amp;nbsp; เพื่อแก้ไข properties ของมันเท่านั้น ขั้นต่อมาคลิกที่ไอคอนสายล่อฟ้าซึ่งอยู่ด้านบนสุดของช่อง&amp;nbsp; Properties เพื่อเรียกดูเหตุการณ์ของ DataGrid ให้คุณเลื่อนไปยัง SortCommand event แล้วใส่ชื่อของตัวจัดการเหตุการณ์ที่คุณต้องการให้มีส่วนเกี่ยวข้องกับเหตุการณ์นี้ลงไป&amp;nbsp; Visual&amp;nbsp; Studio .NET จะทำงานที่เหลือให้เอง ภาพที่ 2 แสดงรายชื่อเหตุการณ์ในช่อง Properties&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa479006_aspnet-pageablesortable-02(en-us,MSDN_10).gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;ภาพที่ 2 การสร้างตัวจัดการเหตุการณ์สำหรับเหตุการณ์ SortCommand ของ DataGrid&lt;/p&gt;
&lt;p&gt;อย่างที่แสดงเอาไว้ในภาพที่&amp;nbsp; 2&amp;nbsp; ก็คือผมได้ตัดสินใจตั้งชื่อตัวจัดการเหตุการณ์นี้ว่า&amp;nbsp; dgProducts_Sort แต่ชื่ออื่นๆที่เหมาะสมก็ใช้ได้เหมือนกัน หลังจากที่คุณใส่ชื่อตัวจัดการเหตุการณ์ลงไปในกรอบข้อความเหตุการณ์ที่เหมาะสมแล้ว Visual&amp;nbsp; Studio .NET จะสร้าง event handler function shell ขึ้นมาโดยอัตโนมัติในคลาสเบื้องหลังโค้ด จากนั้นทำการเชื่อมโยงเหตุการณ์กับตัวจัดการเหตุการณ์&lt;/p&gt;
&lt;p&gt;ถ้าหากคุณไม่ได้ใช้&amp;nbsp; Visual&amp;nbsp; Studio&amp;nbsp; .NET&amp;nbsp; คุณจำเป็นต้องทำขั้นตอน&amp;nbsp; 2 อย่างนี้ด้วยมือ ก่อนอื่นคุณต้องเริ่มโดยการสร้างเชลล์สำหรับตัวจัดการเหตุการณ์ ซึ่งมีหน้าตาดังนี้&lt;/p&gt;
&lt;p&gt;private void dgProducts _Sort(object source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGridSortCommandEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; // we&amp;#39;ll add the code here in a bit!&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;จากนั้นเชื่อมโยง&amp;nbsp; SortCommand&amp;nbsp; event&amp;nbsp; ของ DataGrid ไปหาตัวจัดการเหตุการณ์ ซึ่งคุณสามารถทำได้หนึ่งในสองแบบนี้ก็คือ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ใส่&amp;nbsp; OnSortcommand&amp;nbsp; = &amp;quot;dgProducts_Sort&amp;quot; ใน declaration ของ DataGrid (นั่นก็คือการใส่องค์ประกอบดังกล่าวลงไปใน &amp;lt;asp:DataGrid&amp;gt; start tag ในส่วนของ HTML) 
&lt;li&gt;เขียนโปรแกรมกำหนดให้เหตุการณ์ของ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; เชื่อมโยงกับตัวจัดการเหตุการณ์ใน InitializeComponent()&amp;nbsp; method&amp;nbsp; ในคลาสที่อยู่เบื้องหลังโค้ด ถ้าหากเป็น&amp;nbsp; C# คุณสามารถเขียนซินแทกซ์ในลักษณะนี้&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;dgProducts.SortCommand += &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new DataGridSortCommandEventHandler(dgProducts_Sort);&lt;/p&gt;
&lt;p&gt;ถ้าหากเป็น Microsoft Visual Basic .NET ซินแทกซ์จะมีหน้าตาแบบนี้&lt;/p&gt;
&lt;p&gt;AddHandler dgProducts.SortCommand, AddressOf dgProducts_Sort&lt;/p&gt;
&lt;p&gt;หลังจากที่ตัวจัดการเหตุการณ์ถูกสร้างขึ้นมา และถูกเชื่อมโยงไปหา&amp;nbsp; SortCommand event ของ DataGrid แล้ว เราก็พร้อมที่จะใส่โค้ดสำหรับตัวจัดการเหตุการณ์ได้ หัวใจสำคัญก็คือเราต้องแยกแยะว่าผู้ใช้ต้องการจัดเรียงข้อมูลที่อยู่ในคอลัมน์ใด จากนั้นทำการคิวรีดาต้าเบสซ้ำเพื่อเรียกผลลัพธ์ให้เรียงตามลำดับที่ต้องการ เราสามารถแยกแยะว่าคอลัมน์ใดที่ผู้ใช้คลิกลงไปแล้วก่อให้เกิด&amp;nbsp; postback&amp;nbsp; โดยการตรวจสอบ&amp;nbsp; SortExpresstion property ของพารามิเตอร์ DataGridSortCommandEventAvgs ที่ส่งต่อไปให้ตัวจัดการเหตุการณ์ dgProducts_Sort 
&lt;p&gt;เมื่อทราบว่าคอลัมน์&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp;&amp;nbsp; แต่ละคอลัมน์มีค่า&amp;nbsp;&amp;nbsp;&amp;nbsp; SortExpression&amp;nbsp;&amp;nbsp;&amp;nbsp; ที่เชื่อมโยงกันอยู่ ถ้าหาก AutoGenerateColumns&amp;nbsp;&amp;nbsp; property&amp;nbsp; ของ&amp;nbsp; DataGrid&amp;nbsp; ถูกกำหนดให้เป็น&amp;nbsp; True&amp;nbsp; แต่ละคอลัมน์จะกำหนดค่า SortExpression&amp;nbsp; เท่ากับชื่อของฟิลด์&amp;nbsp; DataSource ที่คอลัมน์นั้นแสดงอยู่ ถ้าหาก AutoGenerateColumns กำหนดให้เป็น&amp;nbsp; False&amp;nbsp; เราจำเป็นต้องกำหนดค่าของ&amp;nbsp; SortExpression property โดยตรง ถ้าหากเราไม่ได้กำหนด&amp;nbsp; SortExpression&amp;nbsp; property&amp;nbsp; ให้แก่แต่ละคอลัมน์แล้วละก็ หัวเรื่องของคอลัมน์จะไม่แสดงเป็นไฮเปอร์ลิงก์ จากนั้นผู้ใช้ก็จะไม่สามารถจัดเรียงข้อมูลของคอลัมน์นั้นใน&amp;nbsp; DataGrid&amp;nbsp; ได้ เพื่อเป็นการแสดงตัวอย่างวิธีกำหนดค่า เราจึงได้กำหนดค่า&amp;nbsp; SortExpression&amp;nbsp; ของ&amp;nbsp; BoundColumns&amp;nbsp; สองคอลัมน์แรกให้ดู ส่วนคุณสามารถกำหนดให้ SortExpression&amp;nbsp; property&amp;nbsp; มีค่าเป็นอะไรก็ได้ แต่คุณต้องกำหนด&amp;nbsp; SortExpression ของ BoundColumn สองคอลัมน์แรกให้มีค่าเดียวกับ&amp;nbsp; DataField&amp;nbsp; property&amp;nbsp; หลังจากทำแบบนี้เสร็จแล้ว DataGrid declaration ของคุณควรมีหน้าตาแบบนี้ 
&lt;p&gt;&amp;lt;asp:DataGrid id=&amp;quot;dgProducts&amp;quot; runat=&amp;quot;server&amp;quot; AllowSorting=&amp;quot;True&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoGenerateColumns=&amp;quot;False&amp;quot; ...&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Columns&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundColumn DataField=&amp;quot;ProductName&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HeaderText=&amp;quot;Product Name&amp;quot;&amp;nbsp; &lt;br /&gt;&lt;code&gt;&lt;b&gt;SortExpression=&amp;quot;ProductName&amp;quot;&lt;/b&gt;&lt;/code&gt;&amp;gt;&amp;lt;/asp:BoundColumn&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundColumn DataField=&amp;quot;UnitPrice&amp;quot; HeaderText=&amp;quot;Unit Price&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataFormatString=&amp;quot;{0:c}&amp;quot; &lt;br /&gt;&lt;code&gt;&lt;b&gt;SortExpression=&amp;quot;UnitPrice&amp;quot;&lt;/b&gt;&lt;/code&gt;&amp;gt;&amp;lt;/asp:BoundColumn&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:BoundColumn DataField=&amp;quot;UnitsInStock&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HeaderText=&amp;quot;Units In Stock&amp;quot; DataFormatString=&amp;quot;{0:d}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:BoundColumn&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:DataGrid&amp;gt; 
&lt;p&gt;ในตอนนี้ในตัวจัดการเหตุการณ์&amp;nbsp; dgProducts_Sort เราจำเป็นต้องกำหนดค่าของ SortExpression แล้วทำการเชื่อมโยงข้อมูลที่เรียงลำดับอย่างถูกต้องกลับไปหา&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp; มีวิธีการหลายแบบที่จะทำขั้นตอนนี้ได้ แต่วิธีการที่ง่ายที่สุดก็คือการคิวรีข้อมูลทั้งหมดซ้ำโดยให้เรียงลำดับตามฟิลด์ที่กำหนดเอาไว้ใน&amp;nbsp; SortExpression&amp;nbsp; วิธีการนี้อาจไม่ใช่วิธีที่มีประสิทธิภาพมากที่สุด แต่ตาราง&amp;nbsp; Products ยอมรับได้ เนื่องจากตารางนี้มีเรกคอร์ดแค่ 77 เรกคอร์ดเท่านั้น หรือคุณอาจจะคิวรีซ้ำโดยการแก้ไข BindData() method ให้ยอมรับสตริงพารามิเตอร์ที่เป็นชื่อของคอลัมน์ให้ทำการจัดเรียงผลลัพธ์ก็ได้ จากนั้น BindData() เวอร์ชันแก้ไขก็จะมีหน้าตาแบบนี้ 
&lt;p&gt;private void BindData(&lt;b&gt;string orderBy&lt;/b&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Connect to the Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; SqlConnection myConnection = new SqlConnection(&lt;i&gt;connection string&lt;/i&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Retrieve the SQL query results and bind it to the DataGrid&lt;br /&gt;&amp;nbsp;&amp;nbsp; string SQL_QUERY = &amp;quot;SELECT ProductName, UnitPrice, UnitsInStock &amp;quot; +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;FROM Products ORDER BY &amp;quot;&lt;b&gt; + orderBy&lt;/b&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; SqlCommand myCommand = new SqlCommand(SQL_QUERY, myConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp; myConnection.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp; dgProducts.DataSource = myCommand.ExecuteReader();&lt;br /&gt;&amp;nbsp;&amp;nbsp; dgProducts.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp; myConnection.Close();&lt;br /&gt;} 
&lt;p&gt;private void dgProducts_Sort(object source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Web.UI.WebControls.DataGridSortCommandEventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; BindData(e.SortExpression);&lt;/b&gt;&lt;br /&gt;} 
&lt;p&gt;งานที่เหลือที่ต้องทำก็คือการอัพเดต&amp;nbsp; Page Load event handler เรื่องแรกเราต้องการที่จะเรียก BindData() method&amp;nbsp;&amp;nbsp; เท่านั้น ตอนที่เพจยังไม่ได้โพสต์กลับไป เนื่องจากในการโพสต์กลับไปครั้งหลังๆ&amp;nbsp; dgProducts_Sort event&amp;nbsp; handler&amp;nbsp; จะเป็นตัวเรียก&amp;nbsp; BindData() เอง เรื่องที่สอง Page Load event handler ของเราใช้ BindData()&amp;nbsp; method&amp;nbsp; เวอร์ชันเก่าอยู่ ซึ่งเป็นอันที่ไม่ได้รับอินพุดพารามิเตอร์ เราจำเป็นต้องทำการอัพเดตเพื่อที่เราจะสามารถส่งชื่อฟิลด์ที่ต้องการไปให้ DataGrid ทำการจัดเรียงได้ 
&lt;p&gt;private void Page_Load(object sender, System.EventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;b&gt;&lt;code&gt;&lt;b&gt;if (!Page.IsPostBack)&lt;/b&gt;&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;code&gt;&lt;b&gt;BindData(&amp;quot;ProductName&amp;quot;);&lt;/b&gt;&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;} 
&lt;p&gt;หลังจากที่ทำการเปลี่ยนปลงทั้งหมดแล้ว ให้คุณทำการ&amp;nbsp; build&amp;nbsp; โซลูชันแล้วลองทดสอบดู ภาพที่ 3 แสดงหน้าจอของ SortableDataGrid.aspx&amp;nbsp; เมื่อเราเข้าไปดูเป็นครั้งแรก ส่วนภาพที่ 4 แสดงเว็บเพจหลักที่ผู้ใช้คลิกที่ไฮเปอร์ลิงก์หัวเรื่องคอลัมน์&amp;nbsp; Unit&amp;nbsp; Price&amp;nbsp; ถ้าหากดูจากภาพที่สอง เราจะพบว่า DataGrid ไม่สามารถจัดเรียงข้อมูลโดยใช้คอลัมน์&amp;nbsp; Units In Stock ได้ เนื่องจากเราไม่ได้กำหนด SortExpression property ให้แก่ BoundColumn นี้ 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa479006_aspnet-pageablesortable-03(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 3 DataGrid ที่จัดเรียงข้อมูลโดยใช้คอลัมน์ Product Name 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa479006_aspnet-pageablesortable-04(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่ 4 DataGrid ที่จัดเรียงข้อมูลโดยใช้คอลัมน์ Unit Price 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;การสร้าง DataGrid ที่จัดเพจได้&lt;/strong&gt; 
&lt;p&gt;สิ่งที่เหมือนกับ&amp;nbsp; DataGrid ที่จัดเรียงข้อมูลได้ก็คือการสร้าง DataGrid ที่จัดเพจได้เหมาะที่จะใช้สร้าง DataGrid ที่ต้องการให้แสดงผลข้อมูลอย่างไรก็ได้ การที่เราทำแบบนี้ได้ตั้งแต่ช่วงแรกของหัวข้อก่อนหน้านี้แล้ว ผมจึงจะไม่พูดถึงเรื่องนี้ซ้ำยกเว้นการบอกให้คุณสร้างเว็บเพจ&amp;nbsp; ASP.NET ที่ชื่อ PageableDataGrid.aspx ขึ้นมา แล้วทำการก็อปปี้ DataGrid&amp;nbsp; declaration ในส่วน HTML และโค้ดจาก Page_Load และ BindData() methods ในคลาสที่อยู่เบื้องหลังโค้ดจากเว็บเพจ&amp;nbsp; SortableDataGrid.aspx ก่อนหน้านี้ไปยังตำแหน่งที่เราพูดถึงการเพิ่มคุณสมบัติการจัดเรียงข้อมูลลงไปนั้นเอง&lt;/p&gt;
&lt;p&gt;แม้ว่าคุณสามารถก็อปปี้&amp;nbsp; Page&amp;nbsp; Load&amp;nbsp; event&amp;nbsp; handler&amp;nbsp; มาใช้ได้ก็ตาม แต่คุณจำเป็นต้องแก้ไข BindData() method&amp;nbsp; เล็กน้อย นั่นก็คือแทนที่จะเชื่อมโยง SqlDataReader ไปยัง DataGrid คุณจำเป็นต้องใช้ DataTable หรือ DataSet แทน โดยเราจะพูดถึงเหตุผลของเรื่องนี้เล็กน้อย&lt;/p&gt;
&lt;p&gt;ก่อนที่เราจะเพิ่มการจัดเพจให้แก่&amp;nbsp; DataGrid&amp;nbsp; สิ่งสำคัญที่คุณควรทราบก่อนก็คือ&amp;nbsp; DataGrid มีการจัดแบบฟอร์มของเพจได้สองแบบก็คือ&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;การจัดเพจแบบปกติ 
&lt;li&gt;การจัดเพจแบบพิเศษ&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;การจัดเพจแต่ละแบบมีข้อดีข้อเสียที่แตกต่างกันออกไป นั่นก็คือการจัดเพจปกตินำไปใช้ได้ง่ายกว่าการจัดเพจแบบพิเศษ แต่การจัดเพจพิเศษจะทำให้ประสิทธิภาพดีขึ้นกว่าเดิมอย่างมาก เหตุผลก็คือการจัดเพจแบบปกติจะเชื่อมโยงกับข้อมูลทั้งหมดของ&amp;nbsp; DataSource&amp;nbsp; ที่คุณต้องการจัดเพจผ่านทาง DataGrid รวมทั้งเกิดขั้นตอนที่ผู้ใช้ย้ายจากเพจหนึ่งไปยังอีกเพจหนึ่ง ถ้าหากพูดถึงการจัดเพจปกติแล้ว&amp;nbsp; DataGrid&amp;nbsp; จะรับผิดชอบกับการแยกแยะว่ามีเรกคอร์ดมากน้อยเพียงใด และเรกคอร์ดอะไรที่&amp;nbsp; DataSource&amp;nbsp; ต้องการใช้ในการแสดงผล แต่ในทางตรงข้ามการจัดเพจพิเศษจำเป็นต้องระบุอย่างชัดเจนให้มีเฉพาะเรกคอร์ดที่ต้องการแสดงผลในเพจปัจจุบันต้องเป็นข้อมูลใน&amp;nbsp;&amp;nbsp; DataSource&amp;nbsp;&amp;nbsp; ที่เชื่อมโยงกับ DataGrid เท่านั้น&lt;/p&gt;
&lt;p&gt;การจัดเพจพิเศษนำมาใช้งานได้ง่ายกว่าเนื่องจากคุณไม่จำเป็นต้องทำอะไรเพิ่มเติมเมื่อผู้ใช้เปลี่ยนจากเพจหนึ่งไปสู่อีกเพจหนึ่ง นั่นก็คือคุณเพียงแต่เชื่อมโยงผลการคิวรี&amp;nbsp; SQL&amp;nbsp; ไปยัง Datagrid แล้วปล่อยให้ Datagrid จัดการกับการแสดงผลเรกคอร์ดเอง ถ้าหากเป็นการจัดเพจพิเศษคุณต้องใช้คำสั่ง SQL ที่ซับซ้อนหรือใช้ stored procedure ที่ยุ่งยากไม่แพ้กันเพื่อเลือกกลุ่มของเรกคอร์ดที่แน่นอนที่คุณต้องการนำมาแสดงผลในแต่ละเพจ การจัดเพจแบบพิเศษให้ประสิทธิภาพที่ดีกว่าการจัดเพจปกติเนื่องจากในแต่ละเพจมีเฉพาะเรกคอร์ดที่ต้องการแสดงผลเท่านั้น ถ้าหากเป็นการจัดเพจปกติ ทุกครั้งที่ผู้ใช้เรียกดูเพจข้อมูลที่ต่างกัน เรกคอร์ดทั้งหมดจะถูกเรียกขึ้นมา นอกจากนั้นการจัดเพจปกติบังคับให้คุณต้องเชื่อมโยงออปเจ็กต์ของ&amp;nbsp; DataTable หรือ DataSet ไปยัง DataGrid ด้วย นั่นก็คือคุณไม่สามารถใช้&amp;nbsp;&amp;nbsp; DataReader&amp;nbsp; ได้ สาเหตุเนื่องจาก&amp;nbsp; DataGrid&amp;nbsp; จำเป็นต้องสามารถแยกแยะว่ามีเรกคอร์ดอยู่ใน DataSource มากน้อยเพียงใด จึงค่อยมากำหนดจำนวนหน้าสำหรับการแสดงผลข้อมูลได้ 
&lt;p&gt;ส่วนในบทความนี้ เราจะเน้นไปที่การจัดเพจแบบปกติ เนื่องจากมันนำไปใช้งานได้ง่ายกว่า นอกจากนั้นการเน้นไปที่การจัดเพจแบบปกติก็ไม่ได้ทำให้เราเสียหายแต่อย่างใด เนื่องจากเทคนิคที่เราจะทำการทบทวนในหัวข้อต่อไปเป็นการสร้าง DataGrid ที่จัดเพจได้และจัดเรียงข้อมูลได้จะใช้ได้กับการจัดเพจแบบปกติและแบบพิเศษอยู่แล้ว 
&lt;p&gt;ขั้นตอนแรกของการจัดเพจ&amp;nbsp;&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp;&amp;nbsp; ก็คือการใช้โมเดลการจัดเพจปกติ เพื่อกำหนดให้&amp;nbsp;&amp;nbsp; AllowPaging property&amp;nbsp; ของ&amp;nbsp; DataGrid ให้เป็น True โดยปกติแล้ว property ตัวนี้ ถ้าหากกำหนดให้เป็น True จะแสดงอินเทอร์เฟซที่ค้นหาสิ่งที่ต้องการได้บริเวณด้านล่างของ&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp; อินเทอร์เฟซค้นหาดังกล่าวจะช่วยให้ผู้ใช้เลือกเพจที่จะนำมาแสดงใน&amp;nbsp; DataGrid&amp;nbsp; ได้ ซึ่งโดยปกติแล้วอินเทอร์เฟซค้นหาจะใช้&amp;nbsp; LinkButtons เพื่อสร้างชุดไฮเปอร์ลิงก์ก่อนและหลังขึ้นมา เมื่อผู้ใช้คลิกไปที่ไฮเปอร์ลิงก์ตัวใดตัวหนึ่ง เว็บเพจของ&amp;nbsp; ASP.NET&amp;nbsp; จะโพสต์กลับไป พร้อมกับการเริ่มทำงานของ&amp;nbsp; PageIndexChanged&amp;nbsp; event เราไม่จำเป็นต้องสร้างตัวจัดการเหตุการณ์สำหรับเหตุการณ์นี้ ที่อัพเดต CurrentPageIndex property ของ DataGrid แล้วเชื่อมโยงข้อมูลซ้ำกลับไปหา DataGrid 
&lt;p&gt;CurrentPageIndex&amp;nbsp; property&amp;nbsp; ของ&amp;nbsp; DataGrid เป็นตัวกำหนดว่าจะแสดงผลเพจข้อมูลเพจไหน ซึ่งนอกเหนือจาก property ตัวนี้แล้ว ยังมี properties อื่นๆอีกสองสามตัวที่เกี่ยวข้องกับการจัดเพจ 
&lt;ul&gt;
&lt;li&gt;PageSize: property ตัวนี้จะกำหนดว่า ในแต่ละเพจมีการแสดงผลที่เรกคอร์ด ค่าปกติก็คือ 10 
&lt;li&gt;PageCount: property ที่ใช้เป็นตัวกำหนดจำนวนเพจทั้งหมด&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;ดังนั้นตัวจัดการเหตุการณ์&amp;nbsp; PageIndexChanged&amp;nbsp; จึงต้องการกำหนดให้ CurrentPageIndex property ไปเป็นเพจที่ผู้ใช้เลือกเอาไว้เท่านั้น แล้วทำการเชื่อมโยงกับ DataGrid ซ้ำ (โดยการเรียก BindData()) นั่นก็คือเราสามารถแยกแยะได้ว่าเพจที่ต้องการเรียกดูคืออะไรโดยการอ้างอิง&amp;nbsp;&amp;nbsp; NewPageIndex&amp;nbsp; property&amp;nbsp; ของออปเจ็กต์ DataGridPageChnagedeventArgs ซึ่งส่งผ่านไปให้ตัวจัดการเหตุการณ์นี้ได้ 
&lt;p&gt;เมื่อมีการเรียก&amp;nbsp;&amp;nbsp; DataBind()&amp;nbsp;&amp;nbsp; method&amp;nbsp; ของ&amp;nbsp; DataGrid&amp;nbsp; ใน&amp;nbsp; BindData()&amp;nbsp; แล้ว&amp;nbsp; DataGrid&amp;nbsp; จะใช้ CurrentPageIndex&amp;nbsp; property เพื่อแยกแยะว่าจะแสดงเพจใด จากนั้นก็ใช้จำนวนของเรกคอร์ดสำหรับการแสดงในแต่ละหน้ามาคำนวณดูว่าเรกคอร์ใดควรจะแสดงผลเป็นเรกคอร์ดแรกในเพจจากนั้น&amp;nbsp; DataGrid&amp;nbsp; จะค้นหาเรกคอร์ดนี้ ตามด้วยการแสดงผลเรกคอร์ดนี้และเรกคอร์ดอื่นๆตามขอบเขตของ PageSize 
&lt;p&gt;ในตอนนี้เราต้องเพิ่มตัวจัดการเหตุการณ์ที่ชื่อ&amp;nbsp; dgProducts&amp;nbsp; Page&amp;nbsp; ลงไปยัง PageIndexChanged event ของ DataGrid โดยใช้เทคนิคที่พูดถึงในหัวข้อก่อนหน้านี้ ซอร์ซโค้ดของตัวจัดการเหตุการณ์นี้แสดงเอาไว้ด้านล่าง 
&lt;p&gt;private void dgProducts_Page(object source,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Web.UI.WebControls.DataGridPageChangedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; dgProducts.CurrentPageIndex = e.NewPageIndex;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; BindData();&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;} 
&lt;p&gt;สิ่งที่เหมือนกับเว็บเพจ&amp;nbsp; SortableDataGrid.aspx&amp;nbsp; ก็คือเราต้องการแค่ตัวจัดการเหตุการณ์&amp;nbsp; Page Load เชื่อมโยงข้อมูลไปยัง&amp;nbsp; DataGrid ตอนที่มีการโหลดเพจครั้งแรก ไม่ใช่ตอนโพสต์กลับในครั้งต่อๆไป โค้ดด้านล่างนี้แสดงตัวจัดการเหตุการณ์&amp;nbsp;&amp;nbsp; Page&amp;nbsp;&amp;nbsp; Load&amp;nbsp; รุ่นอัพเดต และ&amp;nbsp; BindData()&amp;nbsp; method&amp;nbsp; สิ่งที่เราอยากบอกเอาไว้ก่อนก็คือ BindData()&amp;nbsp;&amp;nbsp; method&amp;nbsp;&amp;nbsp; ชื่อมโยง&amp;nbsp;&amp;nbsp; DataTable&amp;nbsp;&amp;nbsp; เข้าหา&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp; ซึ่งตรงข้ามกับการเชื่อมโยงไปหา SqlDataReader&amp;nbsp;&amp;nbsp; เราเคยบอกเอาไว้แล้วว่าการจัดเพจปกติไม่สามารถใช้&amp;nbsp;&amp;nbsp; DataReader&amp;nbsp; ได้ แต่เราต้องใช้ DataTable&amp;nbsp; หรือ&amp;nbsp; DataSet&amp;nbsp; แทน โดยการใช้ DataReader จะส่งผลทำให้เกิดข้อยกเว้นขึ้นมา สาเหตุที่เราไม่สามารถใช้&amp;nbsp; DataReader ได้ก็เนื่องจาก DataGrid จำเป็นต้องสามารถแยกแยะว่ามีกี่เรกคอร์ดใน DataSource เพื่อที่จะคำนวณจำนวนเพจออกมาได้ การที่&amp;nbsp; DataReader รองรับการเรียกใช้แบบ forward เท่านั้น DataGrid จึงไม่สามารถแยกแยะว่ามีกี่เรกคอร์ดได้ ด้วยเหตุนี้เรื่องนี้จึงเป็นสิ่งที่จำเป็นสำหรับการจัดเพจปกติด้วยเช่นกันที่จะต้องแยกแยะให้ได้ว่ามีกี่เรกคอร์ด (เหมือนกับ DataTable หรือ DataSet) 
&lt;p&gt;private void Page_Load(object sender, System.EventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (!Page.IsPostBack)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindData();&lt;br /&gt;}&lt;br /&gt;private void BindData()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Connect to the Database&lt;br /&gt;&amp;nbsp;&amp;nbsp; SqlConnection myConnection = new SqlConnection(&lt;i&gt;connection string&lt;/i&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Retrieve the SQL query results and bind it to the DataGrid&lt;br /&gt;&amp;nbsp;&amp;nbsp; string SQL_QUERY = &amp;quot;SELECT ProductName, UnitPrice, UnitsInStock &amp;quot; +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;FROM Products&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; SqlCommand myCommand = new SqlCommand(SQL_QUERY, myConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp; // Use a DataTable – required for default paging&lt;br /&gt;&amp;nbsp;&amp;nbsp; SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);&lt;br /&gt;&amp;nbsp;&amp;nbsp; DataTable myTable = new DataTable();&lt;br /&gt;&amp;nbsp;&amp;nbsp; myAdapter.Fill(myTable);&lt;br /&gt;&amp;nbsp;&amp;nbsp; dgProducts.DataSource = myTable;&lt;br /&gt;&amp;nbsp;&amp;nbsp; dgProducts.DataBind();&lt;br /&gt;&amp;nbsp;&amp;nbsp; myConnection.Close();&lt;br /&gt;} 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa479006_aspnet-pageablesortable-05(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่&amp;nbsp; 5&amp;nbsp; แสดงเพจ PageableDataGrid.aspx เมื่อเข้าไปดูเป็นครั้งแรกที่แสดงเรกคอร์ด 10 เรกคอร์ดแรกในตาราง&amp;nbsp; Products&amp;nbsp; 
&lt;p&gt;&lt;img src="http://www.microsoft.com/thailand/msdn/articles/images/Aa479006_aspnet-pageablesortable-06(en-us,MSDN_10).gif" alt="" /&gt;&amp;nbsp; 
&lt;p&gt;ภาพที่&amp;nbsp; 6&amp;nbsp; แสดงเพจที่สองของข้อมูลที่แสดงผลขึ้นมาเมื่อผู้ใช้คลิกที่ไฮเปอร์ลิงก์ &amp;gt; ในอินเทอร์เฟซค้นหาจากภาพที่ 5 
&lt;p&gt;ตัวอย่างนี้ไม่ได้แสดงวิธีการปรับแต่งอินเทอร์เฟซค้นหาของ&amp;nbsp; DataGrid&amp;nbsp; ที่จัดเพจได้ อย่างไรก็ตามเราสามารถปรับแต่งให้แสดงข้อความอื่นๆสำหรับไฮเปอร์ลิงก์ก่อนและหลังได้ รวมทั้งการแสดงรายการของหมายเลขเพจอีกด้วย แทนที่จะเป็นลิงก์ก่อนและหลังเท่านั้น ที่จริงแล้ว ถ้าหากมีการเขียนโค้ดอีกเล็กน้อย คุณสามารถสร้างอินเทอร์เฟซการจัดเพจแบบพิเศษที่มีทั้งลิงก์ก่อนและหลังรวมทั้งรายการหมายเลขหน้าได้ ถ้าหากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับเรื่องเหล่านี้ให้เข้าไปดูได้ตามบทความดังต่อไปนี้ 
&lt;ul&gt;
&lt;li&gt;การกำหนดพฤติกรรมการจัดเพจในเว็บเซิร์ฟเวอร์คอนโทรล DataGrid 
&lt;li&gt;การจัดเพจตัวอักษร/ตัวเลขผสมตัวอักษรใน ASP.NET 
&lt;li&gt;การจัดเพจใน DataGrid &lt;/li&gt;
&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;การสร้าง DataGrid ที่จัดเพจได้และจัดเรียงข้อมูลได้&lt;/strong&gt; 
&lt;p&gt;เมื่อถึงจุดนี้เราได้ศึกษาวิธีการสร้าง&amp;nbsp; DataGrid&amp;nbsp; แบบจัดเรียงข้อมูลได้และ DataGrid ที่จัดเพจได้ผ่านไปแล้ว ในตอนนี้ได้เวลาที่จะรวมเอาคุณสมบัติทั้งสองชนิดให้กลายเป็น&amp;nbsp; DataGrid ที่ทั้งจัดเพจได้และจัดเรียงข้อมูลได้ ความยุ่งยากของการรวมเอาคุณสมบัติทั้งสองชนิดไปเป็น&amp;nbsp; DataGrid&amp;nbsp; เพียงอันเดียวมาจากข้อเท็จจริงที่ว่าแนวทางแต่ละแบบใช้รูปแบบของ&amp;nbsp; BindData()&amp;nbsp; method&amp;nbsp; ที่แตกต่างกัน&amp;nbsp; DataGrid&amp;nbsp; ที่จัดเรียงข้อมูลได้ส่งสตริงพารามิเตอร์ไปยัง BindData() ซึ่งเป็นตัวกำหนดว่าจะจัดเรียงข้อมูลของคอลัมน์ใดใน DataGrid แต่ในทางตรงข้าม Datagrid ที่จัดเพจได้จะไม่ทำงานในลักษณะดังกล่าว&lt;/p&gt;
&lt;p&gt;ความพยายามในการแก้ไขความแตกต่างเบื้องต้นก็คือการใช้&amp;nbsp; BindData() เวอร์ชันที่ยอมรับสตริงพารามิเตอร์และมีตัวจัดการเหตุการณ์&amp;nbsp; PageIndexChanged ของ DataGrid ที่เอาไว้คอยส่งค่าสตริงที่กำหนดเอาไว้แล้วมาให้เสมอ ตัวอย่างเช่นการที่ตัวจัดการเหตุการณ์&amp;nbsp; PageIndexChanged&amp;nbsp; ต้องเรียก BindData() เพื่อส่งสตริง ดังนั้นเราจึงสามารถใช้โค้ดดังต่อไปนี้สำหรับตัวจัดการเหตุการณ์นี้ได้&lt;/p&gt;
&lt;p&gt;private void dgProducts_Page(object source, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Web.UI.WebControls.DataGridPageChangedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; dgProducts.CurrentPageIndex = e.NewPageIndex;&lt;br /&gt;&lt;b&gt;&lt;code&gt;&lt;b&gt;BindData(&amp;quot;ProductName&amp;quot;);&lt;/b&gt;&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;อย่างไรก็ตามแนวทางนี้ไม่สามารถใช้งานได้ เมื่อพิจารณาการเกิดลำดับเหตุการณ์ต่อเนื่องดังนี้ 
&lt;ol&gt;
&lt;li&gt;เมื่อผู้ใช้เข้าไปในเพจ ผู้ใช้คนนี้เห็นเพจแรก ที่จัดเรียงข้อมูลโดยอิงกับฟิลด์ ProductName อยู่ 
&lt;li&gt;ผู้ใช้คลิกไปที่ไฮเปอร์ลิงก์หัวเรื่องคอลัมน์ Unit Price เพื่อให้แสดงเพจแรกที่ข้อมูลจัดเรียงตาม Unit Price 
&lt;li&gt;ผู้ใช้คลิกไปที่ไฮเปอร์ลิงก์ค้นหา &amp;gt; เพื่อเรียกข้อมูลเพจต่อไป&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;ขั้นตอนนี้ส่งผลทำให้ตัวจัดการเหตุการณ์&amp;nbsp;&amp;nbsp; PageIndexChanged&amp;nbsp;&amp;nbsp; ประมวลผลโพสต์กลับซึ่งเรียกข้อมูลที่จัดเรียงตาม ProductName&amp;nbsp; ขึ้นมา ดังนั้นในตอนนี้ผู้ใช้จะเห็นเพจที่สองที่จัดเรียงข้อมูลตาม&amp;nbsp; ProductName แทนที่จะเป็นเพจที่สองของข้อมูลที่จัดเรียงตาม UnitPrice 
&lt;p&gt;เราต้องการวิธีบางอย่างเพื่อให้ระบบจำได้ว่าฟิลด์อะไรที่เราต้องการจัดเรียงเมื่อเรียก&amp;nbsp;&amp;nbsp; BindData()&amp;nbsp; จากตัวจัดการเหตุการณ์&amp;nbsp;&amp;nbsp; PageIndexChanged&amp;nbsp;&amp;nbsp; โดยที่มีวิธีการหลายแบบที่ใช้เก็บรักษาสภาพไปกลับไปยังเซิร์ฟเวอร์โดยใช้ ASP.NET อย่างไรก็ตามการที่เราต้องการเซฟข้อมูลนี้เอาไว้สำหรับเพจปัจจุบันเท่านั้น ไม่ใช่สำหรับผู้ใช้ปัจจุบัน ดังนั้นแนวทางที่ดีที่สุดก็คือการจัดเก็บคอลัมน์ที่ผู้ใช้ต้องการจัดเรียงเอาไว้ใน ViewState ของเว็บเพจ 
&lt;p&gt;บทความนี้ไม่ต้องการพูดถึง&amp;nbsp; ViewState&amp;nbsp; อย่างละเอียด อย่างไรก็ตามเราจะพูดถึงการนำเอา ViewState มาใช้ประโยชน์ในการสร้าง&amp;nbsp;&amp;nbsp; DataGrid&amp;nbsp; ที่จัดเรียงข้อมูลและจัดเพจได้เพียงเล็กน้อย ก่อนอื่นสิ่งที่คุณควรทราบก็คือคอนโทรลทุกชนิดในเว็บเพจ&amp;nbsp; ASP.NET&amp;nbsp; มี&amp;nbsp; ViewState และเมื่อคอนโทรลเหล่านี้ถูกใส่เอาไว้ใน WebForm (&amp;lt;form runat&amp;nbsp; =&amp;nbsp; &amp;quot;server&amp;quot;&amp;gt;)&amp;nbsp; ViewState จะถูกเซฟเอาไว้ในฟิลด์ฟอร์ม HTML ที่ซ่อนเอาไว้ เราสามารถเขียนโปรแกรมให้ใส่ออปเจ็กต์ลงไปใน&amp;nbsp; ViewState&amp;nbsp; ได้ โดยที่ออปเจ็กต์ที่ใส่ลงไปนี้สามารถเซฟเอาไว้ร่วมกับข้อมูลอื่นๆของ ViewState&amp;nbsp;&amp;nbsp;&amp;nbsp; ได้ ซึ่งนั่นหมายความว่าระบบจะจำค่าได้ตอนที่โพสต์กลับไป ถ้าหากต้องการทราบข้อมูลอื่นๆของ ViewState กรุณาอ่านบทความ &amp;quot;การใช้ประโยชน์จาก ViewState ใน ASP.NET&amp;quot; 
&lt;p&gt;ซินแทกซ์ของการใส่และเรียกองค์ประกอบลงไปใน ViewState ให้ปฏิบัติดังนี้ 
&lt;p&gt;// C#&lt;br /&gt;object o = ViewState[&lt;i&gt;key&lt;/i&g