thaiall logomy background เอเอสพีดอทเน็ต (asp.net)
my town
aspnet

เอเอสพีดอทเน็ต (asp.net)

เอเอสพีดอทเน็ต คือ ภาษาโปรแกรมเชิงวัตถุที่ทำงานบนดอทเน็ตเฟรมเวิร์ค พัฒนาโดยบริษัทไมโครซอฟท์ มีโครงสร้างการเขียนที่พัฒนามาจากภาษาเบสิก มีตัวแปลภาษาติดตั้งในชุดพัฒนาซอฟท์แวร์ Visual Studio และทำงานบนเครื่องบริการวินโดว์ (Windows Server) ซึ่งทำงานร่วมกับเครื่องมือต่าง ๆ ใน Visual studio ได้อย่างลงตัว
คำถามที่มักเกิดขึ้น จากการใช้ ASP.NETแนะนำเว็บไซต์
? เปิด เว็บเซอร์ฟเวอร์แล้วพบคำว่า server application unavailable
พบว่า default.aspx ประมวลผลตอน debug ได้ และประมวลผลใน root directory ได้ แต่เปิด web sharing ชื่อ website1 แล้ว พบคำว่า server application unavailable แม้จะใช้ aspnet_regiis -i ในห้อง 2.0 ของ framework ก็ไม่หาย แต่เข้า security เพิ่ม user : IIS_WPG แล้วเปิด /website1 ได้ปกติ
? เปิด /website1 จากเครื่องอื่นแล้วถามรหัสผู้ใช้ และรหัสผ่าน (Authentication)
วิธีแก้คือ เข้า properties ของ /website1 เข้า Directory Security, Authentication and access control, Edit ให้ทำ checkbox ในช่อง Enable anonymous access ก็จะเข้าจากเครื่องอื่นผ่าน IP Address ได้
? รายชื่อ class ของ Microsoft Visual Basic มีอะไรบ้าง
ดูได้จาก http://www.thaiall.com/vbnet/msvb.htm
? เครื่องpc อ่านข้อมูล MS Access มาแสดงได้ แต่ up เข้า godaddy จะอ่านภาษาไทยไม่ได้
ขั้นที่ 1 เพิ่ม <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%> ก่อนสั่งแสดงผล แล้วภาษาไทยก็จะออกมาครับ โดยเปลี่ยน Encoding ใน IE เป็น Thai(Windows) ก็จะอ่านภาษาไทยได้ ซึ่ง 1252 คือ West European Latin ถ้าใช้ 874 ผลจะได้ ??? ทั้งหมด สรุปว่าวิธีแก้ปัญหา ขั้นที่ 2 คือ ส่ง response.Charset = "windows-874" เข้าไปใต้ page_load บรรทัดแรก จะทำให้ default encoding ของ ie ไปอยู่ที่ Thai(Windows)

? พบคำว่า Operation must use an updateable query. เมื่อสั่งแก้ไข หรือลบข้อมูลใน Access สำหรับวิธีแก้ไข ทำได้โดยเปลี่ยน Permission ของห้องที่เก็บแฟ้ม .mdb สำหรับ User เป็นแบบเขียนได้

? บางบรรทัดยาว ถ้าพิมพ์ _ แล้วปัดบรรทัดลงมาก็จะทำให้จำนวนตัวอักษรต่อบรรทัดลดลงได้
เครื่องหมาย _ ใช้กับการต่อบรรทัด ใช้ได้ทั้ง ASP และ ASP.NET
? ตัวอย่างนี้แก้ไขข้อมูลใน Microsoft Access ไม่ได้ เพราะผิดเงื่อนไขบางประการ
การใช้ Microsoft Access ใน web hosting ของ godaddy.com ต้องเข้าไปที่ Manage Account ของ Control Panel ใน Hosting Account ถ้าใช้บริการของ Godaddy.com แล้วเลือก Database, Access และ Enable Access Support ระบบจะสร้างห้อง access_db ให้นำแฟ้ม .mdb ไปใส่ในห้องนั้น
? Access Modifier สำหรับ Object ใน .net มี 4 อย่าง
1. public คือ เข้าถึงได้จากในโปรเจ็ค หรือนอกโปรเจ็ค
2. protected คือ มีผลกับการสืบทอด เช่นการใช้ inherits จาก code behind
3. private คือ เข้าถึงได้เฉพาะในคลาสเดียวกัน
4. friend คือ เข้าถึงได้ใน Assembly เดียวกันเท่านั้น
แนะนำเว็บไซต์
+ thaicreate.com
+ String members
+ AJAX Library #

Cystal Reports
+ binding datasource



ดาวน์โหลด
+ asp.net + crystalreport

aspnet_regiis +เปิดบริการ

คำถามที่ 1 : ถ้าใช้ Microsoft Visual Studio สร้างเว็บไซต์ จะเก็บไว้ที่ไหน จะได้กี่แฟ้ม แต่ละแฟ้มเก็บอะไร ทำหน้าที่อะไรบ้าง
- เมื่อเริ่มต้น สร้างห้องใน C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1
- มีจำนวน 3 แฟ้ม คือ 1) Default.aspx 2) Default.aspx.vb และ 3) web.config และอีก 1 folder คือ App_Data
1.1 default.aspx : เก็บรหัสต้นฉบับ หลัก ที่ใช้ควบคุมการประมวลผล
<%@ Page Language="VB" AutoEventWireup="false" 
CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    hello
    </div>
    </form>
</body>
</html>

1.2 default.aspx.vb : เก็บคลาส ที่อาจถูกเรียกใช้ใน Default.aspx
Partial Class _Default
    Inherits System.Web.UI.Page
End Class

