วันพุธที่ 16 มกราคม พ.ศ. 2551

Why JavaScript Topic can't be displayed ?

l@#$%^&* :-( I have to tranfer some topic from space.live but i have some problem about JavaScript Topic. It doen't show in Blogger. - -" May be i must change that's topic to the picture. uhh

วันอังคารที่ 15 มกราคม พ.ศ. 2551

Sequence Css Block with A tag

You should coding A tag sequence in Css as below. A:link A:visited A:hover A:active
If you place A:hover before A:link or A:visited. The property in A:hover  will not be display.

วันอาทิตย์ที่ 13 มกราคม พ.ศ. 2551

BackGround Worker - Progress Bar

การใช้ Background Worker ก็ลากมาแปะในฟอร์ม แล้วดูว่า เราต้องการทำอะไรบ้างดูใน Property & Event
workerReport Progress = True << รายงานการเปลี่ยนแปลง ใช้คู่กับ Event Progress changed ( มั้งนะ เดาเอา )
workerSupport Cancellation =True << กด Cancel ขณะ Runtime
Event
DoWork ต้องใช้ฟตลอด
RunworkerCompleted ให้ทำอะไรหลังที่ Bgw ทำงานเสร็จ

Private Sub btnGentoDb_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGentoDb.Click

Me.bgw.RunWorkerAsync(.dgv.Rows.Count - 1) '---- ส่งจำนวนรอบ หรือไม่ส่งก็ว่างไว้

End Sub

Private Sub bgw_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork

Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

'เรียก แบบ Function ให้เอา ผลลัพธ์ ใส่ให้ e.result ด้วย

' e.Result = Function(parameter)

'เรียกแบบ Sub

Me.AppendData(e.Argument, worker, e) <<<<<< ไปเรียก Method ที่ทำการประมวลผลเช่นดึงค่ามาจาก Db

End Sub

Private Sub bgw_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged

'ทำงานหลัง จากมีการเรียก wk.ReportProgress(Pvalue)

'แสดงผล ความก้าวหน้าการทำงาน

pgb.Value = e.ProgressPercentage

End Sub

Private Sub bgw_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted

If Not (e.Error Is Nothing) Then

'ทำงานเมื่อเกิด exception ทำให้ การทำงานหยุด

MessageBox.Show(e.Error.Message.ToString, " Error ", MessageBoxButtons.OK, MessageBoxIcon.Error)

ElseIf e.Cancelled Then

' ทำงานหลัง เรียก CancelAsync.

MessageBox.Show(" Cancelled")

Else

'กรณี ปกติ ทำงานเสร็จหมดแล้ว มาจบที่ตรงนี้

'ให้กำหนดว่า(เมื่อทำงานเสร็จแล้วให้ทำอะไร)

' Finally, handle the case where the operation succeeded.

'ก็แค่บอกว่า ทำเสร็จ

Me.btnGentoDb.Enabled = True

End If

End Sub

Special Thanks ..

Gf Board Gf Minilab V.1

อืมม ทบทวนความจำเรื่อง Dispose กับ Obj

ถามเรื่องตัวแปรทั่ว ๆ ที่ใช้ใน sub พอใช้เสร็จต้องจัดการอะไรกับตัวแปรนั้นๆ ไหมครับ

ถาม VB.NET และ C#.NET
ตัวแปรทั่ว ๆ ไปที่เราประกาศขึ้นมาใช้ในแต่ละ sub พอใช้ sub นั้นเสร็จแล้วต้องจัดการอะไรกับตัวแปรต่อไหมครับ
อย่างเช่นตัวแปร integer,string,double,sqldatareader,datatable,sqlcommand,sqlconnection อื่น ๆ อีกมากมาย
ปกติแล้วถ้าเราไม่ได้ทำอะไรกับตัวแปรเหล่านี้ ตัวภาษาเองจะสามารถจัดการให้เราอัตโนมัติได้ไหมครับ(ทำลายตัวแปรนั้นไหม) เพราะส่วนใหญ่ตัวแปรอย่างพวก string,integer อะไรพวกนี้เหมือนส่วนใหญ่ไม่ได้ให้ความสำคัญกัน แต่จะให้ความสำคัญกับพวก Datatable,Dataset,Connection อะไรประมาณนี้ครับ ขอคำแนะนำด้วยครับ
ยอดชาย
----------------------------------------
1. ตัวแปรที่เป็น value type เช่น Structure, Integer, Byte, Boolean ฯลฯ
ไม่ต้องทำอะไรทั้งสิ้น เพราะมันจะถูกคืนหน่วยความจำเองเมื่อโค้ดออกจาก scope ที่ประกาศตัวแปรนั้นๆ
เช่น ตัวแปร x As Integer ใน Sub A()
เมื่อ Sub A เริ่มทำงาน เมื่อไหร่ ตัวแปร x จึง "เกิด" กินพื้นที่ 4 ไบต์ใน stack
และเมื่อเจอ End Sub (หรือเมื่อการทำงานออกจาก Sub A) ตัวแปร x ก็จะ "ตาย" และคืนหน่วยความจำ
2. ตัวแปรที่เป็น Reference type เช่น Class, String, Array, Delegate
โดยตัวแปรมันเอง (เรียกว่า object reference) นี่ส่วนหนึ่ง
และเมื่อมีการสร้างอ๊อบเจ็กต์ (object) แล้วเอาตัวแปรเมื่อกี้ไปชี้ นี่ก็อีกส่วนหนึ่ง
Sub Foo()
Dim c As Course ' ---- c เป็น object reference
c = New Course() ' ---- เกิดการสร้าง object ใหม่เกิดขึ้นมา แล้วให้ c ไปชี้
c = Nothing ' ---- ไม่จำเป็น
End Sub
เฉพาะส่วน object reference จะใช้พื้นที่ 4 ไบต์ใน เครื่อง 32-bit
หรือ 8 ไบต์ในเครื่อง 64-bit ก็อยู่ใน stack จะเกิดและตายในทำนองเดียวกับ Value types ทั้งหลาย
ดังนั้น เราจะกำหนดค่าให้ Nothing หรือไม่ ก็ไม่จำเป็นนัก คือมีค่าผลเหมือนๆ กัน
ส่วนที่เป็นเรื่องหน่อย ก็ตรงอ๊อบเจ็กต์ที่สร้างขึ้น (ในหน่วยความจำของโปรแกรม
ส่วนที่เรียกว่า managed heap นั่นแหล่ะครับ)
ตรงนี้ถูกจัดการด้วย Garbage Collector (GC)
ตอบย่อๆ เฉพาะสำหรับกระทู้นี้คือ
ถ้า อ๊อบเจ็กต์นั้นมีเมธอด Dispose หรือ Implements อินเทอร์เฟส IDisposable
ก็ให้เรียกเมธอด Dispose นั้นด้วย
ก่อนที่ตัวแปร reference นั้นจะถูกกำหนดเป็น Nothing หรือ "ตาย" ไปเสียก่อน
เช่น
Sub Foo2()
Dim c As New Course()
...
If (TypeOf c Is IDisposable) Then
DirectCast(c, IDisposable).Dispose()
End If
c = Nothing ' ---- ไม่จำเป็นอยู่ดี
End Sub
ไม่อย่างนั้นแล้ว เดี๋ยว c มันเกิด nothing หรือ ตายไป
เราจะไม่มีโอกาสเปลี่ยนใจมาเรียก Dispose ให้กับ "อ๊อบเจ็กต์" อีกแล้ว
ปล.
เรื่องของ Dispose ให้ค้นหาอ่านได้จากเว็บบอร์ดเกรทเฟรนส์ เพิ่มเติมด้วยจะดีมาก
นอกจากกรณีที่ควร Dispose ถ้ามีให้ Dispose แล้ว
อีกกรณีก็เรื่อง COM object ที่ คุณนายเคยเขียนวิธีการ Release COM object อย่างถูกวิธีไว้
ก็ค้นหาจากเว็บบอร์ดนี้ได้อีกเช่นกัน.
surrealist
----------------------------------------
ขอบคุณมากนะครับที่อุตส่าห์สละเวลามาอธิบายแบบละเอียดเลย
จากที่ผมเข้าใจ คือ
1.class ที่เราสร้างขึ้นมาเองเวลาที่ใช้น่าจะเป็นแบบนี้ใช่ไหมครับ (ตัวอย่างที่อาจารย์ให้ดู)
Sub Foo2()
Dim c As New Course()
...
If (TypeOf c Is IDisposable) Then
DirectCast(c, IDisposable).Dispose()
End If
c = Nothing ' ---- ไม่จำเป็นอยู่ดี
End Sub
2.ส่วนที่ว่า
c = Nothing ' ---- ไม่จำเป็นอยู่ดี หมายถึงไม่มีประโยชน์ที่ใช้คำสั่ง c = Nothing หากทำ Dispose แล้ว
(ความเข้าใจของผมในตอนนี้คือ C คือ Object ที่ Instant มาจาก Class Course ถูกไหมครับ)
3.ตัวแปรพวกนี้ sqldatareader,datatable,sqlcommand,sqlconnection (Reference Type )
ตอนที่จบ sub ถ้าอ๊อบเจ็กต์นั้นมีเมธอด Dispose หรือ Implements อินเทอร์เฟส IDisposable ก็ให้เรียกเมธอด Dispose นั้นด้วย
ขอบคุณมากครับ
ปล.ผมเพิ่งทราบนะครับว่า string เป็นตัวแปรแบบ Reference type แล้วตัวแปรแบบ string ต้องจัดการยังไงเมื่อจบ sub ครับ **
ยอดชาย
----------------------------------------

