none
Gebundene Combobox Liste ändern über DataTable.DefaultView.RowFilter RRS feed

  • Frage

  • Hallo zusammen,

    eine ComboBox (sowie andere Controls in einem Formular) sind an eine BindingSource gebunden:

    Me.cbxContactsPosition.DataBindings.Add("SelectedValue", Me.bsCustomerContacts, "position_id")

    Zusätzlich wird diese Combobox beim FormLoad gefüllt mit:

    Me.cbxContactsPosition.DataSource = Me.dtContactPosition
    Me.cbxContactsPosition.ValueMember = "Id"
    Me.cbxContactsPosition.DisplayMember = "name"

    Nun wird zur Laufzeit des Programmes die BindingSource gefiltert:

    Me.bsCustomerContacts.DataSource.DefaultView.RowFilter = " department='backoffice'"

    Dementsprechend soll aber auch der Inhalt der ComboBox "gefiltert" werden (Zur Erklärung: Wenn das Formular nur "backoffice" Kontakte anzeigt, sollen in der Combobox natürlich auch nur Positionen aus dem Bereich "backoffce" auswählbar sein.):

    Me.dtContactPosition.DefaultView.RowFilter = " department='backoffice' OR department='' "

    Das funktioniert aber nicht richtig bzw. manchmal geht dabei das "Binding" zur BindingSource irgendwie verloren(?) und der Inhalt der ComboBox bleibt immer gleich, egal welcher Datensatz aus der BindingSource gerade angezeigt wird. Es muss irgendwie damit zusammenhängen, dass die ComboBox ja "doppelt" gebunden ist, und ich die zugrundeliegende Liste nachträglich ändere. Allerdings kann ich ausschließen, dass hierbei "ungültige" Konstellationen entstehen...

    Hat jemand einen Tip?

    Danke und Grüße,
    Jan


    • Bearbeitet Jan Kornblum Dienstag, 7. August 2012 13:56 Ergänzung
    Dienstag, 7. August 2012 13:54

