Imports IdeaBlade.Persistence
Imports IdeaBlade.Persistence.Rdb
Imports IdeaBlade
Imports HcWebSiteDF
Imports System.IO
Imports IdeaBlade.UI
Imports IdeaBlade.UI.WinForms
Imports System.Data.SqlClient
Imports System.Threading
Imports HcUsers
Public Class AttendanceControlForm
Private mPersMgr As PersistenceManager
Private mRollDateT As EntityList(Of RollDateT)
Private callingThread As Integer
Private WhoAttendedTable As DataTable
Private WhichDate As Integer
Private AttendedID As Integer
Private Sub AttendanceControlForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
mPersMgr = PersistenceManager.DefaultManager
ConfigureBindingSources()
ProgressBar1.Maximum = SurnameBS.Count
UIHelper.AutoSizeGridColumns(ListByDateDGV)
StartMultithreads()
ProgressBar1.Value = 0
End Sub
Private Sub ClearNodeTicks(ByVal thisTV As TreeView)
Dim nodes As TreeNodeCollection
nodes = thisTV.Nodes
Dim n As TreeNode
For Each n In nodes
ClearRecursive(n)
Next
End Sub
Private Sub ClearRecursive(ByVal treeNode As TreeNode)
Dim tn As TreeNode
For Each tn In treeNode.Nodes
tn.Checked = False
tn.Parent.Checked = False
ClearRecursive(tn)
Next
End Sub
Private Sub fillTree(ByVal thisTV As TreeView)
Dim WhoAttended As New String("DateID = '" & WhichDate & "'")
Dim foundRows As DataRow() = WhoAttendedTable.Select(WhoAttended)
Dim r As DataRow
Dim nodes As TreeNodeCollection = thisTV.Nodes
Dim n As TreeNode
For Each r In foundRows
For Each n In nodes
FindRecursiveTag(n, r("FirstNameID"), r("AttendedID"))
Next
Next
End Sub
Private Sub FindRecursiveTag(ByVal tNode As TreeNode, ByVal FirstNameID As Integer, ByVal AttendedID As Integer)
Dim tn As TreeNode
For Each tn In tNode.Nodes
If tn.Tag.ToString() = "F" & FirstNameID Then
tn.Checked = True
tn.Parent.Checked = True
FindReason(tn, AttendedID)
End If
FindRecursiveTag(tn, FirstNameID, AttendedID)
Next
End Sub
Private Sub FindReason(ByVal tNode As TreeNode, ByVal AttendedID As Integer)
Dim tn As TreeNode
For Each tn In tNode.Nodes
If tn.Tag.ToString().StartsWith(AttendedID) Then
tn.Checked = True
End If
Next
End Sub
Private Sub createTable()
WhoAttendedTable = New DataTable("WhoAttendanceDT")
WhoAttendedTable.Columns.Add("AttendedID", GetType(Integer))
WhoAttendedTable.Columns.Add("FirstNameID", GetType(Integer))
WhoAttendedTable.Columns.Add("DateID", GetType(Integer))
Dim FNcount As Int16 = 0
WhoAttendedBS.MoveFirst()
While FNcount < WhoAttendedBS.Count
WhoAttendedTable.Rows.Add(New Object() {WhoAttendedBS.Current("AttendanceID"), WhoAttendedBS.Current("FirstNameID"), WhoAttendedBS.Current("RollDateID")})WhoAttendedBS.MoveNext()
FNcount += 1
End While
WhoAttendedTable.AcceptChanges()
End Sub
Private Sub ConfigureBindingSources()
mRollDateT = mPersMgr.GetEntities(Of RollDateT)()
RollDateBS.DataSource = mRollDateT
SurnameBS.DataSource = mPersMgr.GetEntities(Of SurNameT)()
AttendanceDefinitionBS.DataSource = mPersMgr.GetEntities(Of AttendanceDefinitionT)()
BindingSource1.DataSource = mPersMgr.GetEntities(Of RollAttendanceT)()
End Sub
Private Function GetNodeAttendance(ByVal rowFirstName As DataRow, ByVal nodetext As String, ByVal TagAttendedID As String) As TreeNode
Dim NewNode As TreeNode = New TreeNode
NewNode.Text = nodetext
NewNode.Tag = TagAttendedID & rowFirstName("FirstNamesID")
Return NewNode
End Function
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
FilteringByFirstNameBS.Filter = "FirstName like '%" + TextBox1.Text + "%'"
End Sub
#Region " Multiple Threads "
Private Sub StartMultithreads()
Dim workerThread As Thread = New Thread(AddressOf workerSubMultithreads)
workerThread.Start()
End Sub
Private Sub workerSubMultithreads()
Dim Processor2 As Thread = New Thread(AddressOf PopulateTrees)
Dim Processor3 As Thread = New Thread(AddressOf LoadList)
Processor2.Start()
Processor3.Start()
End Sub
#End Region
#Region "Thread 2 for Filling the Trees"
Private Sub PopulateTrees()
createTable()
Dim FillTreeView As TreeView
FillTreeView = Nothing
Dim index As Integer = 0
While index < SurnameBS.Count
Dim Surname As String = SurnameBS.Current("Surname")
Dim FirstInitials As String = SurnameBS.Current("FirstInitials")
Dim SurnameID As Integer = SurnameBS.Current("SurNameID")
Try
Dim nodeSurname, nodeFirstname, nodeAttendance As TreeNode
If Surname.StartsWith("A") Or Surname.StartsWith("B") Or Surname.StartsWith("C") Then
FillTreeView = tvABC
ElseIf Surname.StartsWith("D") Or Surname.StartsWith("E") Or Surname.StartsWith("F") Then
FillTreeView = tvDEF
ElseIf Surname.StartsWith("G") Or Surname.StartsWith("H") Or Surname.StartsWith("I") Then
FillTreeView = tvGHI
ElseIf Surname.StartsWith("J") Or Surname.StartsWith("K") Or Surname.StartsWith("L") Then
FillTreeView = tvJKL
ElseIf Surname.StartsWith("M") Or Surname.StartsWith("N") Or Surname.StartsWith("O") Then
FillTreeView = tvMNO
ElseIf Surname.StartsWith("P") Or Surname.StartsWith("Q") Or Surname.StartsWith("R") Then
FillTreeView = tvPQR
ElseIf Surname.StartsWith("S") Or Surname.StartsWith("T") Or Surname.StartsWith("U") Or Surname.StartsWith("V") Then
FillTreeView = tvSTUV
ElseIf Surname.StartsWith("W") Or Surname.StartsWith("X") Or Surname.StartsWith("Y") Or Surname.StartsWith("Z") Then
FillTreeView = tvWXYZ
End If
nodeSurname = New TreeNode
nodeSurname.Text = Surname & " " & FirstInitials
nodeSurname.Tag = "S" & SurnameID
Dim FNcount As Int16 = 0
While FNcount < FirstnameSurnameBS.Count
nodeFirstname = New TreeNode
nodeFirstname.Text = FirstnameSurnameBS.Current("FirstName")
nodeFirstname.Tag = "F" & FirstnameSurnameBS.Current("FirstNamesID")
Dim ATcount As Int16 = 1
AttendanceDefinitionBS.MoveFirst()
While ATcount <= AttendanceDefinitionBS.Count
nodeAttendance = New TreeNode
nodeAttendance = GetNodeAttendance(FirstnameSurnameBS.Current, AttendanceDefinitionBS.Current("Definition").ToString, AttendanceDefinitionBS.Current("AttendanceID").ToString)
nodeFirstname.Nodes.Add(nodeAttendance)
ATcount += 1
AttendanceDefinitionBS.MoveNext()
End While
nodeSurname.Nodes.Add(nodeFirstname)
FNcount += 1
FirstnameSurnameBS.MoveNext()
End While
SetTreeViewApperance(nodeSurname, FillTreeView)
Catch ex As Exception
End Try
SurnameBS.MoveNext()
index += 1
End While
End Sub
Private Sub SetTreeViewApperance(ByVal newNode As TreeNode, ByVal FillTreeView As TreeView)
If FillTreeView.InvokeRequired Then
callingThread = System.Threading.Thread.CurrentThread.ManagedThreadId()
Dim newTreeViewApperanceCallBack As New SetTreeViewApperanceCallback(AddressOf SetTreeViewApperance)
FillTreeView.Invoke(newTreeViewApperanceCallBack, newNode, FillTreeView)
Else
Me.Refresh()
FillTreeView.Nodes.Add(newNode)
ProgressBar1.Value += 1
If ProgressBar1.Value = ProgressBar1.Maximum Then
ProgressBar1.Value = 0
End If
End If
End Sub
Delegate Sub SetTreeViewApperanceCallback(ByVal newNode As TreeNode, ByVal FillTreeView As TreeView)
#End Region
#Region " Thread 3 for Filling the ListView for Firstname search"
Private Sub SetListViewFirstNames(ByVal BS As BindingSource)
If Me.DataGridView2.InvokeRequired Then
Dim d As New SetListViewFirstNamesCallback(AddressOf SetListViewFirstNames)
Me.Invoke(d, New Object() {BS})
Else
Me.Refresh()
DataGridView2.DataSource = BS
DataGridView2.AutoGenerateColumns = False
Dim a As Integer
For a = 0 To DataGridView2.Columns.Count - 1
DataGridView2.Columns.Item(a).Visible = False
Next
DataGridView2.Columns.Item("FirstName").Visible = True
End If
End Sub
Private Sub LoadList()
FilteringByFirstNameBS.DataSource = mPersMgr.GetTable(GetType(FirstNamesT))
SetListViewFirstNames(FilteringByFirstNameBS)
End Sub
Delegate Sub SetListViewFirstNamesCallback(ByVal NewValue As BindingSource)
#End Region
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateListLB.SelectedIndexChanged
FillWithData()
End Sub
Private Sub ClearAllTicks()
ProgressBar1.Value = 0
ProgressBar1.Maximum = 80
ClearNodeTicks(tvABC)
ProgressBar1.Value += 10
ClearNodeTicks(tvDEF)
ProgressBar1.Value += 10
ClearNodeTicks(tvGHI)
ProgressBar1.Value += 10
ClearNodeTicks(tvJKL)
ProgressBar1.Value += 10
ClearNodeTicks(tvMNO)
ProgressBar1.Value += 10
ClearNodeTicks(tvPQR)
ProgressBar1.Value += 10
ClearNodeTicks(tvSTUV)
ProgressBar1.Value += 10
ClearNodeTicks(tvWXYZ)
ProgressBar1.Value = 0
End Sub
Private Sub fillTreeviewwith()
ProgressBar1.Value = 0
ProgressBar1.Maximum = 80
fillTree(tvABC)
ProgressBar1.Value += 10
fillTree(tvDEF)
ProgressBar1.Value += 10
fillTree(tvGHI)
ProgressBar1.Value += 10
fillTree(tvJKL)
ProgressBar1.Value += 10
fillTree(tvMNO)
ProgressBar1.Value += 10
fillTree(tvPQR)
ProgressBar1.Value += 10
fillTree(tvSTUV)
ProgressBar1.Value += 10
fillTree(tvWXYZ)
ProgressBar1.Value = 0
End Sub
Private Sub FillWithData()
WhichDate = DateListLB.SelectedValue
createTable()
ClearAllTicks()
fillTreeviewwith()
End Sub
Private Sub node_AfterCheck(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles tvABC.AfterCheck, tvSTUV.AfterCheck, tvPQR.AfterCheck, tvMNO.AfterCheck, tvJKL.AfterCheck, tvGHI.AfterCheck, tvDEF.AfterCheck, tvWXYZ.AfterCheck
If e.Action <> TreeViewAction.Unknown Then
If e.Node.Checked = False Then
e.Node.Checked = True
Exit Sub
Else
If e.Node.Tag.ToString.StartsWith("S") = True Then
CheckAllFirstNameNodes(e.Node)
ElseIf e.Node.Tag.ToString.StartsWith("F") = True Then
e.Node.Parent.Checked = True
TickTheCorrectAttendance(e.Node, MiInsertDefaultCB.Text)
Else
e.Node.Parent.Checked = True
e.Node.Parent.Parent.Checked = True
TickTheCorrectAttendance(e.Node.Parent, e.Node.Text)
End If
End If
Else
Exit Sub
End If
End Sub
Private Sub TickTheCorrectAttendance(ByVal e As TreeNode, ByVal AttendanceReason As String)
Dim node As TreeNode
For Each node In e.Nodes
If node.Text = AttendanceReason Then
node.Checked = True
InsertFirstNamesIDIntoRollAttendance(node.Tag.ToString)
Else
node.Checked = False
End If
Next
End Sub
Private Sub CheckAllFirstNameNodes(ByVal e As TreeNode)
Dim node As TreeNode
For Each node In e.Nodes
node.Checked = True
TickTheCorrectAttendance(node, MiInsertDefaultCB.SelectedText)
Next node
End Sub
Private Sub CheckAllChildNodes(ByVal MytreeNode As TreeNode, ByVal nodeChecked As Boolean)
Dim node As TreeNode
For Each node In MytreeNode.Nodes
If node.Tag = Nothing Then
Exit Sub
End If
If nodeChecked = False Then
RemoveFirstNamesIDFromRollAttendance(node.Tag.ToString)
node.Checked = False
Exit Sub
End If
If node.Text = MiInsertDefaultCB.Text Then
node.Checked = nodeChecked
If node.Checked = True Then
InsertFirstNamesIDIntoRollAttendance(node.Tag.ToString)
End If
ElseIf node.Tag.ToString.StartsWith("F") Then
node.Checked = nodeChecked
End If
If MytreeNode.Nodes.Count > 0 Then
Me.CheckAllChildNodes(node, nodeChecked)
End If
Next node
End Sub
Private Sub UncheackAllButThis(ByVal e As TreeNode, ByVal ThisNodeText As String, ByVal Ischecked As Boolean)
Dim node As TreeNode
e.Checked = Ischecked
For Each node In e.Nodes
If node.Text = ThisNodeText Then
If node.Checked = True Then
InsertFirstNamesIDIntoRollAttendance(node.Tag.ToString)
Else
RemoveFirstNamesIDFromRollAttendance(node.Tag.ToString)
End If
ElseIf node.Checked = True Then
RemoveFirstNamesIDFromRollAttendance(node.Tag.ToString)
node.Checked = False
End If
Next
End Sub
Private Sub InsertFirstNamesIDIntoRollAttendance(ByVal NodeTag As String)
Dim FirstNamesID As Integer = NodeTag.Remove(0, 1)
Dim AttendedID As Integer = Val(NodeTag.Chars(0))
If NodeTag.Chars(0) = "S" Then
Exit Sub
End If
Try
Dim ATcount As Int16 = 1
WhoAttendedBS.MoveFirst()
While ATcount <= WhoAttendedBS.Count
If WhoAttendedBS.Current("FirstNameID") = FirstNamesID And WhoAttendedBS.Current("RollDateID") = DateListLB.SelectedValue Then
WhoAttendedBS.Current.delete()
End If
ATcount += 1
WhoAttendedBS.MoveNext()
End While
RollAttendanceT.Create(mPersMgr, FirstNamesID, DateListLB.SelectedValue, AttendedID)
Catch ex2 As Exception
MsgBox("welcome", MsgBoxStyle.OkOnly, "WOW")
Exit Sub
End Try
End Sub
Private Sub RemoveFirstNamesIDFromRollAttendance(ByVal NodeTag As String)
Dim FirstNamesID As Integer
FirstNamesID = NodeTag.Remove(0, 1)
If NodeTag.Chars(0) = "S" Then
Exit Sub
End If
Try
If WhoAttendedBS.Current("FirstNameID") = FirstNamesID And WhoAttendedBS.Current("RollDateID") = DateListLB.SelectedValue Then
WhoAttendedBS.Current.delete()
End If
Catch ex As Exception
End Try
End Sub
Private Sub ListByDateDGV_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ListByDateDGV.CellValueChanged
FillWithData()
End Sub
End Class