1.3 web.config : เก็บค่าเริ่มต้นของเว็บไซต์
1.3.1 แบบเรียกใช้ name space อัตโนมัติ
<?xml version="1.0"?>
<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <compilation debug="false" strict="false" explicit="true" />
        <pages>
            <namespaces>
                <clear />
                <add namespace="System" />
                <add namespace="System.Collections" />
                <add namespace="System.Collections.Specialized" />
                <add namespace="System.Configuration" />
                <add namespace="System.Text" />
                <add namespace="System.Text.RegularExpressions" />
                <add namespace="System.Web" />
                <add namespace="System.Web.Caching" />
                <add namespace="System.Web.SessionState" />
                <add namespace="System.Web.Security" />
                <add namespace="System.Web.Profile" />
                <add namespace="System.Web.UI" />
                <add namespace="System.Web.UI.WebControls" />
                <add namespace="System.Web.UI.WebControls.WebParts" />
                <add namespace="System.Web.UI.HtmlControls" />
            </namespaces>
        </pages>
        <authentication mode="Windows" />
    </system.web>
</configuration>

1.3.2 แบบกำหนด redirect ถ้าพบข้อผิดพลาด และร้องขอจากเครื่องภายนอก <?xml version="1.0" encoding="utf-8" ?> <configuration>
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="default.aspx" />
</system.web> </configuration>
1.3.3 แบบกำหนดให้แสดง error message ทันที .. จะได้แก้ไขปัญหาได้ถูกจุด <?xml version="1.0" encoding="utf-8" ?> <configuration><system.web>
<customErrors mode="Off"/> </system.web></configuration>

คำถามที่ 2 : เขียนโปรแกรมแบบ code behind ด้วย ASP.NET ต้องทำอย่างไร
1. code behind เขียนได้ 2 แบบ คือ แบบที่ 1 เขียนใน แฟ้ม .vb แล้วเรียกใช้ทันที ไม่ผ่านการคอมไพล์ หรือ แบบที่ 2 นำแฟ้ม .vb มาคอมไพล์เป็นแฟ้ม .dll
2. การสร้าง code behind แบบคอมไพล์มีขั้นตอนดังนี้
2.1 เรียกใช้ name space ที่จำเป็น
Imports System
Imports System.Web.UI.Page
2.2 สร้างคลาสที่สืบทอดจากคลาส System.Web.UI.Page
public class myclass
inherits System.Web.UI.Page
end class
2.3 สร้างวัตถุเรียกใช้คอนโทลต่าง ๆ
public n1 as textbox
public n2 as textbox
public b1 as button
2.4 สร้างเหตุการณ์ควบคุมคอนโทล
protected sub myclick (s as object, e as eventargs)
n2.text = cdbl(n1.text) * 2
end sub
3. แฟ้ม .vb เป็นส่วนเก็บรหัสสำหรับประมวลผล ที่สร้างแล้วเรียกใช้ได้ทันที
1.1 แบบ src ไม่ผ่านการคอมไพล์
x.aspx : เรียกใช้ code behind แบบ src
<%@ Page src="x.aspx.vb" Inherits="x" %>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
 me.lb.text = Now
End sub</script>
<form runat="server">
<asp:Label ID="lb" runat="server"></asp:Label>
<asp:Textbox ID="n1" runat="server" />
<asp:Textbox ID="n2" runat="server" />
<asp:Button ID="b1" text="hello" runat="server" onclick="myclick" />
</form>

1.2 แบบ src ไม่ผ่านการคอมไพล์
x.aspx.vb : เรียกใช้ code behind แบบ src
Imports System 
Imports System.Web.UI.WebControls
public class x 
inherits System.Web.UI.Page 
public n1 as Textbox 
public n2 as Textbox 
public b1 as Button
protected sub myclick (s as object, e as eventargs) 
n2.text = cdbl(n1.text) * 2 
end sub 
End Class

ใช้ Microsoft Intermediate Langauge (MSIL) ตรวจแฟ้ม .dll ว่ามีเมธอดอะไรให้ใช้บ้าง

2. แบบ code behind ผ่านการคอมไพล์
x.aspx.vb : เรียกใช้ code behind จาก x.dll
การสร้างแฟ้ม x.dll ผ่าน DOS Prompt 
cd %systemroot%\Microsoft.NET\framework\v2.0.50727
vbc /out:x.dll /t:library /r:system.dll,system.web.dll %systemdrive%\inetpub\wwwroot\x.aspx.vb
copy x.dll %systemdrive%\inetpub\wwwroot\bin\x.dll

' code จะเข้าไปค้นหาคลาสใน .dll อัตโนมัติ ' โปรแกรมนี้ชื่อ callxdll.aspx ทำให้เข้าใจหน้าที่ของโปรแกรมนี้ครับ <%@ Page codebehind="x.aspx.vb" Inherits="x" %> <form runat="server"> <asp:Textbox ID="n1" runat="server" /> <asp:Textbox ID="n2" runat="server" /> <asp:Button ID="b1" text="hello" runat="server" onclick="myclick" /> </form> ' ถ้าไม่กำหนด codebehind จะไปหาในห้อง /bin เช่น godaddy.com ก็กำหนด /bin ไว้ที่ root directory <%@ Page Inherits="x" %> <form runat="server"> <asp:Textbox ID="n1" runat="server" /> <asp:Textbox ID="n2" runat="server" /> <asp:Button ID="b1" text="hello" runat="server" onclick="myclick" /> </form>

แบบ codefile มีผลให้ page_load ในแฟ้มนี้ไม่ทำงาน
x.aspx : เก็บรหัสต้นฉบับ
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="x.aspx.vb" Inherits="x" %>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
me.lb.text = "nothing to do here"
End sub
</script>
<form id="form1" runat="server">
<asp:Label ID="lb" runat="server"></asp:Label>
</form>
</body>

