|
|
|
งง ครับ แก้มา15วันทำไมไม่ได้ ช่วยด้วยครับ datetimepicker ทำให้binding text ไม่ได้(หลังจากกรองข้อมูล) |
|
|
|
|
|
|
|
โปรแกรมทำงานได้ครับ แต่เวลากดกรองข้อมูล ปรากฏว่า ข้อมูลที่binding กับtextbox ทุกตัวหายหมด (ลองตรวจสอบดูค่าของข้อมูล ใน datatable กรองได้ปรกติครับ) ปัญหาอยู่ที่ datetimepicker ครับเพราะลอง ไม่binding object :Bdatetimepicker1 กรองข้อมูลได้ปรกติครับ...งงมาก...โค๊ดครับ
ใครช่วยแก้ด้วยครับ มือใหม่ครับ
Code (VB.NET)
'เชื่อมต่อกับฐานข้อมูล MS_Piyaphum6.mdb ด้วยคลาส OleDbConnection
'ในที่นี้จะเก็บไฟล์ MS_Piyaphum6.mdb ไว้ที่พาธD:\MS_Piyaphum6 Soft\MS_Piyaphum6.mdb ซึ่งสามารถแก้ไขได้ใหม่ตามต้องการ
' Dim dbConn As OleDbConnection = New OleDbConnection( _
' "Provider=Microsoft.Jet.OLEDB.4.0; " & _
' "Data Source=D:\MS_Piyaphum6 Soft\MS_Piyaphum6.mdb")
'เลือกข้อมูลจากเทเบิล Contacts ด้วยคลาส OleDbDataAdapter เพื่อนำมาสร้าง dataset
'Dim dapter As OleDbDataAdapter = New OleDbDataAdapter( _
' "SELECT * FROM Contacts", dbconn) 'ไม่ใช้ไปสร้างที่formเพราะอยู่นี้ทำงานไม่ได้
'ประกาศตัวแปรแทนออบเจ็คหรือ Instance จากคลาส OleDbCommandBuilder
Dim cmdBuilder As OleDbCommandBuilder
'Dim dtSet As DataSet = New DataSet 'ประกาศตัวแปรแทนออบเจ็คหรือ Instance จากคลาส DataSet ไม่ใช้ไปสร้างที่formเพราะอยู่นี้ทำงานไม่ได้
Dim dtTable As DataTable 'ประกาศตัวแปรแทนออบเจ็คหรือ Instance จากคลาส DataTable
Dim objCurrencyMgr As CurrencyManager 'ประกาศตัวแปรแทนออบเจ็คหรือ Instance จากคลาส CurrencyManager
Dim currRecPos As Integer 'ประกาศตัวแปรเก็บตำแหน่งเรคอร์ดปัจจุบัน
'ประกาศตัวแปรแสดงโหมดการทำงาน ถ้าอยู่ในโหมดเพิ่มเรคอร์ดจะมีค่าเป็น True ถ้าอยู่ในโหมดแก้ไขจะมีค่าเป็น False
Dim addNewMode, editmode, savemode As Boolean
Dim fdName As String 'ประกาศตัวแปรเก็บชื่อฟีลด์ในเทเบิล Contacts
'Event Procedure เมื่อฟอร์มถูกโหลด
Private Sub frmMain_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
dtAdapter.Fill(dtSet, "contacts") 'นำข้อมูลที่เลือกจากเทเบิล Contacts มาไว้ที่ dataset
dtTable = dtSet.Tables("contacts") 'ให้ตัวแปร dtTable แทนข้อมูลชุดแรกใน dataset ในที่นี้คือข้อมูลจากเทเบิล Contacts
'สร้างคำสั่ง InsertCommand, UpdateCommand และ DeleteCommand เพื่อใช้จัดการข้อมูลใน dataset
cmdBuilder = New OleDbCommandBuilder(dtAdapter)
EnabledReadWrite()
objCurrencyMgr = CType(Me.BindingContext(dtSet, "contacts"), CurrencyManager) 'ให้ objCurrencyMgr แทนการทำงานร่วมกับ datatable,
txtFName.DataBindings.Add("Text", dtSet, "contacts.Name")
txtLName.DataBindings.Add(New Binding("Text", dtSet, "contacts.Surname"))
txtAddr1.DataBindings.Add(New Binding("Text", dtSet, "contacts.Add1"))
txtAddr2.DataBindings.Add(New Binding("Text", dtSet, "contacts.Add2"))
txtDist.DataBindings.Add(New Binding("Text", dtSet, "contacts.District"))
txtCity.DataBindings.Add(New Binding("Text", dtSet, "contacts.Province"))
txtPosCode.DataBindings.Add(New Binding("Text", dtSet, "contacts.Postcal"))
txtPhone.DataBindings.Add(New Binding("Text", dtSet, "contacts.Tel"))
txtFax.DataBindings.Add(New Binding("Text", dtSet, "contacts.fax"))
txtmobile1.DataBindings.Add(New Binding("Text", dtSet, "contacts.mobile1"))
txtmobile2.DataBindings.Add(New Binding("Text", dtSet, "contacts.mobile2"))
txtoffice_tel.DataBindings.Add(New Binding("Text", dtSet, "contacts.Office_Tel"))
TxtRef.DataBindings.Add(New Binding("Text", dtSet, "contacts.refer"))
txtEmail.DataBindings.Add(New Binding("Text", dtSet, "contacts.email"))
txttittle.DataBindings.Add(New Binding("Text", dtSet, "contacts.Tittle")) '**************
TxtNickname.DataBindings.Add(New Binding("Text", dtSet, "contacts.Nickname"))
SexStatusShow(sender, e) 'เบียนเพิ่มเติมกำลังทดสอบ************
Dim datecolumn As New DataColumn("contacts.Birthdate")
datecolumn.AllowDBNull = True
datecolumn.DataType = GetType(System.DateTime)
BDatePicker1.DataBindings.Add(New Binding("value", dtSet, "contacts.Birthdate")) '****ปัญหาอยู่ที่ตรงนี้ถ้าbinding จะไม่สามารถกรองข้อมูลได้
'(ตอนโหลดฟอร์มจะสามารถbindได้แต่กรองไม่ได้) -ข้อมูลตัวอื่นเพี้ยนด้วย
AdjustPosition(sender, e) 'แสดงตำแหน่งเรคอร์ดปัจจุบัน (เรคอร์ดที่กำลังแสดงข้อมูลบนฟอร์ม)
'ให้โปรแกรมย่อย AdjustPosition ทำงาน เมื่อตัวชี้ตำแหน่งเรคอร์ดใน datatable เปลี่ยนไป
AddHandler objCurrencyMgr.PositionChanged, AddressOf AdjustPosition
'ให้โปรแกรมย่อย AdjustPosition ทำงาน เมื่อคลิกปุ่ม Delete
AddHandler btnDelete.Click, AddressOf AdjustPosition
'ให้โปรแกรมย่อย AdjustPosition ทำงาน เมื่อคลิกปุ่ม Cancel
AddHandler btnCancel.Click, AddressOf AdjustPosition
'ให้โปรแกรมย่อย AdjustPosition ทำงาน เมื่อคลิกปุ่ม Find
AddHandler btnFind.Click, AddressOf AdjustPosition
'ให้โปรแกรมย่อย AdjustPosition ทำงาน เมื่อคลิกปุ่ม Filter
AddHandler btnFilter.Click, AddressOf AdjustPosition
DisabledReadWrite() 'ให้เท็กซ์บ็อกซ์ทั้งหมดแสดงข้อมูลแบบอ่านได้อย่างเดียว
End Sub
Private Sub DTformatter(ByVal sender As System.Object, ByVal e As ConvertEventArgs)
Dim b As Binding = CType(sender, Binding)
If Not e.DesiredType Is GetType(DateTime) Then
Return
End If
If e.Value.GetType Is GetType(System.DBNull) Then
e.Value = CType("1/1/1800", System.DateTime)
End If
End Sub
Private Sub DTParser(ByVal sender As System.Object, ByVal e As ConvertEventArgs)
If Not e.DesiredType Is GetType(DateTime) Then
Return
End If
If Not e.Value.GetType Is GetType(DateTime) Then
Return
End If
Dim value As String = CType(e.Value, String)
If value.Equals("1/1/1800") Then
e.Value = System.DBNull.Value
End If
End Sub
Public Sub objclearbind(ByVal sender As System.Object, ByVal e As System.EventArgs)
txtFName.DataBindings.Clear()
txtLName.DataBindings.Clear()
txtAddr1.DataBindings.Clear()
txtAddr2.DataBindings.Clear()
txtDist.DataBindings.Clear()
txtCity.DataBindings.Clear()
txtPosCode.DataBindings.Clear()
txtPhone.DataBindings.Clear()
txtFax.DataBindings.Clear()
txtmobile1.DataBindings.Clear()
txtmobile2.DataBindings.Clear()
txtoffice_tel.DataBindings.Clear()
TxtRef.DataBindings.Clear()
txtEmail.DataBindings.Clear()
txttittle.DataBindings.Clear() '**************
TxtNickname.DataBindings.Clear()
BDatePicker1.DataBindings.Clear()
End Sub
'Event Procedure เมื่อคลิกปุ่มไอคอนกรองข้อมูล
Private Sub btnFilter_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFilter.Click
If addNewMode Then
Exit Sub 'ถ้าอยู่ในโหมดการเพิ่มเรคอร์ดให้ออกจาก Procedure นี้
ElseIf txtSearch.Text <> "" Then 'ถ้าอยู่ในโหมดแก้ไขเรคอร์ดและป้อนข้อมูลในช่อง "ค้นหา/กรองข้อมูล"
' ให้เลือกข้อมูลจากเทเบิล Contactsที่ตรงกับข้อมูลที่ต้องการกรอง********
Dim queryString, txt As String
queryString = "SELECT * FROM Contacts WHERE " & fdName & " LIKE ?"
Dim dtAdapter2 As OleDbDataAdapter = New OleDbDataAdapter
Dim selectCMD As OleDbCommand = New OleDbCommand(queryString, dbconn)
dtAdapter2.SelectCommand = selectCMD
Dim Keyword As String = "%" & Trim(txtSearch.Text) & "%"
Select Case fdName
Case "Name"
selectCMD.Parameters.Add("@Name", OleDb.OleDbType.VarWChar, 20).Value = Keyword
Case "Surname"
selectCMD.Parameters.Add("@SurName", OleDb.OleDbType.VarChar, 20).Value = Keyword
Case "District"
selectCMD.Parameters.Add("@District", OleDb.OleDbType.Char, 10).Value = Keyword
Case "Province"
selectCMD.Parameters.Add("@Province", OleDb.OleDbType.Char, 20).Value = Keyword
Case "Postcal"
selectCMD.Parameters.Add("@Postcal", OleDb.OleDbType.Char, 10).Value = Keyword
Case "Tel"
selectCMD.Parameters.Add(" @Tel", OleDb.OleDbType.Char, 15).Value = Keyword 'ผลเหมือนกับเขียนแบบcaseTel,email
Case "email"
dtAdapter2.SelectCommand.Parameters.Add(" @Email", OleDb.OleDbType.Char, 25)
dtAdapter2.SelectCommand.Parameters("@Email").Value = Keyword
End Select
Try
dtSet.Clear()
dtTable.Clear()
dtAdapter2.Fill(dtSet, "contacts") 'นำข้อมูลที่กรองจากเทเบิล Contacts มาไว้ที่ dataset**สำคัญต้องใส่ชือTable contactsด้วยมิฉนัน้จะไม่กรองข้อมูล
dtTable = dtSet.Tables("contacts") 'ให้ตัวแปร dtTable แทนข้อมูลที่ได้จากการกรอง
objCurrencyMgr = CType(Me.BindingContext(dtSet, "contacts"), CurrencyManager) 'ให้ objCurrencyMgr แทนการทำงานร่วมกับ datatable,
Dim datecolumn As New DataColumn("contacts.Birthdate")
datecolumn.AllowDBNull = True
'ถ้าเป็น datatable ว่าง แสดงข้อความบอกให้ทราบ
If dtTable.Rows.Count = 0 Then MessageBox.Show("ไม่พบข้อมูลที่ต้องการ ! ", "ผลการกรอง", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
Dim Bdatebind As New Binding("value", dtSet, "contacts.Birthdate")
AddHandler Bdatebind.Format, AddressOf DTformatter
AddHandler Bdatebind.Parse, AddressOf DTParser
objclearbind(sender, e)
BDatePicker1.DataBindings.Add(Bdatebind)
SexStatusShow(sender, e)
txttittle.DataBindings.Add(New Binding("Text", dtSet, "contacts.Tittle")) '**************
Catch er As Exception
Picture.Image = Nothing
MessageBox.Show(er.Message() & vbCrLf & er.StackTrace)
Finally
Dim c = objCurrencyMgr.Position 'ทดสอบค่าว่า objcurrencymgr ใช้ได้ครับ
MessageBox.Show(txtFName.Text, "Warnning!", MessageBoxButtons.OK, MessageBoxIcon.Information) 'พบว่าtxtfirstname ในformไม่มีค่าที่binding
MessageBox.Show(c, "Warnning!", MessageBoxButtons.OK, MessageBoxIcon.Information) 'ทดสอบค่าว่า objcurrencymgr ใช้ได้ครับ
txt = dtTable.Rows(c).Item("name")
MessageBox.Show(txt, "Warnning!", MessageBoxButtons.OK, MessageBoxIcon.Information) 'ทดสอบค่าว่า ในdataset,datable มีค่า ใช้ได้ครับ
btnSave.Enabled = False
btnAdd.Enabled = False
btnDelete.Enabled = False
btnEdit.Enabled = False
btnCancel.Enabled = False
btnFind.Enabled = False
End Try
End If
End Sub
รูปภาพform ครับ
รูปภาพdata ครับ
Tag : .NET, Ms Access, Win (Windows App), VB.NET, VS 2003 (.NET 1.1)
|
|
|
|
|
|
Date :
2010-07-31 22:27:58 |
By :
rakdi |
View :
1964 |
Reply :
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมก็เกิดปัญหาเหมือนกัน
ของผมแก้อย่างนี้ครับ
แนวทาง
DateTimePicker1.DataBindings.Add("Text", bindingSrc, "DateAdd")
ให้ binding เป็น Text ครับ
ปล.ไม่มีคนตอบมา 8 ปี
ตอบน่าจะคนแรก
|
|
|
|
|
Date :
2018-04-25 19:15:13 |
By :
kicvong |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|