ตอบ

1. ใช่ครับ แต่เรามีประโยคที่สั้นกว่าในการ dispose คือ Using statement เช่น
Using x As New Class1
' ---- use the x object.
End Using ' --- at End Using, x will be disposed if it implements IDisposable.
2. ต้องเข้าใจให้ชัดเจนก่อนว่า c ไม่ใช่อ๊อบเจ็กต์ แต่เป็น object reference (ตัวpointerชี้ไปยัง object เท่านั้น)
การที่ให้ c เป็น Nothing คือ ตัวชี้ที่เคยชี้ไปยังอ๊อบเจ็กต์ ก็ไม่ชี้แล้ว ส่วนอ๊อบเจ็กต์นั้นยังคงอยู่ครับ

"ไม่มีประโยชน์ที่ใช้คำสั่ง c = Nothing หากทำ Dispose แล้ว"
ไม่ถูกต้องทั้งหมดครับ แต่ก็ไม่ผิด
3. สังเกตง่ายๆ ว่า ถ้า class นั้นๆ มีเมธอด Close ให้เรียก Close เมื่อใช้เสร็จ
ถ้ามีเมธอด Dispose ให้เรียก Dispose เมื่อใช้เสร็จ (หรือใช้ Using statement แทน)
ความแตกต่างระหว่าง Close กับ Dispose ก็มีครับ
แต่ก่อนผมเคยบอกในเว็บบอร์ดว่ามันไม่ต่างกัน ตอนนี้ขอเปลี่ยนข้อมูลใหม่นะครับ
Close - ใช้เรียกเมื่อเราเลิกใช้แล้ว แต่อ๊อบเจ็กต์นั้นยังใช้ซ้ำได้อีก
Dispose - ใช้เรียกเมื่อเราเลิกใช้แล้วจริงๆ อ๊อบเจ็กต์นั้นจะอยู่ในสถานะที่ใช้อีกไม่ได้
ตัวแปร reference นอกเหนือจาก Class เช่น String, Array, Delegate จะอยู่ในการควบคุม
ของ CLR ครับ เราไม่จำเป็นต้องไปจัดการด้วยตนเองเลย จริงๆ แล้ว อาจจะเป็นหน้าที่ของ
คอมไพเลอร์ของภาษาที่เราใช้ เพราะโดย syntax มันก็พยายามทำให้เรามองไม่เห็นอยู่แล้ว
ว่าเป็น reference type เช่น เราไม่จำเป็นต้อง new อ๊อบเจ็กต์ string เอง
surrealist
----------------------------------------
ขอบคุณ อาจารย์ , คุณ ยอดชาย , GF Board ครับ

การใช้ Using .. End Using

MESSAGE #18854 (อ่าน 158 ครั้ง) Using .... End Using ใช้ยังไงครับ Using .... End Using ใช้ยังไงครับ กับ Try ... Catch ... End Try

ใช้ต่างกันยังไงครับ

ขอขคุณครับ ปอ

-----------------------

Using จะทำการ Dispose ตัวแปร command ให้อัตโนมัติครับ

ส่วน Try .. Catch ใช้ดักเมื่อเกิด throw exception

tony

----------------------

Using sample

Using conn As New SqlConnection(dsn) Using cmd As New SqlCommand("SELECT * FROM Employees", conn) conn.Open() Using rdr As SqlDataReader = cmd.ExecuteReader() While rdr.Read() Console.WriteLine(rdr(0)) End While End Using End Using End Using Nine (นาย) -------------------- ต้วอย่าง แบบไม่ใช้ Using Dim x2 As New Employee("x2") x2.Name = "test"

If (TypeOf x2 Is IDisposable) Then DirectCast(x2, IDisposable).Dispose() End If แบบใช้ Using Using x3 As New Employee("x3") x3.Name = "test" End Using