แบบ codefile เรียกใช้ me ได้ มีผลให้ page_load ในแฟ้มทำงานเท่านั้น
x.aspx.vb : เก็บคลาส x ที่ถูกเรียกใช้ใน x.aspx
Public Class x 
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
me.lb.text = now
End Sub End Class
หมายเหตุ
- ถ้าพบปัญหาว่า Context is not a member of myclass อาจเป็นเพราะชื่อ .vb กับชื่อคลาส ไม่ตรงกับที่ถูกเรียกใช้

คำถามที่ 3 : โปรแกรมแรกในห้อง inetpub/wwwroot เขียนแบบใดได้บ้าง
แบบ : ASP Style
<body bgcolor=yellow>
<%=now%> '11/30/2009 1:42:18 AM </body>

แบบ : ASP.NET Style เพื่อส่งค่าให้ label ใน page_load
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<body bgcolor=yellow>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
me.lb.text ="ทดสอบ" End sub </script> <form id="form1" runat="server">
<asp:Label ID="lb" runat="server"></asp:Label> </form> </body>

แบบ : ใช้ค่า textbox ใน page_load เพื่อประมวลผล
<body bgcolor=yellow>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
If CInt(TextBox1.Text) > 0 Then
Dim i As Integer
For i = 1 To CInt(TextBox1.Text)
Response.Write(i & "<br>")
Next
End If
End sub </script> <form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server" Text="0"></asp:TextBox> </form> </body>

แบบ : ใช้ฟอร์มแบบ aspx และเขียนแบบ asp นำ textbox ไปประมวลผล
<%@Page Language="VB" %>
<body bgcolor="yellow">
<form id="fm" runat="server">
<asp:TextBox ID="TextBox1" runat="server" Text="0"></asp:TextBox>
</form>
<% response.write(TextBox1.text) %>
</body>
<body bgcolor="yellow">
<form id="fm" runat="server">
<asp:TextBox ID="TextBox1" runat="server" Text="0"></asp:TextBox>
</form>
<% response.write(TextBox1.text) %>
</body>
<body bgcolor=yellow>
<form id="form1" runat="server">
<div>hello<br />
<%
If CInt(TextBox1.Text) > 0 Then
Dim i As Integer
For i = 1 To CInt(TextBox1.Text)
Response.Write(i & "<br>")
Next
End If %> <asp:TextBox ID="TextBox1" runat="server" Text="0"></asp:TextBox> </div> </form> </body>

