Δημιουργήστε μία Master / Detail
s φόρμα

Στην παρακάτω εικόνα φαίνεται η καρτέλα ενός μαθητή και οι απουσίες του. Τέτοια parent / child σχέση (1:Ν) είναι πολύ συχνή σε εφαρμογές Βάσεων Δεδομένων. Συνδυάζουμε δύο DataViews : Ένα με όνομα MasterView που αφορά την πλευρά parent κι ένα με όνομα DetailsView που αφορά την πλευρά child. Η σύνδεση γίνεται μέσω ενός αντικειμένου DataRelation με πεδίο σύνδεσης τον κωδικό του μαθητή (ID).

Η Details φόρμα περιλαμβάνει ένα DataGrid που παίρνει τα δεδομένα από την πηγή DetailsView. Το Datagrid το κατασκευάζουμε μέσω κώδικα (σε run-tme mode, με τη ρουτίνα CreateDataGrid), που αποτελεί ένα πιο ευέλικτο τρόπο χειρισμού του. Σε κάθε μετακίνηση σε νέο μαθητή, αυτομάτως οι σχετιζόμενες εγγραφές απουσιών θα εμφανίζονται στο DataGrid. Μπορούμε να προσθέσουμε, τροποποιήσουμε και διαγράψουμε απουσίες.

http://users.sch.gr/mouratx/VB-NET_Tips/DataManagement/Images/MasterDetail%20form.jpg

Imports System.Data.OleDb

 

Public Class Form1

Inherits System.Windows.Forms.Form

'Στον τρέχον φάκελο της εφαρμογής η Database αφού δεν βάζουμε path.
Dim strConn$ = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=ΜΑΘΗΤΕΣ.MDB"

Dim daStudents As OleDbDataAdapter
Dim daApoysies As OleDbDataAdapter
Dim BuilderStudents As OleDbCommandBuilder
Dim BuilderApoysies As OleDbCommandBuilder
Dim dsStudents As DataSet
Dim MasterView As New DataView()
Dim DetailsView As New DataView()
Dim MathitesApoysiesRel As DataRelation

Dim first_time As Boolean = True

Private Sub Form1_Load(ByVal sender As System.Object,_

                       ByVal e As System.EventArgs) _

Handles MyBase.Load

 

'Σχετικά ADO.NET αντικείμενα.

Για ενημερώσεις απαραίτητα τα CommandBuilders.
daStudents = New OleDbDataAdapter("Select * from ΜΑΘΗΤΕΣ", strConn)

BuilderStudents = New OleDbCommandBuilder(daStudents)

daApoysies = New OleDbDataAdapter("Select * from ΑΠΟΥΣΙΕΣ", strConn)
BuilderApoysies = New OleDbCommandBuilder(daApoysies)

dsStudents = New DataSet()
daStudents.Fill(dsStudents, "Mathites")
daApoysies.Fill(dsStudents, "Apoysies")

 

'Το Master πεδίο και το Detail πεδίο που θα συσχετιστούν.
Dim ParentColumn As DataColumn = _

dsStudents.Tables("Mathites").Columns("ID")

Dim ChildColumn As DataColumn = _

            dsStudents.Tables("Apoysies").Columns("ID_ΜΑΘΗΤΗ")

'Φτιάξε το σχετικό DataRelation.
MathitesApoysiesRel = New DataRelation("Rel", ParentColumn, ChildColumn)
dsStudents.Relations.Add(MathitesApoysiesRel)

'Πάρε το MasterView και καθόρισε την ταξινόμηση των εγγραφών του.
MasterView = dsStudents.Tables("Mathites").DefaultView
MasterView.Sort = "
ΕΠΩΝΥΜΟ"

With MasterView

.AllowNew = True

.AllowEdit = True

.AllowDelete = True
End With

 

'Σύνδεσε τα textboxes με τα πεδία του MasterView.
BindMasterData()

'Δείξε τις σχετιζόμενες εγγραφές του 1ου record του MasterView.
ShowDetails()

End Sub


'--------------------------------------------------------------------------------

'Συνδέει τα textboxes με τα σχετικά πεδία του MasterView.
Private Sub BindMasterData()

Me.txtCode.DataBindings.Clear()
Me.txtCode.DataBindings.Add("text", MasterView, "ID")
Me.txtEpwnymo.DataBindings.Clear()
Me.txtEpwnymo.DataBindings.Add("text", MasterView, "ΕΠΩΝΥΜΟ")
Me.txtOnoma.DataBindings.Clear()
Me.txtOnoma.DataBindings.Add("text", MasterView, "ΟΝΟΜΑ")