Iwis -------------------------------

Using cn1 As New SqlConnection(My.Settings.NorthwindConnectionString), _ cmd1 As New SqlCommand(sql1, cn1) cn1.Open() Dim reader As DataReader = cmd1.ExecuteReader() Do While (reader.Read()) Dim sql2 As String sql2 = "...." Using cn2 As New SqlConnection(My.Settings.NorthwindConnectionString), _ cmd2 As New SqlCommand(sql2, cn2) cn2.Open() cmd2.ExecuteNonQuery() End Using Loop reader.Close End Using surrealist ---------------------- Using da As New SqlDataAdapter(sql, cn) Dim cmd As SqlCommand = da.SelectCommand cmd.Parameters.Add("@para1", SqlDbType.XYZ).Value = yourValue ' ---- เมื่อเราสั่ง Fill, DataAdapter จะเอา SelectCommand ของมันไป ExecuteReader ' ---- เพื่อนำข้อมูลที่ได้จาก DataReader มา "Fill" ใส่ DataSet/DataTable ที่เรากำหนด da.Fill(ds, "Table1") End Using ' ... Return(ds)

surrealist

ขอบคุณทุกๆท่านที่มีรายชื่อครับ ที่มา ณ www.greatfriends.biz

การใช้ Parameter คู่กับ Dataset จะเขียนยังไงดีครับ

การใช้ Parameter คู่กับ Dataset จะเขียนยังไงดีครับ

คือ ปรกติผมใช้ parameter กับ พวก .ExecuteNonquery หรือไม่ก็ .ExecuteReader น่ะครับ แต่ทีนี้ว่ามีปัญหาคือ
Function ในการ Query ข้อมูลนั้น เป็นการ return ค่าออกมาเป็น Dataset ซึ่งผมไม่รู้ว่าจะวาง parameter ยังไงให้ ตรง query Dataset รู้จักค่า Parameter ด้วย
ยกตัวอย่างการเขียนนะครับ
Dim dr As SqlDataReader

Try

checkOpen() << เกี่ยวกับเปิดปิดการ Connect

Dim sql As String = " select * From MyTable Where id = @id And Name Like @Name "

Dim cmd As New SqlCommand(sql, cn)

cmd.Parameters.Add("@id", SqlDbType.DateTime).Value = sdate

cmd.Parameters.Add("@Name", SqlDbType.DateTime).Value = edate

dr = cmd.ExecuteReader

dr.Read()

If dr.HasRows = True Then

cmd.Dispose()

dr.Close()

Dim da As New SqlDataAdapter(sql, cn)

Dim ds As New DataSet

da.Fill(ds, "Test")

da.Dispose()

Return ds <<< คืนค่าออกไป

Else

cmd.Dispose()

dr.Close()

End If

Catch ex As Exception

MsgBox(ex.Message & " จาก Function Test, TestClass")

Finally

cn.Dispose()

End Try

คือ ถ้าเขียนแบบนี้ ตัว SqlDataAdapter มันจะไม่รู้จัก ตัว Parameter น่ะครับ

ไม่ทราบว่ามันสามารถเขียนได้หรือไม่ครับ

ขอบคุณมากครับ
MrSuthin วันที่ส่ง: 3 ม.ค. 50 18:43 GMT+7 วันที่ปรับล่าสุด: 3 ม.ค. 50 19:50 GMT+7
REPLY #1 (32444)
คุณ MrSuthin ยังใช้วิธีการเขียนแบบ Visual Studio 2003 (.NET 1.1) อยู่นะครับ
ยังไม่ใช้ .NET 2 หรือครับ
ใน DataAdapter จะมีอ๊อบเจ็กต์ Command ของมันเองอยู่สี่ตัว
กรณีนี้เรากำลังจะสนใจเฉพาะ SelectCommand ผมแนะนำโค้ดให้นิดหน่อย
คุณสุทินก็คงเขียนต่อเองได้แล้วมั้งครับ
Dim sql As String = "SELECT ... WHERE col1 = @para1;"
Dim ds As New DataSet
' ...
Using da As New SqlDataAdapter(sql, cn)
Dim cmd As SqlCommand = da.SelectCommand
cmd.Parameters.Add("@para1", SqlDbType.XYZ).Value = yourValue
' ---- เมื่อเราสั่ง Fill, DataAdapter จะเอา SelectCommand ของมันไป ExecuteReader
' ---- เพื่อนำข้อมูลที่ได้จาก DataReader มา "Fill" ใส่ DataSet/DataTable ที่เรากำหนด
da.Fill(ds, "Table1")
End Using
' ...
Return(ds)

surrealist

ขอขอบคุณ อาจารย์ครับ

Datarelation กับ Dataset Read Xml

DataRelation เอา 2 Dataset มา Relation กัน โดย มันจะต้องอยู่ใน dataset ตัวเดียวกัน
'--- อันนี้เป็นการทำ Relation กับตัวมันเอง 1 Talbe ( ทำมาไมวะตู - -" )

Dim cnString As String = "Bla Bla Bla ::: OpenConnection Database"

Dim cn As New SqlConnection

With cn

If .State = ConnectionState.Open Then .Close()

cn.ConnectionString = cnString

.Open()

End With

Dim sql As String = " select top 500 "

sql &= " Ta.idTableAccount , Ta.InvNo , Ta.Amount ,"

sql &= " Ta.Volume,"

'---- Consignee "

sql &= " Cn.TitleConsignee "

sql &= " From TableAccount Ta "

sql &= " Inner Join Consignee Cn On Ta.Consignee = Cn.idConsignee "

Dim da As New SqlDataAdapter(Sql, cn)

Dim ds As New DataSet

da.Fill(ds, "ShowAllTableAccount")

Dim sqlSub As String = " select top 500 "

sqlSub &= " Tat.idTableAccount , "

sqlSub &= " Tat.Sendto , Tat.SendInv , Tat.Voy , "

sqlSub &= " Tat.etd, Tat.kaset , Tat.eu , "

sqlSub &= " Tat.isCancel,"

'---- Consignee & Country

sqlSub &= " Vs.NameVessel , de.country "

sqlSub &= " From TableAccount Tat "

sqlSub &= " inner join TableAccount TaSub On Tat.idTableAccount = TaSub.idTableAccount "

sqlSub &= " Inner Join Destination De On Tat.Country = De.idDestination "

sqlSub &= " Left Join Vessel Vs On Tat.Vessel = Vs.idVessel"

' da.SelectCommand.CommandText = sqlSub

Dim da1 As New SqlDataAdapter(sqlSub, cn)

' Dim ds1 As New DataSet

da1.Fill(ds, "ShowAllTableAccountSub")