คำถามที่ 4 : คอนโทล (Controls) มีแบบใดบ้าง
Using ASP.NET Controls
+ ASP.NET Server Controls #
คือ คอนโทลที่จะทำงานในฝั่ง server มีการเขียนคล้ายกับ HTML Tag เช่น button หรือ Textbox แต่มีคอนโทลอีกหลายตัวที่ทำงานฝั่งเครื่องบริการเช่น calendar หรือการเชื่อมกับฐานข้อมูล
+ ASP.NET User Controls # #
คือ คอนโทลที่สามารถเรียกใช้ใน ASP.NET ได้อย่างสมบูรณ์ โดยผู้ใช้สามารถสร้างขึ้นใหม่ และเรียกใช้ผ่าน Control Directive และมีสกุลของแฟ้มเป็น .ascx
+ ASP.NET Web Parts Controls #
คือ คอนโทลที่ถูกรวมเข้ากับชุดคอนโทลสำหรับเว็บไซต์ ที่ผู้ใช้สามารถปรับคอลโทลในเว็บเพจได้ด้วยตนเอง
+ http://msdn.microsoft.com/en-us/library/sk23dydw.aspx
+ http://asp.dotnetheaven.com/aspnet/doc/webparts/intro.aspx
ASP.NET Controls
ถูกออกแบบมาให้เหมาะสมกับการทำงานกับ Webpage หรือ Web server ซึ่งมีข้อจำกัดมากกว่า Control ที่ทำงานใน Application หรือ VB.NET Controls
Controls in toolbox ของ VB.NET
4.1 asp.net server control (http://msdn.microsoft.com/en-us/library/x8k61whf.aspx)
เช่น AdRotator BulletedList Button Calendar CheckBox CheckBoxList DropDownList FileUpload HiddenField HyperLink Image ImageMap Label ListBox Literal Localize MultiView View Panel PlaceHolder RadioButton Substitution Table TableRow TableCell TextBox Wizard XML Securing
4.1.1 ตัวอย่าง calendar control
กำหนดให้วันที่ 10 ของทุกเดือนถูกเลือกไว้ เมื่อคลิ๊กวันที่ใดก็ให้ส่งค่าเข้าไปใน textbox
แหล่งอ้างอิง : http://msdn.microsoft.com/en-us/library/add3s294.aspx
<body bgcolor=yellow>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
  cal1.VisibleDate = New Date(2009, 11, 1)
End sub
Public Sub cal1_VisibleMonthChanged(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.MonthChangedEventArgs) _
Handles cal1.VisibleMonthChanged
  cal1.SelectedDates.Clear()
  dim d as date 
  d = New DateTime(e.NewDate.Year, e.NewDate.Month, 10)
  cal1.SelectedDates.Add(d)
End Sub
Private Sub cal1_SelectionChanged(ByVal sender _
As System.Object, ByVal e As System.EventArgs) _
Handles cal1.SelectionChanged
  t.Text = cal1.SelectedDate.ToShortDateString()
end sub
</script><form runat="server">
  <asp:calendar ID="cal1" runat="server"/>
  <asp:textbox ID="t" runat="server"/>
</form></body>

4.1.2 ตัวอย่าง fileupload control
สามารถส่งแฟ้มเข้าสู่ระบบผ่านการ upload เข้าไปที่ web root directory
แหล่งอ้างอิง : http://msdn.microsoft.com/en-us/library/ms227669.aspx
<body><script language="VB" runat="server">
Protected Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Load
If IsPostBack Then
Dim path As String = Server.MapPath("/")
Dim fileOK As Boolean = False
If FileUpload1.HasFile Then
  Dim fileExtension As String = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower()
  Dim allowedExtensions As String() = {".jpg", ".jpeg", ".png", ".gif"}
  For i As Integer = 0 To allowedExtensions.Length - 1
    If fileExtension = allowedExtensions(i) Then fileOK = True
  Next
  If fileOK Then
  Try
    FileUpload1.PostedFile.SaveAs(path & FileUpload1.FileName)
    Label1.Text = "File uploaded!"
  Catch ex As Exception
    Label1.Text = "File could not be uploaded."
  End Try
  Else
  Label1.Text = "Cannot accept files of this type."
  End If
End If
End If
End Sub
</script><form runat="server">
<asp:fileupload ID="fileupload1" runat="server"/>
<asp:label ID="label1" runat="server"/>
</form></body>

4.2 asp.net user control
คือ การสร้าง control ที่ถูกเรียกใช้ใน asp.net webpage โปรแกรมที่เรียกคอนโทลยังมีสกุลของแฟ้มเป็น .aspx แต่ asp.net user control มีสกุลของแฟ้มเป็น .ascx
asp.net webpage คือ โปรแกรมที่เรียกใช้ standard toolbox control หรือ web server control ในตนเอง มีสกุลของแฟ้มเป็น .aspx ตัวอย่างนี้เป็นการใช้งานคอนโทลมาตรฐานที่มีให้ใช้ มิใช่การสร้าง user control ที่ผู้ใช้สร้างขึ้นใหม่ แล้วเรียกใช้ในภายหลัง
<%@Page Language="VB" %>
<html>
<script runat=server>
Sub b_Click(sender as Object,e as EventArgs)
Name.Text += 1
End Sub
</script><body><form runat=server>
<asp:textbox id=Name value=1 runat=server/>
<asp:button Text=hi OnClick="b_Click"
runat=server/>
</form></body></html>
ขั้นแรก : สร้าง control ชื่อแฟ้ม x.ascx
<%@Control Language="VB" 
ClassName="samuc1" %>
<script runat=server>
Sub b_Click(sender as Object,e as EventArgs)
Name.Text += 1
End Sub
</script>
<asp:textbox id="Name" value=1 runat=server/>
<asp:button Text="Enter" OnClick="b_Click"
runat=server/>
ขั้นสอง : สร้างตัวเรียก control ชื่อแฟ้ม x.aspx
<%@ Page Language="VB" %>
<%@ Register TagPrefix="uc" 
TagName="mycontrol"  Src="x.ascx" %>
<html><body>
<form runat="server">
<uc:mycontrol id="samuc1" runat="server" />
</form>
</body></html>

4.3 การใช้ standard toolbox control กับ page_load และ sub
- ถ้าไม่ตรวจ Page.IsPostBack จะเรียก page_load ทุกครั้งเมื่อคลิ๊กปุ่ม
<html><head><script runat=server>
Sub page_load(ByVal sender as object,ByVal e as eventargs)
  If Not Page.IsPostBack Then
    a.Text =99  
  End If
  lb.text = now
End Sub
Sub b_Click(ByVal sender As Object, ByVal e As EventArgs)
  a.Text += 1
End Sub
</script></head>
<body><form runat="server">
<asp:textbox id="a" runat="server" />
<asp:label id="lb" runat="server" />
<asp:button Text="hi" OnClick="b_Click" runat="server" />
</form></body></html>


คำถามที่ 5 : Class Library หรือการเขียนโปรแกรมแบบ DLL ทำอย่างไร
เปิด Visual Studio แล้วสร้าง project แบบ Class Library ชื่อ c1.vbproj และได้แฟ้มคลาสชื่อ class1.vb แล้วเขียนฟังก์ชันชื่อ countstring จากนั้นก็ build มีผลให้ได้แฟ้ม c1.dll อยู่ในห้อง Obj/Release ให้ทำการคัดลอกแฟ้ม c1.dll ไปไว้ใน c:\inetpub\wwwroot\bin ถ้าไม่มีห้อง bin อยู่ก่อน ก็สร้างขึ้นใหม่
Public Class Class1
  Public Shared Function countstring(ByVal s As String)
      Return Len(s)
  End Function
End Class
โปรแกรม x.aspx เป็นการเขียนแบบ Classic ASP ใช้เรียกแฟ้ม c1.dll มาทำงาน ซึ่งเก็บอยู่ในห้อง bin ด้วยการ import แล้วจึงเรียกฟังก์ชันที่อยู่ภายใน Class Library มาทำงานผ่านการ new object อีกครั้ง ก็จะเรียกใช้ฟังก์ชันใน object ได้ตามปกติ
<%@import namespace="c1" %>
<%
Dim ok as new class1
dim a as integer
a = ok.countstring("ab")
response.write(a)
%>
<%@import namespace = "c1" %>
<script language="vb" runat="server">
Sub page_load(ByVal sender as object,ByVal e as eventargs)
  Dim oh as new class1
  t.text = oh.countstring("myprogram")
End Sub
</script>
<html><body>
<form runat="server">
<asp:textbox id="t" text="0" runat="server">
</asp:textbox>
</form></body></html>
ถึงตรงนี้ท่านเข้าใจความแตกต่างของสิ่งต่อไปนี้ว่าอย่างไร 1) c1.vbproj 2) class1.vb 3) c1.dll 4) countstring 5) ok