End Sub

'--------------------------------------------------------------------------------
'Εδώ παίρνει το τρέχον record από το MasterView και βρίσκει

‘τα σχετικά "παιδιά" του με βάση το MathitesApoysiewRel.

‘Τα παιδιά φτιάχνουν το DetailsView που γίνεται πηγή στο DataGrid.
Private Sub ShowDetails()

'Πάρε το τρέχον record από το MasterView.

Dim ChildDataRow As DataRowView = _

MasterView.Item(Me.BindingContext(MasterView).Position)

'Δημιούργησε το DetailsView από τα σχετιζόμενα records του ChildDataRow.
DetailsView = ChildDataRow.CreateChildView(MathitesApoysiesRel)

 

'Ταξινόμηση κατά ημερομηνία απουσίας.
DetailsView.Sort = "ΗΜΕΡΟΜ_ΑΠΟΥΣΙΑΣ"

With DetailsView
      .AllowNew = True

      .AllowEdit = True

.AllowDelete = True
End With

 

'Γέμισε το DataGrid.

‘Δημιούργησέ το μόνο την πρώτη φορά κλήσης.
If first_time Then


CreateDataGrid() : first_time = False


  Else


DataGrid1.DataSource = DetailsView

 

End If

End Sub


'--------------------------------------------------------------------------------

'Δημιούργησε custom στήλες στο DataGrid.
Private Sub CreateDataGrid()

Dim c As DataGridTextBoxColumn

DataGrid1.DataSource = DetailsView

'Nέο TableStyle για custom ορισμό δομής του grid
Dim ts1 As New DataGridTableStyle()

'Γενικά χαρακτηριστικά.
ts1.MappingName = DetailsView.Table.TableName

'1η στήλη - Ημερ/νία απουσίας.
c = New DataGridTextBoxColumn()
c.MappingName = "
ΗΜΕΡΟΜ_ΑΠΟΥΣΙΑΣ"
c.HeaderText = "
Ημερ/νία απουσίας"
c.Width = 120
c.Alignment = HorizontalAlignment.Center
ts1.GridColumnStyles.Add(c)
c.Dispose()

'2η στήλη - Σύνολο απουσιών.
c = New DataGridTextBoxColumn()
c.MappingName = "
ΣΥΝΟΛΟ"
c.HeaderText = "
Σύνολο"
c.Width = 60 'pixels
c.Alignment = HorizontalAlignment.Right
ts1.GridColumnStyles.Add(c)
c.Dispose()

'3η στήλη - Πόσες δικαιολογημένες.
c = New DataGridTextBoxColumn()
c.MappingName = "
ΔΙΚΑΙΟΛ"
c.HeaderText = "
Δικαιολ."
c.Width = 60
c.Alignment = HorizontalAlignment.Right
ts1.GridColumnStyles.Add(c)
c.Dispose()

'Προσθήκη του TableStyle στο grid.
DataGrid1.TableStyles.Add(ts1)

ts1.Dispose()

End Sub


'--------------------------------------------------------------------------------

'Κατά το κλείσιμο της φόρμας ενημέρωσε τις ενδεχόμενες αλλαγές στη ΒΔ.
Protected Overrides Sub OnClosing(ByVal e As _

System.ComponentModel.CancelEventArgs)

 

MyBase.OnClosing(e)

 

'Ενημέρωσε τις αλλαγές στη Βάση.
daStudents.Update(dsStudents, "Mathites")
daApoysies.Update(dsStudents, "Apoysies")

End Sub


'--------------------------------------------------------------------------------

'Προηγούμενος μαθητής.
Private Sub btnPrevious_Click(ByVal sender As System.Object, _

      ByVal e As System.EventArgs) _

            Handles btnPrevious.Click

 

Me.BindingContext(MasterView).Position -= 1
ShowDetails()

End Sub


'--------------------------------------------------------------------------------

'Επόμενος μαθητής.
Private Sub btnNext_Click(ByVal sender As System.Object, _

                          ByVal e As System.EventArgs)_

 Handles btnNext.Click

 

Me.BindingContext(MasterView).Position += 1
ShowDetails()

End Sub

End Class

 

·         Χρήστος Μουρατίδης