Dim dcMaster, dcDetails As DataColumn

'--- อ่าน Field idTableAccountเก็บไว้ใน dcMaster

dcMaster = ds.Tables("ShowAllTableAccount").Columns("idTableAccount")

'--- อ่าน Field idTableAccountเก็บไว้ใน dcDetails

dcDetails = ds.Tables("ShowAllTableAccountSub").Columns("idTableAccount")

'--- สร้างความสัมพันธ์ และใส่ค่าไว้ที่ dl

Dim dl As New DataRelation("Details", dcMaster, dcDetails)

ds.Relations.Add(dl)

Dim dvm As New DataViewManager

dvm.DataSet = ds

Dim dvs As DataViewSetting

dvs = dvm.DataViewSettings("ShowAllTableAccount")

dvs.Sort = "idTableAccount"

dvs = dvm.DataViewSettings("ShowAllTableAccountSub")

dvs.Sort = "Consignee"

With FvAccount.dgvAcc

.ReadOnly = True

.DataSource = dvm

.DataMember = "ShowAllTableAccount"

End With

With FvAccount.subDgvAcc

.ReadOnly = True

.DataSource = dvm

.DataMember = "ShowAllTableAccount.idTableAccount"

End With

จะสังเกตุได้ว่า เรา Dim New DataAdpter และ Dataset แค่ครั้งแรกครั้งเดียว ส่วนครั้งที่สองนั้น เราสามารถใช้

DataAdapter ตัวเดิมได้ แล้ว จะต้องใช้ Dataset ตัวเดิม ห้าม Dim New เพราะใช้แล้ว Error ว่ามันไม่สามารถทำ

Relation กับตัว Dataset ที่ต่างกันได้ ( แปลมาว่างี้ )

ต่อมา มาเรื่องของ Ds.ReadXml เวลา Export File จากไหนๆก็ตาม ยกตัวอย่างจาก Access

Export File ออกมาแบบธรรมดาไม่ต้องเอา Schema ( จะมี Option ขั้นสูงฝัง Schema มากับ Data เลย )

เพราะถ้าฝังมาด้วย มันจะทำให้ ds.ReadXml อ่านไม่ได้

พออ่านได้เราก็เอา ds.ReadXml("d:/Test.xml") << หรือรับค่ามาจาก OpenFileDialogbox ก็ได้

แล้วก็ไป Binding ใส่ Control ต่างๆได้ ต่อ ไป การอ้างถึงก็คือ

Ds.Tables("ชื่อTable")

ข้อควรจำในการ Export File มาเป็น Dataset

**** ถ้ามี Column ตรงกับชื่อ Table มันจะทำให้การอ่านค่าผิดพลาด จะต้องไม่ให้ ชื่อ Column ไม่ซ้ำกับชื่อของ Table เด็ดขาด !!

Property Dock กับ Bring To Front ของ DataGridView

จะว่าก็ว่า ขอบ่นตัวเองหน่อย -*-
นั่งทำ app เล่นๆตัวนึง ที่มันไม่ยาก กลับทำให้เป็นเรื่องยาก เนื่องจาก เอา Panel มาลง แล้วไปตั้งเป็น Dock Top
แล้วก็ลาก DataGridView มาตั้งเป็น Dock Fill ซึ่งตอนอาจารย์สุเทพ สอน ก็บอกว่าให้ Brint To Front
เพราะว่าไม่งั้นเนี่ยะ ตัวที่ลงไปก่อน มันจะลอยทับอยู่บน Layer ที่ลากไปทีหลัง ไอเราก้ลืม
พอถึงเวลาดึงข้อมูลไป Binding กับ ตัว DataGridView ปรากฏว่าข้อมูลไม่ปรากฏ ( มี อยู่ 2 Record ทำขึ้นมาเทสต์)
ปรกติถ้ามันไม่มีข้อมูลมันก็จะขึ้น Header Text ของ Column ขึ้นมา แต่นี่ไม่ขึ้นเลย โชว์แต่พื้นของ DGV ว่างๆเทาๆ
หากันเข้าไป 3 ชม นั่งไล่ตั้งแต่ Query ไปเทียบโค้ดของเก่ามา
พึ่งมาดูหน้า Design ทีหลัง เอ๊ะใจลองคลิ๊กๆ ที่พวก Control ก็ถึงบางอ้อ
Panel มันลอยทับอยู่บน Layer ของ DataGridView นี่หว่า ก็จัดการกับ DataGridview
ให้ Bring To Front ก็จบละ -*-

การเข้าถึง Object ระหว่างคลาสภาค 2

Form1 , ClassManageForm1 , Form2
เมื่อฟอร์ม 1 ให้ ClassManageForm1 เป็นตัวจัดการ Query ข้อมูล dataset มาสักอย่าง
หลักแห่งการจำ
1. คลาสที่จะขอเข้าไปใช้งานคอนโทรลนั้นต้อง
'--- ClassManageForm1
Public F1 as Form1
Public Sub LoadData()
....
..
.
End Sub
2. คลาสที่คอนโทรลโดนใช้งานต้อง
'--- Form 1
Public C as new ClassManageForm1
Public Sub New ()
C.F1 = Me
End Sub
เท่านี้ ClassManageForm1 ก็สามารถ Assign ค่าโดยตรงให้กับฟอร์มได้ ที่นี้มาดูส่วนเพิ่ม
ถ้าเกิดว่าฟอร์ม 2 จะเข้ามาใช้งาน Sub LoadData นั้น มันจะต้องเข้าผ่านทาง Form1
( วิธีอื่นทำแล้วไม่ผ่าน ใครรู้ช่วยบอกทีครับ )
ถ้าเรา ไป Dim C as new ClassManageForm1
แล้วใช้ C.LoadData ผ่านทางฟอร์ม 2 เพื่อที่ให้ ฟอร์ม 1 Refresh ข้อมูลแล้หล่ะก็
มันจะ Error ว่าเราไม่ New ก่อนใช้ ถ้าเราไป New ก่อนใช้ มันก็จะเป็นอีก Object นึงละ
มันจะไมใช่ Obj เดิม
อธิบายมาซะยาว ( ทบทวนความเข้าใจตัวเอง - -a ) วิธีการนั้นคือ
ตอนที่เราเปิดฟอร์ม 2 ขึ้นมาให้ส่ง Me เข้าไป
'--- Form 1 อนุญาต ให้ฟอร์ม 2 เข้ามาใช้ ก็ใช้หลักการ 3 ข้อข้างบน
'------ ฟอร์มที่ถูกอ้างอิงต้อง New แล้วส่ง Me
Public C as new ClassManageForm1 <<< ต้องเป็น Public เท่าน้นเพื้อให้ F2 เห็น
Public ( Private ก็ได้นะ ) F2 as Form2
Public Sub New ()
C.F1 = Me
End Sub
Private Sub OpenForm2() '-- ป้องกันการเปิดหน้าต่างซ้ำ
Dim f as form
Dim Main as Form MainPage << ผมทำเป็น Mdi MainPage คือ ฟอร์มแม่
For each f in Main.MdiChildren
If (TypeOf F is Form2) then
f.activate
exit sub
End if
Next
F2 = New Form2
F2.RefF1 = Me
F2.MdiParent = Main
F2.Show
'--------------------------------- อันนี้เรียบร้อย สำหรับฟอร์ม 1
'--- Form 2 ก็เข้าหลักการว่า ให้อ้างถึงฟอร์ม 1 และเป็น PUblic เท่านั้น
Public RefF1 as Form1
Private Sub AddData()
...
..
.
RefF1.C.LoadData() <<<<< เวลาเรียกใช้ให้ทำแบบนี้
ให้เข้าผ่าน Form1 แล้วค่อยเข้าไปใน ClassManageForm1 โดยผ่าน .
จบข่าว