คำถามที่ 6 : วาดภาพด้วย asp.net
Method of Graphic Class : clear, drawarc, drawbezier, drawclosedcurve, drawcurve, drawellipse, drawline, drawpath, drawpie, drawpolygon, drawrectangle, drawstring, fillclosedcurve, fillellipse, fillpath, fillpie, fillpolygon, fillrectangle
ตัวอย่างการใช้ method เช่น g.fillrectangle(br,2,2,146,146)
ประเภทของแปรงระบายสี : brush, solidbrush, texturebrush, hatchbrush, lineargradienbrush, pathgradientbrush
ตัวอย่างการใช้ แปรงระบายสี เช่น dim br as brush
6.1 วาดภาพด้วย script เช่น  http://www.thaiabc.com/aspnet/graph01.aspx
<%@import namespace="system.drawing" %>
<%@import namespace="system.drawing.imaging" %>
<script language="VB" runat="server">
sub page_load(sender as object, e as eventargs)
dim b as new bitmap(150,150, pixelformat.format32bppargb)
dim g as graphics = graphics.fromimage(b)
dim br as brush
br = brushes.yellow
g.fillrectangle(br,2,2,146,146)
br = brushes.red
g.fillellipse(br,5,5,140,140)
response.contenttype = "image/gif"
b.save(response.outputstream, imageformat.gif)
b.dispose() end sub </script>
6.2 โหลดภาพมาแสดงในคอนโทล เช่น  http://www.thaiabc.com/aspnet/graph02.aspx
<%@ Page Language="VB" %>
<script runat="server">
Sub Page_Load(sender As Object,e As EventArgs)
img1.ImageUrl = "ta1.gif"
img1.Attributes.Add("OnClick", "alert('ทดสอบภาพ')")
img1.Style.Add("cursor", "hand")
img2.ImageUrl = "ta1.gif"
' ถ้าเปลี่ยน source เป็น utf8 จะ alert เป็นภาษาไทยอย่างถูกต้อง End Sub </script> <html><head></head><body> <form runat="server">
<asp:Image id="img1" runat="server"></asp:Image>
<asp:Image id="img2" runat="server"></asp:Image> </form> </body></html>

คำถามที่ 7 : สั่งให้ javascript ทำงานอย่างง่าย ต้องเขียนโปรแกรมอย่างไร
แบบ : เรียกผ่าน attribute ของปุ่ม button
<script language="VB" runat="server">
Sub act(ByVal sender As Object, ByVal e As EventArgs)
bt.attributes.add("onclick","alert('abc')")
End sub
</script>
<form id="form1" runat="server">
<asp:button ID="bt" runat="server" onclick="act"></asp:button>
</form>

แบบ : เรียกฟังก์ชัน javascript ที่สร้างขึ้น
<script language="javascript">
function a(b) { alert(b); }
</script>
<script language="VB" runat="server">
Sub act(ByVal sender As Object, ByVal e As EventArgs)
bt.attributes.add("onclick","a('ทดสอบ')")
End sub
</script>
<form id="form1" runat="server">
<asp:button ID="bt" runat="server" onclick="act"></asp:button>
</form>

แบบ : เรียกใช้ javascript จาก code behind
x.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="x.aspx.vb" Inherits="x" %>
<form id="form1" runat="server">
<asp:button ID="bt" runat="server"></asp:button>
</form>
x.aspx.vb Public Class x Inherits System.Web.UI.Page Protected Sub bt_click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Load page.registerclientscriptblock("onload","<script>alert('5')</script>") End Sub End Class

คำถามที่ 8 : การเรียกใช้ ASP.NET AJAX Control Toolkit ต้องทำอย่างไร
เป็นการเขียน Script เรียกใช้โดยตรง
+ จาก readme.doc ทำให้ทราบว่ามี Ajax ให้เรียกใช้ประมาณ 40 ตัว ( samples )
+ ผู้พัฒนาสามารถ download AJAX ที่ใช้ได้ทั้ง Web Forms และ MVC Application (Model-view-controller)
+ ตัวอย่างที่ผมทดสอบ calendar.aspx ซึ่งไม่มี ../ นำหน้าห้อง Scripts
+ เมื่อคลาย .zip จะพบอีก 2 โฟรเดอร์ที่ไม่จำเป็นต้องใช้กับการเขียน Script คือ AspNetAjaxBetaSamples และ WebForms
+ โฟรเดอร์ที่ใช้มีเพียง Scripts และมีโฟรเดอร์ Extended ซึ่งสัมพันธ์กับ Script แต่ละตัวที่เราเรียกใช้
+ คำแนะนำใน readme.doc เขียนละเอียดดีมาก ตัวอย่างหัวข้อที่น่าสนใจ
- Adding the ASP.NET Ajax Library to the Visual Studio Toolbox
- Adding a Control to a Web Forms Page from the Toolbox
- Instantiating Controls by Using the script Element
- Using the Microsoft Ajax Content Delivery Network (CDN) ใช้กับ VS 2010 ขึ้นไป
<html><head><title>Simple Calendar</title>
<link href="Scripts/Extended/Calendar/Calendar.css" rel="stylesheet" type="text/css" />
<script src="Scripts/Start.debug.js" type="text/javascript"></script>
<script src="Scripts/Extended/ExtendedControls.debug.js" type="text/javascript">
</script>
<script type="text/javascript">
Sys.require(Sys.components.calendar, function() {
Sys.create.calendar("#travelDate");
});
</script>
</head>
<body><input id="travelDate" /></body>
</html>

คำถามที่ 9 : กำหนด global variable ใน web.config
แบบ : กำหนดตัวแปรใน web.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="myname" value="burin" />
</appSettings>
<system.web>
<customErrors mode="On" />
</system.web>
</configuration>

แบบ : เรียกใช้ตัวแปรจาก web.config ใน x.aspx
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
bt.text = system.configuration.configurationsettings.appsettings("myname")
End sub
</script>
<form id="form1" runat="server">
<asp:textbox ID="bt" runat="server"></asp:textbox>
</form>

