DevTrain

Autor: Rene Paschold

Datensatznavigation mit ADO.NET

Unter ADO hatte das RecordSet Objekt verschiedene Methoden um durch eine Ergebnismenge zu navigieren. Methoden wie MoveNext, MovePrevious, MoveFirst und MoveLast wurden dem Programmierer vom RecordSet Objekt zur Verfügung gestellt. Somit war es relativ einfach eine "Blätterfunktion" zu programmieren.

Unter ADO.NET gibt es kein RecordSet mehr. Die Datensatz Navigation erfolgt über BindingContext. Folgendes Beispiel soll dies etwas verdeutlichen.

In der Form1_Load Methode wird zuerst eine Datenbank abgefragt dessen Ergebnis per DataAdapter in ein DataSet gespeichert wird:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
Handles MyBase.Load

Me.conn = New SqlConnection(Me.strConnection)
Dim strSelect As String = "SELECT * FROM Users"
Dim cmd As New SqlCommand(strSelect, conn)
Me.myAdapter = New SqlDataAdapter(cmd)

  Try
  Me.ds = New DataSet
  Me.conn.Open()
  Me.myAdapter.Fill(ds, "Users")
  Me.conn.Close()
  txtVorname.DataBindings.Add("Text", ds.Tables("Users"), "Vorname")
  txtNachname.DataBindings.Add("Text", ds.Tables("Users"), "Nachname")

  Catch ex As Exception
    MessageBox.Show(ex.Message)
  Finally
    If (conn.State = ConnectionState.Open) Then conn.Close()
  End Try

End Sub

Mit der Eigenschaft DataBindings wird zur Laufzeit eine neue Datenbindung zum entsprechenden Control hinzugefügt. Im gezeigten Beispiel wird der Eigenschaft Text der Controls txtVorname und txtNachname mit dem gefüllte DataSet und den entsprechenden Spaltennamen verbunden.

Private Sub btnLast_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnLast.Click
  BindingContext(ds.Tables("Users")).Position -= 1
End Sub

Private Sub btnNext_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnNext.Click
  BindingContext(ds.Tables("Users")).Position += 1
End Sub

Private Sub btnStart_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnStart.Click
  BindingContext(ds.Tables("Users")).Position = 0
End Sub

Private Sub btnEnd_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnEnd.Click
  BindingContext(ds.Tables("Users")).Position = _
  (ds.Tables("Users").Rows.Count - 1)
End Sub

Wie man sehen kann werden hier die vier Methoden der entsprechenden Buttons gezeigt. Über die Eigenschaft BindingContext kann jetzt die Position des gebundenen Datensatzes gesteuert werden.

Nächster Datensatz. Die Position des Bindings wird um 1 erhöht.
BindingContext(ds.Tables("Users")).Position += 1

Vorheriger Datensatz. Die Position des Bindings wird um 1 verringert.
BindingContext(ds.Tables("Users")).Position -= 1

Erster Datensatz. Die Position des Bindings wird auf 0 (Anfang) gesetzt.
BindingContext(ds.Tables("Users")).Position = 0

Letzter Datensatz. Die Position des Bindings wird auf die Anzahl der Datensätze im DataSet -1 gesetzt. Die Subtraktion muss ausgeführt werden da die Binding-Position bei 0 beginnt. Wenn beispielsweise im DataSet 50 Datensätze enthalten sind so ist die letzte Position 49.
BindingContext(ds.Tables("Users")).Position = _
(ds.Tables("Users").Rows.Count - 1)

Somit hat man auf relativ einfachen Weg eine Datasatznavigation unter .NET. Natürlich sollte man an dieser Stelle die entsprechenden Buttons noch enablen bzw. disablen wenn das Ende bzw. der Anfang erreicht wurde damit keine Exception auftreten kann.

Hier noch der C# Code:

private void Form1_Load(object sender, System.EventArgs e)
{
  this.conn = new SqlConnection(this.strConnection);
  string strSelect = "SELECT * FROM Users";
  SqlCommand cmd = new SqlCommand(strSelect, conn);
  this.myAdapter = new SqlDataAdapter(cmd);

  try
  {
    this.ds = new DataSet();
    this.conn.Open();
    this.myAdapter.Fill(ds, "Users");
    this.conn.Close();
    txtVorname.DataBindings.Add("Text", this.ds.Tables("Users"), "Vorname");
    txtNachname.DataBindings.Add("Text", this.ds.Tables("Users"), "Nachname");
  }
  catch(Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
  finally
  {
    if(conn.State == ConnectionState.Open) conn.Close();
  }
}

private void btnStart_Click(object sender, System.EventArgs e)
{
  BindingContext(ds.Tables("Users")).Position = 0;
}

private void btnLast_Click(object sender, System.EventArgs e)
{
  BindingContext(ds.Tables("Users")).Position -= 1;
}

private void btnNext_Click(object sender, System.EventArgs e)
{
  BindingContext(ds.Tables("Users")).Position += 1;
}

private void btnEnd_Click(object sender, System.EventArgs e)
{
  BindingContext(ds.Tables("Users")).Position =
    (ds.Tables("Users").Rows.Count - 1);
}


Erfasst am: 15.04.2003 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=846
© Copyright 2003 ppedv AG - http://www.ppedv.de