Note กันลืม

1. การเชื่อมฟิลด์ ใช้เครื่องหมาย +''+ ฟิลด์ที่ต้องการเชื่อมแล้วตามด้วย as Alias
- select name+''+Lastname As YourName , tel from [User]
2. การทำ Splash Screen แบบ Transparent บนพื้นวินโดวส์ ควรทำบน Panel เพราะถ้าทำบนฟอร์มเลย bg จะไม่หาย
แม้จะเซ็ต TransparentKey แล้วก็ตาม
3. การเข้าถึง Object ซึ่งแม้ว่าจะมีบางฟอร์มส่ง ค่า me มาให้มันแล้วก็ตามหากเรา Dim New จากฟอร์มอื่น
และใน function ที่เราต้องการใช้มีการอ้างถึงฟอร์มอื่นด้วย ต้องส่งชื่อฟอร์มอื่นให้มันด้วย เพราะว่ามันเป็ฯคนละ obj กัน
4. ในการแสดงผลของ Icon หากเป็น Mdi ฟอร์ม จะมีปัญหาคือเปิดครั้งแรก ภาพ Icon จะแสดงรูปไม่ถูกต้อง
ต้องไปใส่ ตอน Run Time ของ Event Load โดย Add ภาพเข้าไปใน Resource ก่อน
'--- Form Load
Me.Icon = My.Resource.IconName
5. กด ปุ่ม enter แล้วเลื่อน focus ไปที่ control ในฟอร์มแทนปุ่ม tab โดยการเซ็ต Form ให้ KeyPreview = True ก่อนแล้ว
ไปทำ Event KeyDown
If e.KeyCode = Keys.Enter Then SendKeys.Send("{TAB}") End If
กับ อีกวิธีนึง โดยใช้ Form.GetNextControl ใช้กับ KeyCode เหมือนเดิม
If (e.KeyCode = Keys.Enter) Then Dim ctl As Control Do ctl = Me.GetNextControl(Me.ActiveControl, forward:=True) Loop Until (ctl.CanFocus) ctl.Focus() e.Handled = True '---- ไม่มีการส่งค่า e ไปที่ไหนอีก เพื่อจบการทำงาน End If 6. การจับ Event KeyPress
if (IsNumeric(e.KeyChar)) OrElse (e.KeyChar = Chr(8)) Then Else e.Handled = True
End If
End Sub
ขอบคุณ
อาจารย์ สุเทพ http://www.greatfriends.biz

การอ้างถึง ชื่อ dataset จะผิดพลาดไม่ได้แม้แต่ช่องว่าง

สงสัยจริงๆว่า ทำไมเรา Search หาข้อมูลไม่เจอ ทำไม Datagrid View ไม่เอาข้อมูลใน Dataset มาโชว์
ไล่ไปไล่มาจนถึงบางอ้อ ในส่วนของ Dal นั้น ผมอ้างเป็น
Dim da as new SqlDataAdpter
Dim ds As new Dataset
da.Fill(ds, " SearchData ") <--- สังเกตุได้ว่า มีเว้นวรรคหน้าหลังในเครื่องหมาย Double Quote
Return ds
แต่พอเวลาไปเรียกใช้
Dim dsSearch as Dataset
Me.dgvShow.datasource = ds.Tables("SearchData") <--- ไม่มีวรรค
เวลากด Search ปั๊ป หายยกแผง เห่อะๆ
ทีหลังอ้างชื่อให้เหมือนทุกตัวและตำแหน่งดีที่สุด

การเข้าถึง Control ของอีก คลาสนึง

กตัวอย่างฟอร์มแม่กับฟอร์มลูกละกัน อย่างฟอร์มแม่ มี Status Bar เพื่อแจ้ง UserAccount ด้านล่าง
หลังจากที่ User LogIn ( หน้าฟอร์มลูก ) เสร็จ ก็จะเอา UserName เนี่ยะ ไปใส่ไว้ใน Status Bar
ทีนี้การเข้าถึง Control ของฟอร์มแม่ก็ทำได้ดังนี้ คือเราต้อง ใช้ตัวแปร Ref
'---Fomแม่ ชื่อว่า MainForm
Dim LoginPage as New Login
LoginPage.Form1 = me '<--- ส่ง Me เข้าไปให้ตัวแปรที่ Ref ถึง form แม่
LoginPage.ShowDialog()
'---Form Login ชื่อว่า Login
Public Form1 as MainForm '<--- Ref ไปถึง ฟอร์แม่
private sub btnok_click....
dim dal as new DalUser '<--- ประกาศ Object ของฐานข้อมูล
Dim HasAccount as boolean
HasAccount = Dal.CheckLogin(me.txtusername.text, me.txtpassword.text) '--- คืนค่าเป็น boolean
if HasAccount Then
Form1.StaShowUserName.text = me.txtUserName.text '--- อ้างถึง Cotrol ในฟอร์มแม่
me.dispose()
else
messagebox.show(" ไม่พบ Account ดังกล่าวกรุณาตรวจสอบ" ,"Error")
end if
end sub
เรียบร้อยครับ หรือ อาจจะคืนค่ามาเป็น String โดยเอา User ใน ฐานข้อมูลมาก็ได้ หรือถ้าไม่อ้างถึงแบบนี้ก็ไปทำเป็น Module ก็ได้ครับ
Special Thanks
อาจารย์สุเทพ

Splash Screen แบบ Transparent บนพื้น Window