คำถามที่ 10 : ส่งค่าจากฟอร์มใน asp.net ไปยังอีกโปรแกรมหนึ่ง ต้องทำอย่างไร
เนื่องจากการกำหนด attribute ใน form เป็นแบบ runat=server จะไม่สามารถใช้ action แบบ post หรือ get ส่งค่าออกนอกโปรแกรม
เพราะโปรแกรมทำงานเฉพาะใน script ของตนเองเท่านั้น ไม่อนุญาตให้ส่งออกแบบที่เคยใช้ในภาษา ASP
แบบ : ส่งผ่าน redirect ใน subroutine เมื่อกดปุ่ม button ใน form
<body bgcolor="yellow">
<script language="VB" runat="server">
Sub act(ByVal sender As Object, ByVal e As EventArgs)
response.redirect("x02.aspx?key1=" & key1.text & "&key2=" & key2.text)
End sub
</script>
<body bgcolor="yellow">
<form id="fm" runat="server">
<asp:TextBox ID="key1" runat="server" Text="0"></asp:TextBox>
<asp:TextBox ID="key2" runat="server" Text="0"></asp:TextBox>
<asp:Button ID="b" runat="server" value="Submit" onclick="act" Text="go"></asp:Button> 
</form>
</body>

แบบ : รับค่าผ่าน URL เป็นเทคนิคของการเขียน ASP
<%@Page Language="VB" %>
<%
response.write(CInt(request.querystring("key1")) + CInt(request.querystring("key2")))
%>

คำถามที่ 11 : ตัวแปร session ใน ASP.NET ใช้อย่างไร
แบบ : นำค่าจาก Textbox เก็บลงตัวแปรแบบ session และเปลี่ยนเพจด้วย redirect
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
session("key1") =  key1.text 
session("key2") =  key2.text 
response.write(session.count) '2
if (key1.text > 0) then response.redirect("using_session_value.aspx")
End sub
</script>
<body bgcolor="yellow">
<form id="fm" runat="server">
<asp:TextBox ID="key1" runat="server" Text="0"></asp:TextBox>
<asp:TextBox ID="key2" runat="server" Text="0"></asp:TextBox>
<input type="submit">
</form>
</body>

แบบ : ใช้ค่าตัวแปร session
<%@Page Language="VB" %>
<% response.write(CInt(session("key1")) + CInt(session("key2"))) %>

คำถามที่ 12 : อ่านข้อมูลจาก Microsoft Access ส่งไปแสดงผลใน Datagrid ทำอย่างไร
+ dbthai97.mdb ตารางชื่อ tbthai มี 3 เขตข้อมูลได้แก่ 1) fid int 2) fname string 3) fsalary double
+ รหัสต้นฉบับสำหรับปรับปรุง หรือลบระเบียน : http://www.thaiabc.com/aspnet/dthai97_upd_aspx.txt
12.1 อ่านข้อมูลจาก Microsoft Access ไปแสดงใน datagrid control ต.ย. dthai9701.aspx
<%@import namespace="system.data" %>
<%@import namespace="system.data.oledb" %>
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
response.Charset = "windows-874"
' response.Charset = "tis-620" ก็ให้ผลเช่นเดียวกับ windows-874
dim conn as new oledbconnection("Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=" & Server.Mappath("dthai97.mdb"))
dim da as new oledbdataadapter("select * from tbthai", conn)
dim ds as new dataset()
da.fill(ds, "t1")
datagrid1.datasource = ds.tables("t1")
datagrid1.databind() End sub </script><html><head> <meta http-equiv=content-type content="text/html; charset=windows-874"> </head><body bgcolor="yellow"> data of dthai97.mdb<br> <asp:datagrid id="datagrid1" runat="server" /> </body></html>

12.2 ลบข้อมูลจาก Microsoft Access ด้วย control กับ datagrid control
ตัวอย่างนี้จะลบระเบียนข้อมูลไม่ได้ เพราะแฟ้ม mdb ไม่ได้อยู่ในห้อง /access_db
ต.ย. dthai97_del.aspx
<%@Import Namespace="System.Data"%>
<%@Import Namespace="System.Data.OleDb"%>
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<script language = "VB" runat = "server">
Dim myconn As OleDbConnection
Dim myda As OleDbDataAdapter
Dim mycommand As OleDbCommand
Dim ds As New DataSet()
Dim strsql As String
Sub Page_Load(Sender As Object , E As EventArgs)
myconn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0 ;" & _
"Data Source=" & Server.MapPath("dthai97.mdb"))
If Page.IsPostBack = False Then Bind() End Sub Sub Deleterec(Sender As Object , E As DataGridCommandEventArgs) strsql = "Delete from tbthai Where fid = " & _ DataGrid1.DataKeys.Item(e.Item.ItemIndex) mycommand = New OleDbCommand(strsql,myconn) myconn.Open() mycommand.ExecuteNonQuery() myconn.Close() Bind() End Sub Sub Bind() strsql = "Select * from tbthai" myda = New OleDbDataAdapter(strsql,myconn) myda.Fill(ds,"tb") DataGrid1.DataSource=ds.Tables("tb") DataGrid1.DataBind() End Sub </script> <form runat = "server"> <asp:DataGrid id = "DataGrid1" runat = "server" AutoGenerateColumns = False DataKeyField = fid OnDeleteCommand = Deleterec> <Columns> <asp:ButtonColumn ButtonType = LinkButton CommandName = Delete Text = Delete /> <asp:BoundColumn HeaderText = "รหัส" DataField = "fid" ReadOnly = True /> <asp:BoundColumn HeaderText = "ชื่อ - สกุล" DataField = "fname" /> <asp:BoundColumn HeaderText = "เงินเดือน" DataField = "fsalary" /> </Columns> </asp:DataGrid> </form>


คำถามที่ 13 : จัดการแฟ้ม xml ทำอย่างไร
+ http://www.thaiall.com/aspnet/education.xml
13.1 อ่านข้อมูลจาก xml ไปแสดงใน datagrid
<%@import namespace="system.data" %>
<%@import namespace="system.io" %>
<%@language="vbscript" codepage="874" %>
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
pro1()
pro2()
end sub
sub pro1
' http://truehits.net/xml/html
dim rd as streamreader = file.opentext(server.mappath("education.xml"))
dim ds as new dataset
ds.readxml(rd)
dim i,j,k as integer
for i = 0 to ds.tables.count - 1
  for j = 0 to ds.tables(i).rows.count - 1
    for k = 0 to ds.tables(i).columns.count - 1
      response.write(ds.tables(i).rows(j).item(k) & " | ")
    next
    response.write("<br>")
  next
  response.write("<hr>")
