Re: DataView und DataSet

From: Peter Fleischer (peter.fleischer_nospam__at_gmx.de)
Date: 06/05/04


Date: Sat, 5 Jun 2004 18:29:01 +0200

Uwe Kühne wrote:
...
> Ich binde meine Controls (Textfelder) an eine Tabelle innerhalb eines
> DataSet.
> Nun suche ich in einer DataView, die auf der entsprechenden Tabelle
> aufbaut, nach einem Datensatz:
>
> Dim oDView As New DataView(oDSet.Tables("tblKontakte"))
> oDView.Sort = "KNachname"
> Dim intErg As Integer = oDView.Find(Me.txtFind.Text.Trim)
>
> Wie synchronisiere ich nun aber mein BindingContext mit der Position
> im DataView?

Uwe,
und warum machst du dir den Stress und nutzt unterschiedliche DataViews für
die Anzeige und für die Suche. Nimm einfach die gleiche Sicht und du hast
keine Probleme beim Synchronisieren.

> Es kann ja sein, dass mein BindingContext des Formulars
> anhand der ID des DAtensatzes sortiert ist, meine View (wie hier)
> nach dem Nachname... Weise ich nun intErg (das ja die Position des
> Datensatzes enthält) der Position-Eigenschaft des BindingContext zu,
> so bewegt der sich ja auch eine ganz andere Stelle, als ich möchte,
> weil er nach einem anderen Schlüssel sortiert ist.

Nimm doch den gleichen BindingManager, der auch bei der Sicht genutzt wird
und es gibt keine Dofferenzen.

> Kann mir jemand sagen, wie ich das handhaben muss?

Da sgibt es viele Möglichkeiten und die Auswahl des optimalen Weges hängt
von deiner Aufgabenstellung ab. Der einfachste Weg ist, mit allen Controls
auf die DataSource mit dem gleichen BindingContext zuzugreifen und bei
Suchoperationen auch die Sichten zu nutzen, mit denen die gebundenen
Controls arbeiten. D.H. entweder selbst DataView erstellen und binden oder
über den BindingManger sich den Zeiger auf die implizit erzeugte Sicht zu
besorgen.

...
> PS: Ich habe leider nirgendwo ein Beispiel gefunden, das ein Formular
> erstellt,

Eine Beispielanwednung soll eine Formulerklasse ableiten? Das ist schon
etwas komplexer.

Nimm besser den Designer aus den VS und erzeuge die Ableiting im
Entwurfsmodus - einfach
deiner WindowsApplication ein neues Element vom Typ "Formular" hinzufügen.

> mit dem man auf eine DB zugreift,

Dazu schreibst du am besten eine eigen DataSource-Klasse, die ein
Connection-Objekt und Command-Objekt erstellt und weiter entsprechend
Konzept eine eigene Objektklasse mit dem DataReader füllt oder eine
DataTable mit dem DataAdapter füllt. Beispiele dazu gibt es zu Hauf in der
MSDN.

> die Felder darauf bindet

Entweder du nutzt die DataSource-Eigenschaft und entsprechend dem Typ der
DataSource und dem Typ des Controls weitere Eigenschaften wie DataMember und
z.B. DisplayMember. Dazu solltest du bei den betreffendne Controls
nachschauen.

> und dann mal die Operationen suchen, einfügen, ändern, löschen,
> bewegen durchführt.

Da es viele Wege gibt, solltest du mal etwas genauer beschreiben, wie die
Lösung aussehen soll. Wenn du beispielsweise nur ein DataGríd an eine
DataView gebunden hast, kannst du alle smit dem Grid machen und brauchst aus
dem Update keinen weiteren Codeausschnitt.

> Hat jemand so ein Beispiel?

Schau dir mal die 101-Beispiele von MS an. Da gibt es viele Anregungen.

> In der OH gibt es
> nichts in der Art,

Da gibt es aber Beipiele in Hülle und Fülle, nur keine vollständigen
Lösungen, da jedes Aufgabe anders geartet sein kann.

> in den Büchern die ich habe, werden diese Themen
> nur ansatzweise dargestellt.....

Da hast du bestimmt die falschn Bücher:-)

Hier mal ein Beispiel mit einem DataGrid:

Public Class frmDataTable
  Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "

  Public Sub New()
    MyBase.New()

    ' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
    InitializeComponent()

    ' Initialisierungen nach dem Aufruf InitializeComponent() hinzufügen

  End Sub

  ' Die Form überschreibt den Löschvorgang der Basisklasse, um Komponenten
zu bereinigen.
  Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
      If Not (components Is Nothing) Then
        components.Dispose()
      End If
    End If
    MyBase.Dispose(disposing)
  End Sub

  ' Für Windows Form-Designer erforderlich
  Private components As System.ComponentModel.IContainer

  'HINWEIS: Die folgende Prozedur ist für den Windows Form-Designer