พิ่มเติมอีกนิดสำหรับการทำ Splash Screen พอได้ได้คุณ มาโคโปโล แห่ง บอร์ด GF ได้ช่วยกรุณาตอบว่า การทำ Splash Screen แบบ Transpent นั้ต้องไปกำหนดว่า ให้กำหนด Property ของ Form ที่ชื่อว่า TransparencyKey ให้เป็น สีเดียวกับ Background แล้วมันก็จะ mask ส่วนที่เป็น Background ออกไป ผมก็ลองไปนั่งๆทำ ปรากฏว่าผมเซ็ต ใน หน้าของ Form Design แล้วไม่ได้ Splash Screen หายไปท้งหน้าเลย - -" เลยเปลี่ยนเป็น code ได้ดังนี้ :: me.transparencyKey = me.backcolor ปรากฏว่าเรียบร้อย รันได้แล้วครับ Many Thanks www.greatfriends.biz Special Thanks คุณ มาโคโปโล

มาทำ splash Screen อย่างง่ายๆ

วันนี้เปิด Program Photoshop 7.0 มันจะมี screen แว๊บหนึ่งขึ้นมาก่อนที่จะเข้าโปรแกรม
ทีแรกไม่รู้หรอกเขาเรียกอะไร ก็ไป search หาคำว่า Screen ใน Gf มี แต่ไม่ใช่ แต่ก็ใกล้เคียง
เลยไปถามพี่เหมี่ยว เลยได้มาว่า มันเรียกว่า Splash Screen นั่นเอง
เริ่มแรกก็ไปสร้าง WindowForm ขึ้นมา 1 ตัว กำหนด Form Border Style เป็น None
ไปกดหนด Start Position เป็น CenterParent ( ผมทำใน Mdi Form ) เสร้จแล้วก็เอาภาพที่ตกแต่ง
มาใส่ในฟอร์ม แล้วก็โค้ดดังนี้
'--- FormLoad
For i As Double = 0.5 To 1.0 Step 0.1

My.Application.DoEvents() '--- มันจะแทรกคิวตัว me.Opacity เข้าไปเพื่อให้ Main Thread วาด Me.Opacity ก่อน

Me.Opacity = i '--- ในหน้า Design มันจะเป็น % พอโค้ดมันเป็น Double สูงสุดที่ 1.0 แปลงมาจาก % นั่นเองครับ

Nex

System.Threading.Thread.Sleep(5000) '--- เมื่อความชัด 100 % ให้อึ้งไป 5 วิ

For j As Double = 1.0 To 0.0 Step -0.05 '--- มาถึงการ Fade Out ออก ให้วิ่งทีละ 0.05

My.Application.DoEvents()

Me.Opacity = j

Next

Me.Close() '--- ปิดฟอร์มซ้า

พอเสร็จจากหน้า Splash Screen แล้วเรามาทำที่หน้า Main ( ของผมคือ ฟอร์มแม่ ( Parent ) นั่นเอง เพระผมทำเป็น Mdi ฟอร์ม )

'--- ฟอร์มแม่ Events Load

Me.Visible = False '--- ให้ซ่อนฟอร์มแม่ไว้ก่อน ตัว Splash Screen จะได้ไปโลดแล่นอยู่บนพื้น Window แทน ( ดูดีมีระดับ )

Dim a As New Screen '--- เรียกใช้งาน

a.ShowDialog() '--- แสดงผล ถึงตอนนี้มันก็ไปทำงานใน Event Load ของ Splash Screen จด มัน ปิดตัวเองไป

My.Application.DoEvents() '--- แทรก คิวให้ แสดงฟอร์มแม่ขึ้นมา

Me.Visible = True

OpenLogin() '--- อันนี้ผมให้ไป Call Method Login เป็นรายการต่อไป

--------------------

F5 ทดสอบ ซะ ทีนี้ว่าใครจะปรับให้หน่วงช้า หน่วงเร็ว ก็ไปปรับตรง Thread.Sleep ซะ หน่วยมันจะเป็น มิลลินะครับ

ส่วนความเร็วในการ Fade ก็แก้กันตามใจชอบเลยครับ ตรง Step ของ For Next

หวังว่า เป็นอีก 1 หนทางในการทำ Splash Screen ได้นะครับ ( มันสามารถทำได้หลายแบบฮับ )

Many Thanks.

www.greatfriends.biz www.codeProject.com

Special Thanks.

พี่เหมี่ยว

ทำความเข้าใจ sql กันสักหน่อย ( โง่มานาน )

