วันพุธที่ 16 มกราคม พ.ศ. 2551
Why JavaScript Topic can't be displayed ?
วันอังคารที่ 15 มกราคม พ.ศ. 2551
Sequence Css Block with A tag
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
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 พอใช้เสร็จต้องจัดการอะไรกับตัวแปรนั้นๆ ไหมครับ
ตอบ
การใช้ 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 จะเขียนยังไงดีครับ
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
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 |
![]() | surrealist
ขอขอบคุณ อาจารย์ครับ |
Datarelation กับ Dataset Read Xml
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
การเข้าถึง Object ระหว่างคลาสภาค 2
Note กันลืม
การอ้างถึง ชื่อ dataset จะผิดพลาดไม่ได้แม้แต่ช่องว่าง

การเข้าถึง Control ของอีก คลาสนึง
Splash Screen แบบ Transparent บนพื้น Window
มาทำ splash Screen อย่างง่ายๆ
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 กันสักหน่อย ( โง่มานาน )
เมื่อทำ ClickOnce แล้ว พอไปลงเครื่องลูกแล้วมีปัญหา ADODB
เพิ่มแถวแรกให้กับ ComboBox เมื่อ Binding กับ Dataset

ก็ปรากกฏข้อมูลอย่างที่ผมต้องการ โดย SeletedValue มันค่า Nothing เพราะผมไม่ได้ทำการใส่ค่าไปด้วย เป็นอย่างที่ผมต้องการ ใครติดปัญหาตรงนี้ลองเอาไปประยุกต์ใช้ดูนะครับ Many Thanks.
GF Board อาจารย์สุเทพ คุณ NINE พี่ เหมี่ยว ( MM ) คุณ กิต ( KSM )เปลี่ยนสี Background ใน DataGridView เมื่อเราเอาเมาส์ไปคลิ๊กที่แถวนั้น
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