erforderlich
  'Sie kann mit dem Windows Form-Designer modifiziert werden.
  'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
  Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
  Friend WithEvents Button1 As System.Windows.Forms.Button
  Friend WithEvents Button2 As System.Windows.Forms.Button
  Friend WithEvents Button3 As System.Windows.Forms.Button
  Friend WithEvents Button4 As System.Windows.Forms.Button
  Friend WithEvents Button5 As System.Windows.Forms.Button
  Friend WithEvents Button6 As System.Windows.Forms.Button
  Friend WithEvents Button7 As System.Windows.Forms.Button
  Friend WithEvents Button8 As System.Windows.Forms.Button
  Friend WithEvents Label1 As System.Windows.Forms.Label
  Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
  Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
  Friend WithEvents Button9 As System.Windows.Forms.Button
  <System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
    Me.DataGrid1 = New System.Windows.Forms.DataGrid
    Me.Button1 = New System.Windows.Forms.Button
    Me.Button2 = New System.Windows.Forms.Button
    Me.Button3 = New System.Windows.Forms.Button
    Me.Button4 = New System.Windows.Forms.Button
    Me.Button5 = New System.Windows.Forms.Button
    Me.Button6 = New System.Windows.Forms.Button
    Me.Button7 = New System.Windows.Forms.Button
    Me.Button8 = New System.Windows.Forms.Button
    Me.Label1 = New System.Windows.Forms.Label
    Me.TextBox1 = New System.Windows.Forms.TextBox
    Me.ComboBox1 = New System.Windows.Forms.ComboBox
    Me.Button9 = New System.Windows.Forms.Button
    CType(Me.DataGrid1,
System.ComponentModel.ISupportInitialize).BeginInit()
    Me.SuspendLayout()
    '
    'DataGrid1
    '
    Me.DataGrid1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Bottom) _
                Or System.Windows.Forms.AnchorStyles.Left) _
                Or System.Windows.Forms.AnchorStyles.Right),
System.Windows.Forms.AnchorStyles)
    Me.DataGrid1.DataMember = ""
    Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
    Me.DataGrid1.Location = New System.Drawing.Point(8, 8)
    Me.DataGrid1.Name = "DataGrid1"
    Me.DataGrid1.Size = New System.Drawing.Size(512, 488)
    Me.DataGrid1.TabIndex = 0
    '
    'Button1
    '
    Me.Button1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button1.Location = New System.Drawing.Point(528, 16)
    Me.Button1.Name = "Button1"
    Me.Button1.Size = New System.Drawing.Size(128, 23)
    Me.Button1.TabIndex = 1
    Me.Button1.Text = "Bindung an Daten"
    '
    'Button2
    '
    Me.Button2.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button2.Location = New System.Drawing.Point(528, 48)
    Me.Button2.Name = "Button2"
    Me.Button2.Size = New System.Drawing.Size(128, 23)
    Me.Button2.TabIndex = 2
    Me.Button2.Text = "Neu erlauben/sperren"
    '
    'Button3
    '
    Me.Button3.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button3.Location = New System.Drawing.Point(528, 80)
    Me.Button3.Name = "Button3"
    Me.Button3.Size = New System.Drawing.Size(128, 23)
    Me.Button3.TabIndex = 3
    Me.Button3.Text = "Edit erlauben/sperren"
    '
    'Button4
    '
    Me.Button4.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button4.Location = New System.Drawing.Point(528, 112)
    Me.Button4.Name = "Button4"
    Me.Button4.Size = New System.Drawing.Size(128, 23)
    Me.Button4.TabIndex = 4
    Me.Button4.Text = "Löschen erlauben/sperren"
    '
    'Button5
    '
    Me.Button5.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button5.Location = New System.Drawing.Point(528, 144)
    Me.Button5.Name = "Button5"
    Me.Button5.Size = New System.Drawing.Size(128, 23)
    Me.Button5.TabIndex = 5
    Me.Button5.Text = "erster Datensatz"
    '
    'Button6
    '
    Me.Button6.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button6.Location = New System.Drawing.Point(528, 176)
    Me.Button6.Name = "Button6"
    Me.Button6.Size = New System.Drawing.Size(128, 23)
    Me.Button6.TabIndex = 6
    Me.Button6.Text = "nächster Datensatz"
    '
    'Button7
    '
    Me.Button7.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button7.Location = New System.Drawing.Point(528, 208)
    Me.Button7.Name = "Button7"
    Me.Button7.Size = New System.Drawing.Size(128, 23)
    Me.Button7.TabIndex = 7
    Me.Button7.Text = "verheriger Datensatz"
    '
    'Button8
    '
    Me.Button8.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button8.Location = New System.Drawing.Point(528, 240)
    Me.Button8.Name = "Button8"
    Me.Button8.Size = New System.Drawing.Size(128, 23)
    Me.Button8.TabIndex = 8
    Me.Button8.Text = "letzter Datensatz"
    '
    'Label1
    '
    Me.Label1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Label1.Location = New System.Drawing.Point(528, 272)
    Me.Label1.Name = "Label1"
    Me.Label1.Size = New System.Drawing.Size(128, 16)
    Me.Label1.TabIndex = 9
    Me.Label1.Text = "Label1"
    '
    'TextBox1
    '
    Me.TextBox1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.TextBox1.Location = New System.Drawing.Point(528, 328)
    Me.TextBox1.Name = "TextBox1"
    Me.TextBox1.Size = New System.Drawing.Size(128, 20)
    Me.TextBox1.TabIndex = 10
    Me.TextBox1.Text = "TextBox1"
    '
    'ComboBox1
    '
    Me.ComboBox1.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.ComboBox1.Location = New System.Drawing.Point(528, 360)
    Me.ComboBox1.Name = "ComboBox1"
    Me.ComboBox1.Size = New System.Drawing.Size(128, 21)
    Me.ComboBox1.TabIndex = 11
    Me.ComboBox1.Text = "ComboBox1"
    '
    'Button9
    '
    Me.Button9.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
    Me.Button9.Location = New System.Drawing.Point(528, 296)
    Me.Button9.Name = "Button9"
    Me.Button9.Size = New System.Drawing.Size(128, 23)
    Me.Button9.TabIndex = 12
    Me.Button9.Text = "Daten ünbernehmen"
    '
    'frmDataTable
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(664, 510)
    Me.Controls.Add(Me.Button9)
    Me.Controls.Add(Me.ComboBox1)
    Me.Controls.Add(Me.TextBox1)
    Me.Controls.Add(Me.Label1)
    Me.Controls.Add(Me.Button8)
    Me.Controls.Add(Me.Button7)
    Me.Controls.Add(Me.Button6)
    Me.Controls.Add(Me.Button5)
    Me.Controls.Add(Me.Button4)
    Me.Controls.Add(Me.Button3)
    Me.Controls.Add(Me.Button2)
    Me.Controls.Add(Me.Button1)
    Me.Controls.Add(Me.DataGrid1)
    Me.Name = "frmDataTable"
    Me.Text = "DataGrid-Bindung an DAtaTable"
    CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
    Me.ResumeLayout(False)

  End Sub