หลังจากเอา Sql 2005 Express มาลง ( ทันสมัยแร้วว ) ก้ไปสร้าง Table พอมาถึง Type ของ ข้อมูล ก็นึกสงสัย ( จริงเคยอ่านเจอมาแล้ว แต่ลืมไปหมดแล้ว ) ความแตกต่างระหว่าง Char กับ NChar , Varchar กับ NVarchar ( ไม่มี N กับ มี N ) ก็ไปหาข้อมูลในเน็ต แล้วก็ไปถามพี่ที่เป็นเจ้าของเว็บ http://www.thaisql.com ( ขอบคุณมากครับ ) a ได้ใจความมาว่า Char , Varchar คือการเก็บเป็นตัวอักษร NChar , NVarchar คือการเก็บเป็น Unicode และใช้ 2 Byte ในการเก็บค่า www.thaisql.com said: N แปลว่าใช้ 2Byte เก็บค่านะครับ ปกติจะใช้ 1 Byte 1 ตัวอักษร แต่ถ้า N นำหน้าใช้ 2 Byte 1 ตัวอักษร ก็จะเป็นพวก ภาษาแปลกเช่น เยอรมัน นะครับ บ.ผมต้องเก็บเยอรมัน ผมเลยต้องใช้ N ช่วยนะครับ แต่โดยทั่วไป แค่ไทย กับ อังกฤษ ไม่ใช้ N ก็ได้สบายเลยนะครับ แต่เวลาค้นหาข้อมูลก็ต้อใช้ N นำหน้าด้วยนะครับ select * from firstname = N'xxx' Unicode ในปัจจุบันมีตัวอักษรให้เลือกใช้อยู่หลายแบบ มี Character set อยู่มากมาย เช่น ตัวอักษรภาษาไทย, ตัวอักษรภาษาญี่ปุ่น ฯลฯ ในอดีตเวลาที่เรา Encode ภาษา ถ้าเป็น ASCII ขนาด 1 byte จะมี 8 bit ซึ่ง ASCII code ก็คือพวกที่เก็บตัวอักษรภาษาอังกฤษตัวเล็ก, ตัวใหญ่, ตัวเลข, เครื่องหมายมากกว่า, น้อยกว่า, ไม่เท่ากับ, full stop, # เป็นต้น ใช้พื้นที่แค่ 7 bit ก็สามารถ Encode ข้อมูลของได้ครบแล้ว ส่วน bit ที่ 8 นี่ก็ใส่ 0 ลงไป แต่ในประเทศที่ไม่ได้ใช้ตัวอักษรภาษาอังกฤษในการเขียน ก็อยากจะมีรหัสในการเขียนตัวอักษรเป็นของตัวเองเหมือนกัน ดังนั้นแล้วในการแก้ปัญหา ก็คือ จะเอา bit ที่ 8 มาใช้ เช่น ตั้ง bit ที่ 8 เป็น 1 แล้วก็ Encode ข้างในด้วยรหัสของตัวเอง แต่ต้องเป็นรหัสที่ ASCII code ยังไม่ได้ใช้ เช่น 1000011 เป็น ‘ก’, 1000012 เป็น ‘ข’, 1000013 เป็น ‘ค’ เป็นต้น วิธีการเช่นนี้ทำให้เราสามารถเก็บได้ 2 ภาษา แต่ว่าการทำแบบนี้ไม่ international เพราะว่า ภาษาจีนหรือภาษาญี่ปุ่นก็ใช้แบบเดียวกัน ก็เอา bit ที่ 8 มาใช้ เพราะฉะนั้นแล้ว ตัว ‘ก’ ของภาษาไทยก็จะไปมีรหัสเหมือนกับตัวอะไรซักอย่างในภาษาจีน ดังนั้นก็เลยมีปัญหาว่าถ้าเราต้องการทำ international business จริงๆ ควรจะมีรหัสเดียวสำหรับอักษรตัวเดียว และในแต่ละภาษาก็ไม่ควรมีรหัสซ้ำกัน ดังนั้นเราก็เลยมี Unicode ขึ้นมา Unicode ต่างจาก ASCII คือ ASCII เก็บ byte เดียว แต่ Unicode เก็บ 2 byte ซึ่งข้อมูล 2 byte เก็บข้อมูลได้มากมายมหาศาล สามารถเก็บข้อมูลได้มากมายหลายภาษาในโลก อย่างภาษาไทยก็อยู่ใน Unicode นี้ด้วยเหมือนกัน ดังนั้นรหัสภาษาไทยเอาไปเปิดในภาษาจีน ก็ยังเป็นภาษาไทยอยู่ ไม่ออกมาเป็นภาษาจีน เพราะว่ามี code ตายตัวอยู่ว่า code นี้จองไว้สำหรับภาษาไทย แล้ว code ตรงช่วงนี้เป็นภาษาจีน ตรงนี้เป็นภาษาญี่ปุ่น จะไม่ใช้ที่ซ้ำกัน เป็นต้น ส่วน Unicode เป็นชุดอักษรที่ใช้ได้สำหรับทุกภาษาในโลก ซึ่งจะเป็นระบบ 1 อักษรใช้หลาย byte ถ้าใช้ Unicode ที่เข้ารหัสแบบ UTF-8 ภาษาไทยจะใช้ 3 byte ครับ Many Thanks : www.thaisql.com for Instruction http://www.expert2you.com/article1/2888/index.htm?page_no=1 for Unicode

เมื่อทำ ClickOnce แล้ว พอไปลงเครื่องลูกแล้วมีปัญหา ADODB