Antworten

  • Hi Jan,
    der Ansatz ist im Prinzip richtig.

    Es ist aber nicht nötig, über JOIN die "department_id" zu holen. Das geht einfacher über berechnete Spalten, da für JOIN eine separate Abfrage erforderlich ist, und, wenn mit typsierten DataSets und TableAdpater gearbeitet wird, ist das zusätzlicher Aufwand.

    Auch ist kein SelectedIndesChanged erforderlich, wenn hierarchische Bindingsources genutzt werden. Sie folgen automatisch den Änderungen.

    Wie ich das mit den berechneten Spalten und den BindingSource meine, habe ich im folgenden Beispiel dargestellt. Der Code ist einfach in den Codeteile einer leeren Form eines Windows-VB-Projektes zu kopieren.

    Public Class Form1
    
      Private grdChild As DataGridView
      Private pan As New Panel With {.Dock = DockStyle.Right}
      Private lblDepartment As New Label With {.Dock = DockStyle.Top, .Text = "Department"}
      Private cbDepartment As ComboBox
      Private lblPosition As New Label With {.Dock = DockStyle.Top, .Text = "Position"}
      Private cbPosition As ComboBox
      Private ds As New DataSet
      Private bsDepartment As BindingSource ' alle Departments
      Private bsPosition As BindingSource ' nur die Positions des ausgewählten Department
      Private bsContact As BindingSource ' alle Kontakte
    
      Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.Width = 900
        ds = GetDataSet()
        '
        bsContact = New BindingSource(ds, "Contact")
        grdChild = New DataGridView With {.Dock = DockStyle.Left, .DataSource = bsContact, .Width = 650}
        '
        bsDepartment = New BindingSource(ds, "Department")
        cbDepartment = New ComboBox With {.Dock = DockStyle.Top, .DataSource = bsDepartment, .DisplayMember = "Bezeichnung", .ValueMember = "ID"}
        cbDepartment.DataBindings.Add("SelectedValue", bsContact, "DepartmentID")
        '
        bsPosition = New BindingSource(bsDepartment, "DepPos")
        cbPosition = New ComboBox With {.Dock = DockStyle.Top, .DataSource = bsPosition, .DisplayMember = "Bezeichnung", .ValueMember = "ID"}
        cbPosition.DataBindings.Add("SelectedValue", bsContact, "FK")
        '
        Me.pan.Controls.AddRange(New Control() {cbPosition, lblPosition, cbDepartment, lblDepartment})
        Me.Controls.AddRange(New Control() {grdChild, pan})
      End Sub
    
      Private Function GetDataSet() As DataSet
        '
        ' DataSet und Tabellen
        '
        Dim ds As New DataSet
        Dim dt1 As New DataTable("Department")
        With dt1
          With ..Columns
            With ..Add("ID", GetType(Integer))
              .AutoIncrement = True
              .AutoIncrementSeed = 1
              .AutoIncrementStep = 1
            End With
            .Add("Bezeichnung", GetType(String))
          End With
        End With
        ds.Tables.Add(dt1)
        Dim dt2 As New DataTable("Position")
        With dt2
          With ..Columns
            With ..Add("ID", GetType(Integer))
              .AutoIncrement = True
              .AutoIncrementSeed = 1
              .AutoIncrementStep = 1
            End With
            .Add("FK", GetType(Integer))
            .Add("Bezeichnung", GetType(String))
          End With
        End With
        ds.Tables.Add(dt2)
        Dim dt3 As New DataTable("Contact")
        With dt3
          With ..Columns
            With ..Add("ID", GetType(Integer))
              .AutoIncrement = True
              .AutoIncrementSeed = 1
              .AutoIncrementStep = 1
            End With
            .Add("FK", GetType(Integer))
            .Add("Bezeichnung", GetType(String))
          End With
        End With
        ds.Tables.Add(dt3)
        '
        ' Daten
        '
        For i = 1 To 5
          Dim r1 = dt1.NewRow
          r1("Bezeichnung") = String.Format("Department {0}", i)
          dt1.Rows.Add(r1)
          For k = 1 To 5
            Dim r2 = dt2.NewRow
            r2("Bezeichnung") = String.Format("Position {1} {0}", i, k)
            r2("FK") = r1("ID")
            dt2.Rows.Add(r2)
            For l = 1 To 10
              Dim r3 = dt3.NewRow
              r3("Bezeichnung") = String.Format("Contact {2} {1} {0}", i, k, l)
              r3("FK") = r2("ID")
              dt3.Rows.Add(r3)
            Next
          Next
        Next
        '
        ' Tabellenbeziehungen
        '
        ds.Relations.Add(New DataRelation("DepPos", dt1.Columns("ID"), dt2.Columns("FK")))
        ds.Relations.Add(New DataRelation("PosCon", dt2.Columns("ID"), dt3.Columns("FK")))
        '
        ' berechnete Felder
        '
        dt2.Columns.Add("Department", GetType(String), "Parent(DepPos).Bezeichnung")
        dt3.Columns.Add("Department", GetType(String), "Parent(PosCon).Department")
        dt3.Columns.Add("Position", GetType(String), "Parent(PosCon).Bezeichnung")
        dt2.Columns.Add("DepartmentID", GetType(Integer), "Parent(DepPos).ID")
        dt3.Columns.Add("DepartmentID", GetType(Integer), "Parent(PosCon).DepartmentID")
        '
        Return ds
      End Function
    
    End Class
    

    --
    Viele Gruesse
    Peter

    • Als Antwort markiert Jan Kornblum Dienstag, 14. August 2012 14:52
    Samstag, 11. August 2012 14:18
  • Hi Peter, nochmal,

    glaube ich komme der Ursache langsam auf die Schliche und der Fehler stammt eher aus einer anderen Ecke, nämlich, dass der Filter für die Combo Daten teilweise inhaltich falsch ist und demnach das Binding "aus den Fugen" gerät.

    Danke dennoch, Jan

    • Als Antwort markiert Jan Kornblum Dienstag, 7. August 2012 14:45
    Dienstag, 7. August 2012 14:42