#End Region

  Dim myDS As DataTable
  Dim myCM As CurrencyManager

  ' Bindung an DataTable
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
    Dim DS As New clsDS1
    myDS = DS.DT01
    DataGrid1.DataSource = myDS
    myCM = CType(Me.BindingContext(myDS), CurrencyManager)
    AddHandler myCM.PositionChanged, AddressOf Datensatzwechsel
    TextBox1.DataBindings.Add("Text", myDS, "Field1")
    ComboBox1.DataSource = myDS
    ComboBox1.DisplayMember = "Field1"
  End Sub

  ' Neu erlauben / verbieten
  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
    myDS.DefaultView.AllowNew = Not myDS.DefaultView.AllowNew
  End Sub

  ' Edit erlauben / verbieten
  Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
    myDS.DefaultView.AllowEdit = Not myDS.DefaultView.AllowEdit
  End Sub

  ' Löschen erlauben / verbieten
  Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button4.Click
    myDS.DefaultView.AllowDelete = Not myDS.DefaultView.AllowDelete
  End Sub

  ' erster Datensatz
  Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button5.Click
    myCM.Position = 0
  End Sub

  ' nächster Datensatz
  Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button6.Click
    myCM.Position += 1
  End Sub

  ' vorheriger Datensatz
  Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button7.Click
    myCM.Position -= 1
  End Sub

  ' letzter Datensatz
  Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button8.Click
    myCM.Position = myDS.Rows.Count - 1
  End Sub

  ' Daten übernehmen
  Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button9.Click
    myCM.EndCurrentEdit()
  End Sub

  ' Beim Datensatzwechsel Anzeige aktualisieren
  Private Sub Datensatzwechsel(ByVal sender As Object, ByVal e As
System.EventArgs)
    Label1.Text = myCM.Position.ToString
    Label1.Text &= " von "
    Label1.Text &= myDS.Rows.Count - 1
  End Sub

End Class



Relevant Pages

  • Re: Addhandler stoppt auf Dauer nicht
    ... Public Sub New() ... End Sub ... Friend WithEvents StatusBar1 As System.Windows.Forms.StatusBar ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Liste der Mitarbeiter im DataGridView
    ... Private dgv As New DataGridView With ... Private Sub Form1_Load(ByVal sender As System.Object, ... End Sub ...
    (microsoft.public.de.german.entwickler.dotnet.datenbank)
  • Mainmenue verschwindet
    ... Public Sub New() ... End Sub ... Friend WithEvents m_txtStatusmessages As System.Windows.Forms.TextBox ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: MDi Anwendung Ereignis auslösen
    ... Private Sub Form1_Load(ByVal sender As System.Object, ... Dim MenuItem1 As New MenuItem ... End Sub ... Private Sub MenuItem1_Click(ByVal sender As System.Object, ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Eine Detail Form aus Master Form aufrufen
    ... (Private Sub SendungToolStripMenuItem_Click(ByVal sender As Object, ... ' Create a new Form1 and set its Visible property to true. ... End Sub) ... Private Sub SendungToolStripMenuItem_Click(ByVal sender As Object, ...
    (microsoft.public.de.german.entwickler.dotnet.vb)