Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0354: Datenmodell unterschiedlich präsentiert

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Datenbanken und XML
  • Listensteuerelemente

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
databinding

Der Vorschlag wurde erstellt am: 27.02.2009 20:30.
Die letzte Aktualisierung erfolgte am 27.02.2009 20:52.

Zurück zur Übersicht

Beschreibung  

Hier werden dieselben Daten einmal als Parent-Child-View, einmal als Einzelblatt-View präsentiert.
Da beide Views gleichrangig sind, kann nicht einer von ihnen das Dataset enthalten, sondern dieses muß außerhalb der beiden gehalten werden, auf einem dritten Form.
Es lassen sich also Ansätze einer 3-Schichten-Architektur erkennen:
Datenmodell ist das Dataset, Präsentationsschicht sind die beiden View-Forms, und frmMain ist für Laden und Speichern zuständig - DataAccess-Layer.

Schwierigkeitsgrad

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [34,65 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------------ Anfang Projektgruppe TwoViews.sln  ------------
' ----------- Anfang Projektdatei TwoViews.vbproj  -----------
' -------------- Anfang Datei frmEinzelblatt.vb --------------
Imports TwoViews.DBSampleDataSet, System.io, Microsoft.VisualBasic.ControlChars

' In einer Combobox kann man eine Kategorie auswählen, ein DatagridView zeigt die Artikel-Namen an.
' Auf einem zweiten Panel können die Einzelheiten des im Grid angewählten Artikels editiert werden.
Public Class frmEinzelblatt

    Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        btAddNew.Click, btEndEdit.Click, btCancelEdit.Click

        Select Case True

            Case sender Is btAddNew
                Me.ArticleBindingSource.AddNew()

            Case sender Is btEndEdit
                Me.ArticleBindingSource.EndEdit()

                ' Leider muß ArticleGrid explizit aufgefordert werden, den geänderten
                ' Datensatz auch neu zu zeichnen
                Me.ArticleGrid.InvalidateRow(ArticleGrid.CurrentCellAddress.Y)

            Case sender Is btCancelEdit
                Me.ArticleBindingSource.CancelEdit()

        End Select

    End Sub

End Class

' --------------- Ende Datei frmEinzelblatt.vb ---------------
' ----------------- Anfang Datei frmMain.vb  -----------------
Imports TwoViews.DBSampleDataSet, System.io, Microsoft.VisualBasic.ControlChars

Public Class frmMain

    Private _DataFile As String = "DBSample.DataSet.xml"
    Private WithEvents _frmParentChild As frmParentChild, _frmEinzelblatt As frmEinzelblatt

    Private Sub frmMain_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

        Reload()

    End Sub

    Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        ReloadToolStripMenuItem.Click, SaveToolStripMenuItem.Click

        Select Case True

            Case sender Is ReloadToolStripMenuItem
                Reload()

            Case sender Is SaveToolStripMenuItem
                Me.DBSampleDataSet.WriteXml(_DataFile)

        End Select

    End Sub

    Private Sub Reload()

        Me.DBSampleDataSet.Clear()

        If File.Exists(_DataFile) Then
            Me.DBSampleDataSet.ReadXml(_DataFile)

        Else

            MsgBox(String.Concat("Leider (noch) kein DatenFile vorhanden", Lf, "Sie " & _
                "können aber trotzdem fortfahren, und eines anlegen."))

        End If

    End Sub

    Private Sub ViewForm_Disposed(ByVal sender As Object, ByVal e As EventArgs) Handles _
        _frmParentChild.Disposed, _frmEinzelblatt.Disposed

        Select Case True

            Case sender Is _frmParentChild
                _frmParentChild = Nothing
                ckParentChild.Checked = False

            Case sender Is _frmEinzelblatt
                _frmEinzelblatt = Nothing
                ckEinzelblatt.Checked = False

        End Select

    End Sub

    Private Sub Checkbox_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        ckParentChild.Click, ckEinzelblatt.Click

        Dim checked As Boolean = DirectCast(sender, CheckBox).Checked

        Select Case True

            Case sender Is ckParentChild

                If checked Then
                    _frmParentChild = New frmParentChild()
                    _frmParentChild.CategoryBindingSource.DataSource = Me.DBSampleDataSet
                    _frmParentChild.Show()

                Else

                    _frmParentChild.Close()
                End If

            Case sender Is ckEinzelblatt

                If checked Then
                    _frmEinzelblatt = New frmEinzelblatt()
                    _frmEinzelblatt.CategoryBindingSource.DataSource = Me.DBSampleDataSet
                    _frmEinzelblatt.Show()

                Else

                    _frmEinzelblatt.Close()
                End If

        End Select

    End Sub

End Class

' ------------------ Ende Datei frmMain.vb  ------------------
' -------------- Anfang Datei frmParentChild.vb --------------
' Parent-Child-View der Relation Category-Article:
' Im linken Grid kann man eine Kategorie anwählen, das rechte Grid zeigt daraufhin die
' dieser Kategorie zugehörigen Artikel an. Beide Tabellen sind vollständig editierbar.
Public Class frmParentChild

    ' (ist komplett im Designer erstellt)

End Class

' --------------- Ende Datei frmParentChild.vb ---------------
' ------------ Ende Projektdatei TwoViews.vbproj  ------------
' ------------- Ende Projektgruppe TwoViews.sln  -------------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.