Alle Antworten

  • Hi Jan,
    besser ist es, das gleiche komplexe Objekt sowohl für die Bindung als auch für das Setzen des Filters zu nutzen, damit auch die Filterung wirklich den richtigen BindingContext erwischt. Z.B. so:
     
    Dim bs As New BindingSource(Me.dtContactPosition, ””)
    ...
    Me.cbxContactPosition.DataSource = bs
    ...
    bs.Filter = ”department='backoffice' OR department = ''”
     
     
     
    --
    Viele Gruesse
    Peter
    Dienstag, 7. August 2012 14:07
  • Hi Peter,

    danke für die schnelle Antwort. Habe ich gerade gemacht und getestet, führt aber zum gleichen Ergebnis. Ich stehe auf dem Schlauch...

    Viele Grüße, Jan

    Dienstag, 7. August 2012 14:17
  • Hi Peter, nochmal,

    glaube ich komme der Ursache langsam auf die Schliche und der Fehler stammt eher aus einer anderen Ecke, nämlich, dass der Filter für die Combo Daten teilweise inhaltich falsch ist und demnach das Binding "aus den Fugen" gerät.

    Danke dennoch, Jan

    • Als Antwort markiert Jan Kornblum Dienstag, 7. August 2012 14:45
    Dienstag, 7. August 2012 14:42
  • Hi Peter,

    die Ursache des Problem ist gefunden, nur die Lösung noch nicht. Ich muss es nun nur etwas anders formulieren:

    • Das Formular basiert auf einer zugrundeliegenden Tabelle "Contacts"
    • In dem Formular gibt es eine Combo "Department" und eine Combo "Position"
    • Die Werte bzw. "ValueMember" der beiden Combos werden BEIDE in der zugrundliegenden Tabelle "Contacts" als Fremdschlüssel gespeichert
    • Die beiden Combos sind voneinander abhängig, zugrunde liegt eine DataRelation im DataSet, je nach Wert in Combo "Department" werden nur zugehörige Werte in Combo "Postition" gelistet

    Das Problem tritt nun auf, wenn man durch die Datensätze "Contacts" blättert. Hat der jeweils nächste angezeigte Datensatz aus "Contacts" einen vom Vorgänger abweichenden Wert als "department" gespeichert, geht das Binding der zweiten Combo "Position" verloren.

    Das erkläre ich mir damit, dass es sich hier ja um eine "Dreiecksbeziehung" handelt - wenn man es so ausdrücken kann: Beim Navigieren durch die Datensätze wird zunächst jeweils der Selected-Wert in der Combo "Department" und der Combo "Position" über die zugrundliegende Tabelle "Contacts" gesetzt (wo diese IDs ja als Fremdschlüssel existieren), gleichzeitig bzw. danach wird der Inhalt der zweiten Combo "Position" aber immer wieder verändert, wenn sich der Selected-Wert der ersten Combo "Department" ändert - was er ja beim Blättern durch die Datensätze tut.

    Wie lässt sich das Problem lösen? Mir fehlt momentan jeglicher Ansatz...

    Grüße, Jan

    Mittwoch, 8. August 2012 16:25
  • Hi Jan,
    oft sind die Probleme nicht erkennbar, weil man nicht in der Lage ist, sich zu auszudrücken, dass daraus aus zweifelsfrei ein Algorithmus ableitbar ist
     
    Z.B.:
    Das Formular basiert auf einer zugrundeliegenden Tabelle "Contacts"
    So etwas gibt es nicht in Windows Forms Anwendungen und ich kenne so etwas höchstens aus Access-Projekten. Unklar ist, was gemeint ist. Ich vermute, es geht um ein DataGrid, welches an den Member “Contacts” in einem DataSet gebunden ist, möglicherweise über ein BindingSource-Objekt.
     
    Da bei beiden ComboBoxes die ValueMember-Eigenschaft an die Tabelle “Contacts” gebunden ist, können diese Boxes nicht noch voneinander über eine DataRelation abhängig sein. Sie sind nur von den Fremdschlüsseln in Contact abhängig. Sie sind voneinander unabhängige Nachschlagetabellen. Denkbar ist eine Abhängigkeit des Listenumfanges. Wenn das so ist, dann liegt eine Hierarchie in 3 Ebenen vor. In diesem Fall ist jedoch ein Fremdschlüssel in “Contacts” überflüssig und wirkt nur stören bzw. kann nur ungebunden zur Information angezeigt werden.
     
    Du solltest also erst einmal Dein Datenmodell genauer durchleuchten und, falls Du Hilfe benötigst, auch offenlegen.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 8. August 2012 19:35
  • Hallo Peter,

    hast recht, um es einigermaßen kurz zu fassen, ist das ganz zu "umgangssprachlich" geworden...

    Das Formular beinhaltet mehrere Controls (DataGridView, Textboxes, Comboboxes, etc.), die an BindingSource "bsCustomerContacts" gebunden sind:

    Me.txtContactsFirstname.DataBindings.Add("Text", Me.dl.bsCustomerContacts, "firstname")
    Me.cbxContactsDepartment.DataBindings.Add("SelectedValue", Me.dl.bsCustomerContacts, "department")
    Me.cbxContactsPosition.DataBindings.Add("SelectedValue", Me.dl.bsCustomerContacts, "position_id")

    Für die beiden DataTable "Department" und "Position" existiert eine DataRelation im DataSet:

    Me.dsContacts.Tables.Add(Me.dtContactDepartment)
    Me.dsContacts.Tables.Add(Me.dtContactPosition)
    Me.dtContactDepartment.PrimaryKey = New DataColumn() {Me.dtContactDepartment.Columns("value")}
    Dim relationDepartmentPositions As New DataRelation("ParentChildPositions", Me.dtContactDepartment.Columns("value"), Me.dtContactPosition.Columns("department"), True)
    Me.dsContacts.Relations.Add(relationDepartmentPositions)

    So bekommen die beiden relevanten ComboBoxes im Formular Ihre Listeneinträge:

    Me.cbxContactsDepartment.DataSource = Me.dsContacts
    Me.cbxContactsDepartment.ValueMember = "ContactDepartment.value"
    Me.cbxContactsDepartment.DisplayMember = "ContactDepartment.display"
    Me.cbxContactsPosition.DataSource = Me.dsContacts
    Me.cbxContactsPosition.ValueMember = "ContactDepartment.ParentChildPositions.id"
    Me.cbxContactsPosition.DisplayMember = "ContactDepartment.ParentChildPositions.name"

    Ist das so einigermaßen nachvollziehbar?

    Viele Grüße, Jan


    • Bearbeitet Jan Kornblum Freitag, 10. August 2012 09:05 Fehler
    Freitag, 10. August 2012 09:04
  • Hi Jan,
    so ist der erste Teil klar. Ich hatte mir es in etwa schon so gedacht, weil es das typische Clicki-Bunti-Ergebnis ist.
     
    Es fehlt aber eine Erklärung zum zweiten Teil:
     
    Du hast jetzt eine 2-stufige Hierarchie:
     
    Child ist bsCustomerContacts mit Fremdschlüssel1 "department" und Fremdschlüssel2 "position_id". “dtContactDepartment” und “dtContactPosition” sind logisch die Master dazu. Sie völlig gleichrangig und eine DataRelation zwischen ihnen ohne Bedeutung bzw. nur störend.
     
    Was Du willst, ist aus den Darlegungen nicht eindeutig erkennbar.
     
    Ich vermute, dass Du eine 3-stufige Hierarchie wünschst:
     
    Child ist bsCustomerContacts mit Fremdschlüssel "position_id" zu Master “dtContactPosition”.
    Master ist “dtContactPosition” mit Fremdschlüssel "department" zu Grandmaster “dtContactDepartment”.
    Grandmaster ist “dtContactDepartment”.
     
    Wenn Du im Child auch einen Feldinhalt (ID und/oder Bezeichnung) aus dem Grandmaster haben willst, dann füge passende berechnete Felder hinzu. Den jetzigen Fremdschlüssel1 "department" in der Child-Tabelle brauchst Du nicht, da er sich IMMER eindeutig über die Beziehung aus dem Fremdschlüssel "department" ergibt. Da es diese eindeutige Beziehung gibt, ist auch keine Bindung erforderlich und es gibt keine störenden Konflikte beim Datensatzwechsel im Child.
     
    --
    Viele Gruesse
    Peter
    Freitag, 10. August 2012 10:24
  • Hi Peter,

    vielen Dank, dass du dir hier die Zeit nimmt.

    Clicki-Bunti ist es übrigens nicht, auch wenn der Eindruck entsteht. Lediglich die Controls ziehe ich in die Formulare, der gesamte Rest ist "Handarbeit" ;)

    Was ich erreichen möchte ist eigentlich (auch wenn das designtechnisch falsch ist, das ist mir bewußt, aber das war schon so) eine 2-stufige Hierarchie. Du sagt ja, und das muss ich ja auch gerade am eigenen Leib erfahren, dass dabei die Relation zwischen den beiden Masters hier "störend" ist. Aber ist es so trotzdem möglich bzw. lässt / ließe es sich mit meinem Ansatz so überhaupt realisieren?

    Ich werde das ganze nun umstellen auf eine 3-stufige Hierarchie, allerdings habe ich hier noch eine Frage:

    Wenn Du im Child auch einen Feldinhalt (ID und/oder Bezeichnung) aus dem Grandmaster haben willst, dann füge passende berechnete Felder hinzu.

    Das bezieht sich rein auf das GUI? Also wenn im Formular eben auch die 1. ComboBox angezeigt werden soll, dann muss diese "ungebunden" sein und der angezeigte Wert berechnet sich aus dem in ComboBox 2 ausgewähltem Eintrag? Nur wie realisiert man diese "Berechnung" am saubersten?

    • Anhand vom SelectedIndexChanged" von Combo 2 (welches ja beim Datensatzwechsel im Child eintritt) jeweils den Eintrag in Combo 1 selektieren?
    • Und in die "andere Richtung", wenn ich einen Datensatz "in ein anderes department verschieben" will, setze ich über das "SelectedIndexChanged" vom Combo 1 einen RowFilter auf die Datenquelle von Combo 2?

    Den jetzigen Fremdschlüssel1 "department" in der Child-Tabelle brauchst Du nicht, da er sich IMMER eindeutig über die Beziehung aus dem Fremdschlüssel "department" ergibt. Da es diese eindeutige Beziehung gibt, ist auch keine Bindung erforderlich und es gibt keine störenden Konflikte beim Datensatzwechsel im Child.

    OK, das ist klar...

    Viele Grüße, Jan

    Freitag, 10. August 2012 11:05
  • Hi Peter,

    habe eine Lösung gefunden für die 3-stufige Hierarchie, so dass sie dann im GUI aussieht, wie ich ursprünglich wollte, und die mir sauber erscheint. Unterschiedliche Select/Update/Insert-Commands des TableAdapeters:

    • Das SelectCommand des Child-Adapters selektiert die "contacts" gejoined mit den "positions". So habe ich im DataTable zusätzlich eine "department_id" (so können beim Blättern durch die Datensätze jeweils die richtigen Einträge für "department"  in der 1. Combo angezeigt werden)
    • Das Insert- sowie das UpdateCommand hingegen, speichert "department_id" einfach nicht mit zurück in die DB, da es dieses Feld nach der neuen Hierarchie in der Tabelle "contacts" ja nicht mehr gibt
    • Beim Editieren der Datensätze dann kann ich über das SelectedIndexChanged der 1. Combobox einen passenden RowFilter für den DataTable der 2. Combo setzen

    Eigentlich blöde, hatte das genauso schon einmal realisiert, allerdings waren da die beiden abhängigen "Combos" in einem GridView, also jeweils DataGridViewComboBoxColumns. Das war auch anfangs eine 2-stufige Hierarchie, die mir stets ein Dorn im Auge war...

    Also, das wird so funktionieren, aber mich interessiert deine Meinung zu diesem Ansatz...

    Viele Grüße und ein schönes WE, Jan

    Freitag, 10. August 2012 15:19
  • Hi Jan,
    der Ansatz ist im Prinzip richtig.

    Es ist aber nicht nötig, über JOIN die "department_id" zu holen. Das geht einfacher über berechnete Spalten, da für JOIN eine separate Abfrage erforderlich ist, und, wenn mit typsierten DataSets und TableAdpater gearbeitet wird, ist das zusätzlicher Aufwand.

    Auch ist kein SelectedIndesChanged erforderlich, wenn hierarchische Bindingsources genutzt werden. Sie folgen automatisch den Änderungen.

    Wie ich das mit den berechneten Spalten und den BindingSource meine, habe ich im folgenden Beispiel dargestellt. Der Code ist einfach in den Codeteile einer leeren Form eines Windows-VB-Projektes zu kopieren.

    Public Class Form1
    
      Private grdChild As DataGridView
      Private pan As New Panel With {.Dock = DockStyle.Right}
      Private lblDepartment As New Label With {.Dock = DockStyle.Top, .Text = "Department"}
      Private cbDepartment As ComboBox
      Private lblPosition As New Label With {.Dock = DockStyle.Top, .Text = "Position"}
      Private cbPosition As ComboBox
      Private ds As New DataSet
      Private bsDepartment As BindingSource ' alle Departments
      Private bsPosition As BindingSource ' nur die Positions des ausgewählten Department
      Private bsContact As BindingSource ' alle Kontakte
    
      Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.Width = 900
        ds = GetDataSet()
        '
        bsContact = New BindingSource(ds, "Contact")
        grdChild = New DataGridView With {.Dock = DockStyle.Left, .DataSource = bsContact, .Width = 650}
        '
        bsDepartment = New BindingSource(ds, "Department")
        cbDepartment = New ComboBox With {.Dock = DockStyle.Top, .DataSource = bsDepartment, .DisplayMember = "Bezeichnung", .ValueMember = "ID"}
        cbDepartment.DataBindings.Add("SelectedValue", bsContact, "DepartmentID")
        '
        bsPosition = New BindingSource(bsDepartment, "DepPos")
        cbPosition = New ComboBox With {.Dock = DockStyle.Top, .DataSource = bsPosition, .DisplayMember = "Bezeichnung", .ValueMember = "ID"}
        cbPosition.DataBindings.Add("SelectedValue", bsContact, "FK")
        '
        Me.pan.Controls.AddRange(New Control() {cbPosition, lblPosition, cbDepartment, lblDepartment})
        Me.Controls.AddRange(New Control() {grdChild, pan})
      End Sub
    
      Private Function GetDataSet() As DataSet
        '
        ' DataSet und Tabellen
        '
        Dim ds As New DataSet
        Dim dt1 As New DataTable("Department")
        With dt1
          With ..Columns
            With ..Add("ID", GetType(Integer))
              .AutoIncrement = True
              .AutoIncrementSeed = 1
              .AutoIncrementStep = 1
            End With
            .Add("Bezeichnung", GetType(String))
          End With
        End With
        ds.Tables.Add(dt1)
        Dim dt2 As New DataTable("Position")
        With dt2
          With ..Columns
            With ..Add("ID", GetType(Integer))
              .AutoIncrement = True
              .AutoIncrementSeed = 1
              .AutoIncrementStep = 1
            End With
            .Add("FK", GetType(Integer))
            .Add("Bezeichnung", GetType(String))
          End With
        End With
        ds.Tables.Add(dt2)
        Dim dt3 As New DataTable("Contact")
        With dt3
          With ..Columns
            With ..Add("ID", GetType(Integer))
              .AutoIncrement = True
              .AutoIncrementSeed = 1
              .AutoIncrementStep = 1
            End With
            .Add("FK", GetType(Integer))
            .Add("Bezeichnung", GetType(String))
          End With
        End With
        ds.Tables.Add(dt3)
        '
        ' Daten
        '
        For i = 1 To 5
          Dim r1 = dt1.NewRow
          r1("Bezeichnung") = String.Format("Department {0}", i)
          dt1.Rows.Add(r1)
          For k = 1 To 5
            Dim r2 = dt2.NewRow
            r2("Bezeichnung") = String.Format("Position {1} {0}", i, k)
            r2("FK") = r1("ID")
            dt2.Rows.Add(r2)
            For l = 1 To 10
              Dim r3 = dt3.NewRow
              r3("Bezeichnung") = String.Format("Contact {2} {1} {0}", i, k, l)
              r3("FK") = r2("ID")
              dt3.Rows.Add(r3)
            Next
          Next
        Next
        '
        ' Tabellenbeziehungen
        '
        ds.Relations.Add(New DataRelation("DepPos", dt1.Columns("ID"), dt2.Columns("FK")))
        ds.Relations.Add(New DataRelation("PosCon", dt2.Columns("ID"), dt3.Columns("FK")))
        '
        ' berechnete Felder
        '
        dt2.Columns.Add("Department", GetType(String), "Parent(DepPos).Bezeichnung")
        dt3.Columns.Add("Department", GetType(String), "Parent(PosCon).Department")
        dt3.Columns.Add("Position", GetType(String), "Parent(PosCon).Bezeichnung")
        dt2.Columns.Add("DepartmentID", GetType(Integer), "Parent(DepPos).ID")
        dt3.Columns.Add("DepartmentID", GetType(Integer), "Parent(PosCon).DepartmentID")
        '
        Return ds
      End Function
    
    End Class
    

    --
    Viele Gruesse
    Peter

    • Als Antwort markiert Jan Kornblum Dienstag, 14. August 2012 14:52
    Samstag, 11. August 2012 14:18
  • Hi Peter,

    genial! Vielen Dank :)

    Grüße, Jan

    Dienstag, 14. August 2012 14:52