next
rd.close
end sub
sub pro2
  dim rd as streamreader = file.opentext(server.mappath("education.xml"))
  dim ds as new dataset
  ds.readxml(rd)
  datagrid1.datasource = ds ' default is table 0
  datagrid1.databind()
  datagrid2.datasource = ds.tables(1)
  datagrid2.databind()
  datagrid3.datasource = ds.tables(2)
  datagrid3.databind()
end sub
</script>
<asp:datagrid id="datagrid1" runat="server" />
<asp:datagrid id="datagrid2" runat="server" />
<asp:datagrid id="datagrid3" runat="server" />

13.2 สร้าง xml และใช้ร่วมกับ listbox
<%@import namespace="system.data" %>
<%@import namespace="system.io" %>
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
if not  ispostback then createtb()
end sub

sub createtb
dim dtable as new datatable()
dim drow as datarow
dtable.columns.add(new datacolumn("eid",gettype(integer)))
dtable.columns.add(new datacolumn("ename",gettype(string)))
drow = dtable.newrow()
drow.item("eid") = 101
drow.item("ename") = "บุรินทร์"
dtable.rows.add(drow)
drow = dtable.newrow()
drow.item("eid") = 102
drow.item("ename") = "อติชาต"
dtable.rows.add(drow)
'
dim ds as new dataset
ds.tables.add(dtable)
datagrid1.datasource = ds
datagrid1.databind()
listbox1.datasource = dtable
listbox1.datavaluefield = "eid"
listbox1.datatextfield = "ename"
listbox1.databind()
end sub
'
sub button1_click(sender as object, e as eventargs)
me.textbox1.text = me.listbox1.selecteditem.text
me.textbox2.text = me.listbox1.selecteditem.value
end sub
</script>
<asp:datagrid id="datagrid1" runat="server" />
<form runat="server">
<asp:listbox id="listbox1" runat="server" />
<asp:textbox id="textbox1" runat="server" />
<asp:textbox id="textbox2" runat="server" />
<asp:button id="button1" text="click" runat="server" onclick="button1_click" />
</form>


รวมเทคนิคสั้น
short 1. แสดงค่าจากตัวแปร Servervariables #
<script language="VB" runat="server">
sub page_load(ByVal sender As Object, ByVal e As EventArgs)
dim intCtr as integer
dim coll As System.Collections.Specialized.NameValueCollection
coll = System.Web.HttpContext.Current.Request.ServerVariables
for intCtr = 0 To coll.keys.count - 1
response.Write(coll.keys(intCtr)  & ": ")
response.Write(coll.item(intCtr))
response.write("<BR>")
next 
me.lb.text = "<a href=http://freegeoip.appspot.com/xml/" 
me.lb.text = me.lb.text & coll.item("REMOTE_ADDR") & ">link</a>"
'http://www.gorissen.info/Pierre/maps/googleMapLocation.php?lat=18.2983&lon=99.5072
end sub
</script>
<form id="form1" runat="server"><asp:Label ID="lb" runat="server">
</asp:Label></form>
</body>
short 2. แสดงจังหวัดตามหมายเลข IP Address#
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Xml" %>
<script language="VB" runat="server">
Sub Page_Load(sender as Object, e as EventArgs)    
  dim intCtr as integer
  dim coll As System.Collections.Specialized.NameValueCollection
  coll = System.Web.HttpContext.Current.Request.ServerVariables
  me.lb.text = "http://freegeoip.appspot.com/xml/" & coll.item("REMOTE_ADDR")
  d.dataSource = getxml(me.lb.text)
  d.dataBind()      
End Sub
Function getxml(strURL as String) as DataTable 
  Dim reader as XmlTextReader = New XmlTextReader(strURL)  
  Dim ds as DataSet = New DataSet()
  ds.ReadXml(reader)    
  Return ds.Tables(0)
End Function
</script>
<asp:DataGrid runat="server" id="d" />
<asp:Label runat="server" id="lb"></asp:Label>
short 3. การอ่านจาก Microsoft Access ใส่ใน Listbox ด้วย Accessdatasource#
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<body><form id="form1" runat="server"><div>
<asp:AccessDataSource ID="AccessDataSource1" runat="server" 
DataFile="dthai97.mdb" SelectCommand="SELECT * FROM [tbthai]">
</asp:AccessDataSource>
<asp:ListBox ID="ListBox1" runat="server" DataSourceID="AccessDataSource1" 
DataTextField="fname" DataValueField="fname" Height="162px" Width="371px">
</asp:ListBox>
</div></form></body>
short 4. อีนิวเมอเรชัน กับ วันของสัปดาห์ กับวันที่ปัจจุบัน
<body bgcolor=yellow>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
  me.lb1.text =now ' 1/3/2010 6:41:32 AM
  me.lb2.text =weekday(now) ' 1 = vbsunday
  dim mydate as dweek
  mydate = dweek.saturday
  me.lb3.text = mydate ' 6 = saturday
End sub
Enum dweek
  sunday ' = 0
  monday
  tuesday
  wednesday
  thursday
  friday
  saturday
End Enum
</script>
<form id="form1" runat="server">
<asp:Label ID="lb1" runat="server"></asp:Label><br />
<asp:Label ID="lb2" runat="server" /><br />
<asp:Label ID="lb3" runat="server" /><br />
</form></body>
short 5. การสร้างและเรียกใช้ structure
<body bgcolor=yellow>
<script language="VB" runat="server">
Sub page_load(ByVal sender As Object, ByVal e As EventArgs)
  dim i as integer = 0
  dim x as xdata
  x.xnum = x.xnum + 1
  x.xsum = x.xsum + x.xnum
  x.xnum = x.xnum + 1
  x.xsum = x.xsum + x.xnum
  me.lb.text = x.xsum ' 3