หลังจากที่ทำโปรเจ็คที่ 2 มานานแสนนาน - -" ก็จะมาทดสอบทำการ เซ็ตอัพแบบ Click Once สักหน่อย
ก็ทำๆ ok publish ได้เป็นปรกติครับ
( ท่านสามารถไปดูการ ทำ Click Once ที่คุณ KSM ได้ตอบไว้ในบอร์ด GF ตามนี้ครับ http://greatfriends.biz?22612 )
แต่พอไปรันเพื่อที่จะลงโปรแกรมที่เครื่องลูกนั้น ปรากฏว่าเจอ Dialog Box แบบในภาพที่ 1 ครับ
เอาหล่ะสิตู จะทำยังไงดี เพิ่งทำครั้งแรกด้วย เราทำอะไรผิดพลาดไป ???
ผมก็ไปหาว่าผมลืมติ๊กอะไรใน ปุ่ม PreRequisites หรือเปล่า ก็ไปติ๊กๆ ข้างในมัว่ไปหมด ทำยังไงก็ทำไม่ได้
ก็เลยไป search ในบอร์ด Gf อีกครั้ง ก็ไปเจอกับคนอาการเดียวกัน http://greatfriends.biz?15859 ตรง คหที่ 8 นะครับ
อาจารย์สุเทพ ก็บอกว่าให้ไปลง Microsoft Data Access Component ( MDAC ) ผมก็ไปหามาลง 2.7 , 2.8 ก็ยังไม่ได้เหมือนเดิม
ในช่วงเวลาที่แก้ปัญหา ก็ได้ไปรบกวน ( ให้เขาช่วยแหล่ะ พูดให้ดูดี เอิ๊กๆ ) คุณ ksm , พี่เหมี่ยว , คุณ Nine เกี่ยวกับเรื่องดังกล่าว
ผมเอ็งก็ search หา ใน google เกี่ยวกับปัญหานี้เหมือนกัน แต่เจอแล้วอ่านไม่เข้าใจเลย เพราะว่าเขาให้ใส่โค้ดอะไรก็ไม่รู้ ( แล้วใส่ตรงไหนฟระ )
จนกระทั้งพี่เหมี่ยวได้ส่งลิงค์มาให้ตัวนึงครับ http://yoopergeek.blogspot.com/2006/03/problem-during-clickonce-deployment.html
ตามรูปเลยครับ เหอๆ คือว่า ให้เราไปกดปุ่มตรง Application Files ไปแล้วตรงบรรทัด ADODB.dll เลือกตรง
publish Status ให้มันเป็น Include ซะ ( ของเดิมผมเป็น Prerequisite(Auto) ) แล้วตรง Download Group ก็ปล่อยเป็น Required ไปครับ
เท่านี้ก็ ok แล้วก็ publich ไปใหม่ ก้เรียบร้อยแล้วครับ
นั่นไง Program ผมรันขึ้นมาแร้ววว หุๆ
Many Thanks .
คุณกิต (KSM)
คุณ Nine
Special Thanks.
พี่เหมี่ยว (MM)

เพิ่มแถวแรกให้กับ ComboBox เมื่อ Binding กับ Dataset

วันนี้กำลังนั่งทำ โปรแกรมอยู่ ก็ทำ ComboBox ให้ดึงข้อมูลมาจาก Dataset แต่ก็ประสบปัญหาคือ
ในการ Binding ข้อมูลมาใช้งานนั้น ตัว Dataset ก็จะทำการ แสดง Record แรกออกมาโชว์เลย
ซึ่งในบางครั้ง ข้อมูล ( Control นั้นๆ ) ยังไม่จำเป็นต้องมีข้อมูลในตอนนั้น ก็ไม่สามารถทำได้ เพระมันมีข้อมูลหมด
ด้วยความอ่อนชั้นเชิงในการเขียน ผมได้ไปปรึกษาคุณ KSM แห่งบอร์ด GF
ได้แนะนำโค้ด มาคือ
combobox1.selectedIndex= -1
ปรกติ รายการ ใน ComboBox จะ Index เริ่มต้นที่ 0 ( มันเป็น ArrayList )
แต่เมื่อลองใช้งานจริง ในกรณีที่ User กดเลือกรายการอื่นไปแล้ว แล้วกลับมาแก้ไข ตัวค่าว่างนั้นจะหายไป ( เพราะมันไม่มีอยู่จริง )
จากนั้นผมก็ไปหาข้อมูลใน GF อีกครั้ง จนไปติดใจเรื่องของการเคลียร์ค่า ComboBox ว่า เคลียร์ค่านั้น ไปเคลียร์ที่ DataTable
ก็เลยลองนั่งทำ ปรึกษา พี่เหมี่ยว ( MM ) ใน GF แก้ มั่ว ก็ได้โค้ดนี้มาครับ
dsCustomer.Tables("Customer").Rows.Add.Item("NameCust") = "--- Test ---"
ปรากฏว่า รายการเพิ่มครับ แต่ว่ามันไปเพิ่ม บรรทัด สุดท้าย (เพราะมัน ADD นั้นเอง )
เลยนำไปถาม ในบอร์ด GF อีกรอบ ก็ได้ อาจาร์ย สุเทพ แนะนำ ให้ลองดู InsertAt (แปลตรงตัวว่า แทรกที่ )
เลยได้เว็บอ้างอิงที่ http://www.dotnet247.com/247reference/msgs/15/78855.aspx
ในเรื่องของการใช้ InsertAt
เลยสำเร็จมาเป็นโค้ด Dim drow As DataRow drow = dsCustomer.Tables("Customer").NewRow() drow("NameCust") = " - - - โปรดเลือก - - - " dsCustomer.Tables("Customer").Rows.InsertAt(drow, 0)
comboBox1.selectedIndex = 0 '--- ใส่ตัวนี้ไปเพื่อที่ว่า ค่าแรกที่แสดงใน ComboBox จะไปชี้ที่ โปรดเลือก

ก็ปรากกฏข้อมูลอย่างที่ผมต้องการ โดย SeletedValue มันค่า Nothing เพราะผมไม่ได้ทำการใส่ค่าไปด้วย เป็นอย่างที่ผมต้องการ ใครติดปัญหาตรงนี้ลองเอาไปประยุกต์ใช้ดูนะครับ Many Thanks.

GF Board อาจารย์สุเทพ คุณ NINE พี่ เหมี่ยว ( MM ) คุณ กิต ( KSM )

เปลี่ยนสี Background ใน DataGridView เมื่อเราเอาเมาส์ไปคลิ๊กที่แถวนั้น

ในการเปลี่ยนสีพื้นหลัง ( BackGround ) ของแถวที่เราคลิ๊กเลือก ใน DataGridView นั้น
ผมใช้ Events 2 ตัว คือ
1. CellMouseClick เป็น Events ที่ใช้เลือก Cell นั้นๆ
2. RowLeave เป็น Events ที่เราออกจากแถวปัจจุบัน
จุดประสงค์ ผมต้องการให้ เอาเมาส์คลิ๊กที่ Cell ใน DataGridView แล้วแถวนั้นเปลี่ยนสี BackGround ไปตามที่เราเซ็ตไว้
ก็เพื่อที่ว่าในกรณีที่งานของ User เยอะๆ หรือ จำนวนคอลัมน์ที่ DataGridView เยอะ เลื่อนไปดูคอลัมน์หลังๆ ลำบาก
ก็ลองใช้ตัวนี้เอาไปแก้ปัญหาดูครับ ( เป็นอีกวิธีนึงน่าจะช่วยได้ )
อันดับแรก ใช้ Events CellMouseClick ก่อน

Private Sub dgvMyPets_CellMouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvMyPets.CellMouseClick If e.RowIndex = dgvMyPets.Rows.Count - 1 OrElse e.RowIndex = -1 Then Exit Sub With dgvMyPets .Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.LightBlue '--- เมื่อคลิ๊กไปที่ Cell นั้นๆแล้วจะทำการเปลี่ยนสี Background ของแถวนั้นให้เป็นสี LightBlue End With End Sub ต่อมาเราก็มาทำ Events ที่เวลาเราคลิ๊กที่ Cell อื่น ที่ไม่ใช่แถวนั้นแล้ว สี BackGround จากแถวที่เราเคยเลือกไว้ มันต้องกลับเป็นสีขาว

เรามาใช้ Events LeaveRow

Private Sub dgvMyPets_RowLeave(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvMyPets.RowLeave

If e.RowIndex = dgvMyPets.Rows.Count - 1 OrElse e.RowIndex = -1 Then Exit Sub

With dgvMyPets .Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.White '--- ออกจากโรว์ให้สีพื้นแถวน้นเป็นสีขาว End With

End Sub

Use Server.Mappath In Class File.

The first thing you must import namespace as below. using System.Web; And you can use them such as: HttpContext.Current.Server.MapPath("myPath"); this function Server.MapPath() will return string result.

วันศุกร์ที่ 11 มกราคม พ.ศ. 2551

Begin with JavaScript

Now I'm return to Web Applications again and this JavaScript for beginner (I'm already forget them). Window.Open function :: Exam.1 Block Code script type="text/javascript" // Format in XHTML 1.0 funciton newWindow(id) { myWidow=window.open('myPage.aspx?id='+id, 'TitleName', 'height=100,width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, directories=no, status=no'); myWindow.moveTo(0,0) // X, Y Postions } // Use JavaScript above : a href="#" onclick="javascript: newWindow(Parameter)" Exam 2. Inline Code a href="#" onclick="window.open('ShowWallPaper.aspx?id=(Parameter)', 'WallPaper', 'top=0,resizable=yes,directories=no,scrollbars=yes,width=600,height=400')" Try to understand about some features of Window.Open Method. - yes,no = 1,0 (same meaning) location : Address Bar. resizable : Deny or allow user to resize new window. status : Show the status bar on the bottom of window. directories : The standard browser directory buttons, such as What's New and What's Cool ( I don't know that it shows where ?? ) And also it can support keyword "top=0" for hide menubar and menubar such as :: myWidow=window.open('myPage.aspx?id='+id, 'TitleName','top=0'); I try to train English language. I think English language so hard for me :-\