End sub
Structure xdata
  public xnum as integer
  public xsum as integer
End Structure
</script>
<form id="form1" runat="server">
<asp:Label ID="lb" runat="server"></asp:Label>
</form>
</body>
short 6. การสร้าง structure และ enum และอาร์เรย์ ใน code behind และสั่งให้แสดงผลใน code inline
http://vbdotnetheaven.com/UploadFile/rajeshvs/StructuresInVbDotNet04192005235119PM/StructuresInVbDotNet.aspx
x.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="x.vb" Inherits="x" %>
<form id="form1" runat="server">
<asp:label ID="lb_id" runat="server" />
<asp:label ID="lb_sex" runat="server" />
</form>

x.vb Public Class x Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Load dim i as integer = 1 dim myfriend(10) as myfriend myfriend(0).fr_id = 101 myfriend(0).fr_sex = mysex.male myfriend(1).fr_id = 102 myfriend(1).fr_sex = mysex.female me.lb_id.text = myfriend(i).fr_id ' 102 me.lb_sex.text = myfriend(i).fr_sex ' 2 End Sub Structure myfriend ' ในหนังสือบางเล่มไม่มี public แต่ถ้าไม่มี public จะ error ครับ public fr_id as integer public fr_sex as mysex End Structure Enum mysex male = 1 female = 2 End Enum End Class
short 7. crystal report กับ asp.net แบบส่ง parameter อย่างง่าย
+ http://www.thaiabc.com/aspnet/mysite2/mysite2.zip
+ ทดสอบกับ 127.0.0.1 ต้องลบ authentication ด้วย windows ออกจาก web.config
x.aspx
        <asp:TextBox ID="TextBox1" Text="5"  runat="server"></asp:TextBox> 
        <asp:TextBox ID="TextBox2" Text="6" runat="server"></asp:TextBox> 
        <asp:TextBox ID="TextBox3" Text="7" runat="server"></asp:TextBox>
        <asp:TextBox ID="TextBox4" Text="8" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" /><br />
        <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="True"
            Height="1039px" ReportSourceID="CrystalReportSource1" Width="901px" 
            ReuseParameterValuesOnRefresh="True" />
        <CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
            <Report FileName="CrystalReport.rpt">
            <Parameters>
            <CR:Parameter Name="a1" DefaultValue="" ConvertEmptyStringToNull="False" ReportName="" />
            <CR:Parameter Name="a2" DefaultValue="" ConvertEmptyStringToNull="False" ReportName="" />
            <CR:Parameter Name="a3" DefaultValue="" ConvertEmptyStringToNull="False" ReportName="" />
            <CR:Parameter Name="a4" DefaultValue="" ConvertEmptyStringToNull="False" ReportName="" />
            </Parameters>
            </Report>
        </CR:CrystalReportSource>

x.aspx.vb มีคำสั่งในปุ่มคำสั่งดังนี้ Me.CrystalReportSource1.Report.Parameters.Item(0).DefaultValue = TextBox1.Text Me.CrystalReportSource1.Report.Parameters.Item(1).DefaultValue = TextBox2.Text Me.CrystalReportSource1.Report.Parameters.Item(2).DefaultValue = TextBox3.Text Me.CrystalReportSource1.Report.Parameters.Item(3).DefaultValue = TextBox4.Text

-

-

-

-

-

-

-

-

-

-

-

-
ปรับปรุง : 670208
thaiabc.com/aspnet/dthai9701.aspx
dthai9701_aspx.png
<%@import namespace="system.data" %>
<%@import namespace="system.data.oledb" %>
<%@language="vbscript" codepage="1252" %>
<script language="vb" runat="server">
sub page_load(ByVal sender As Object, ByVal e As EventArgs)
response.charset = "windows-874" ' or tis-620
dim conn as new oledbconnection("Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=" & Server.Mappath("/access_db/dthai97.mdb"))
dim da as new oledbdataadapter("select * from tbthai", conn)
dim ds as new dataset()
da.fill(ds, "t1")
datagrid1.datasource = ds.tables("t1")
datagrid1.databind()
End sub
</script>
<style>#datagrid1{background-color:white;}</style>
<html><head><title>dthai97</title></head>
<body style="background-color:yellow;">
Data of dthai97.mdb<br/>
<asp:datagrid id="datagrid1" runat="server" />
</body></html>
เอกสารอ้างอิง
[1] เรวัตร ธรรมาอภิรมย์, "เจาะลึกเทคโนโลยีใหม่ Microsoft .net Framework", บริษัท เอส.พี.ซี.พริ้นติ้ง จำกัด, กรุงเทพฯ, 2544.
[2] พร้อมเลิศ หล่อวิจิตร, "คู่มือเรียน Visual Basic 2005", บริษัท โปรวิชั่น จำกัด., กรุงเทพฯ, 2549.
[3] ธวัชชัย สุริยะทองธรรม, "พัฒนาเว็บแอพพลิเคชั่น ASP.NET", บริษัท ซัคเซส มีเดีย จำกัด., กรุงเทพฯ, 2548.
[4] Macro Bellinaso, วิสารัท ทองประเสริฐ ผู้แปล, "พัฒนาเว็บไซต์ด้วย ASP.NET 2.0 วิเคราะห์ปัญหา ออกแบบระบบ เขียนโปรแกรม", บริษัท ซีเอ็ดยูเคชั่น จำกัด, กรุงเทพฯ, 2546.
[5] ทวีชัย หงษ์สุมาลย์, "อินไซท์ ASP.NET ฉบับสมบูรณ์", บริษัท โปรวิชั่น จำกัด, กรุงเทพฯ, 2546.
Thaiall.com