Völlig unabhängig davon, ob Felder gleichen Namens in der Mastertabelle (Systeme) und der Detailtabelle (Einzelteile) vorhanden sind, bezieht sich ein Filter immer auf das Feld der Tabelle, die tatsächlich die Daten der BindingSource bereitstellt. Ist also BindingSource2.DataSource = BindingSource1 und BindingSource2.DataMember = "Systeme_Einzelteile", wobei Systeme_Einzelteile der Name der Relation zwischen den Tabellen Systeme und Einzelteile ist, dann stellt BindingSource2.Filter = "MSN <= 4" eine Einschränkung der Zeilen aus der Tabelle Einzelteile da. Die Einträge der Tabelle Systeme sind davon nicht betroffen. Während des Debuggens ist das wie folgt zu verifizieren: nach Setzen des Filters (vorausgesetzt mindestens eine Detailzeile erfüllt die Bedingung) sollte an BindingSource2.Current ein Objekt des Types System.Data.DataRowView enthalten sein. Deren Eigenschaft DataView sollte vom Type System.Data.RelatedView sein. In dieser DataView ist der gesetzte Filter in der Eigenschaft RowFilter wiederzufinden, die zugrunde liegende Tabelle befindet sich in der Eigenschaft Table und sollte die Einzelteile-Tabelle sein.
Im nachstehende VB-Code ist dieses Verhalten gezeigt (Code, der durch den Designer erstellt wurde, ist in einer Region geklammert). Die Tabellen Systems (PKey, Description, MSN) und Parts (PKey, SystemPKey, Description, MSN), sowie die Relation Systems.PKey ./. Parts.SystemPKey werden direkt im Code erstellt, wie auch die BindingSources Systems und Parts, die DataGridViews dgvSystems und dgvParts, sowie txtFilter und btnSetFilter zum Modifizieren des Filters an der BindingSource Parts (siehe btnSetFilter_Click()). Gerne bin ich bereit, mir den nicht funktionierenden Code anzusehen, falls Bedarf besteht.
Public Class Form1
Inherits System.Windows.Forms.Form
#Region "automatisch vom Designer generierter Code"
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Wird vom Windows Form-Designer benötigt.
Private components As System.ComponentModel.IContainer
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Dim dtSystems As System.Data.DataTable
Dim dtParts As System.Data.DataTable
Me.Systems = New System.Windows.Forms.BindingSource(Me.components)
Me.Parts = New System.Windows.Forms.BindingSource(Me.components)
Me.dgvSystems = New System.Windows.Forms.DataGridView
Me.dgvParts = New System.Windows.Forms.DataGridView
Me.SystemsDataSet = New System.Data.DataSet
Me.DataColumn1 = New System.Data.DataColumn
Me.DataColumn2 = New System.Data.DataColumn
Me.DataColumn3 = New System.Data.DataColumn
Me.DataColumn4 = New System.Data.DataColumn
Me.DataColumn5 = New System.Data.DataColumn
Me.DataColumn6 = New System.Data.DataColumn
Me.DataColumn7 = New System.Data.DataColumn
Me.PKeyDataGridViewTextBoxColumn1 = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.DescriptionDataGridViewTextBoxColumn1 = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.MSNDataGridViewTextBoxColumn1 = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.PKeyDataGridViewTextBoxColumn = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.SystemPKeyDataGridViewTextBoxColumn = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.DescriptionDataGridViewTextBoxColumn = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.MSNDataGridViewTextBoxColumn = New System.Windows.Forms.DataGridViewTextBoxColumn
Me.txtFilter = New System.Windows.Forms.TextBox
Me.btnSetFilter = New System.Windows.Forms.Button
dtSystems = New System.Data.DataTable
dtParts = New System.Data.DataTable
CType(Me.Systems, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.Parts, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.dgvSystems, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.dgvParts, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.SystemsDataSet, System.ComponentModel.ISupportInitialize).BeginInit()
CType(dtSystems, System.ComponentModel.ISupportInitialize).BeginInit()
CType(dtParts, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'Systems
'
Me.Systems.DataMember = "Systems"
Me.Systems.DataSource = Me.SystemsDataSet
'
'Parts
'
Me.Parts.DataMember = "Systems_Parts"
Me.Parts.DataSource = Me.Systems
'
'dgvSystems
'
Me.dgvSystems.AutoGenerateColumns = False
Me.dgvSystems.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
Me.dgvSystems.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.PKeyDataGridViewTextBoxColumn1, Me.DescriptionDataGridViewTextBoxColumn1, Me.MSNDataGridViewTextBoxColumn1})
Me.dgvSystems.DataSource = Me.Systems
Me.dgvSystems.Location = New System.Drawing.Point(12, 55)
Me.dgvSystems.Name = "dgvSystems"
Me.dgvSystems.Size = New System.Drawing.Size(881, 175)
Me.dgvSystems.TabIndex = 1
'
'dgvParts
'
Me.dgvParts.AutoGenerateColumns = False
Me.dgvParts.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
Me.dgvParts.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.PKeyDataGridViewTextBoxColumn, Me.SystemPKeyDataGridViewTextBoxColumn, Me.DescriptionDataGridViewTextBoxColumn, Me.MSNDataGridViewTextBoxColumn})
Me.dgvParts.DataSource = Me.Parts
Me.dgvParts.Location = New System.Drawing.Point(12, 250)
Me.dgvParts.Name = "dgvParts"
Me.dgvParts.Size = New System.Drawing.Size(881, 175)
Me.dgvParts.TabIndex = 2
'
'SystemsDataSet
'
Me.SystemsDataSet.DataSetName = "NewDataSet"
Me.SystemsDataSet.Relations.AddRange(New System.Data.DataRelation() {New System.Data.DataRelation("Systems_Parts", "Systems", "Parts", New String() {"PKey"}, New String() {"SystemPKey"}, False)})
Me.SystemsDataSet.Tables.AddRange(New System.Data.DataTable() {dtSystems, dtParts})
'
'dtSystems
'
dtSystems.Columns.AddRange(New System.Data.DataColumn() {Me.DataColumn1, Me.DataColumn2, Me.DataColumn3})
dtSystems.Constraints.AddRange(New System.Data.Constraint() {New System.Data.UniqueConstraint("Constraint1", New String() {"PKey"}, False)})
dtSystems.TableName = "Systems"
'
'DataColumn1
'
Me.DataColumn1.ColumnName = "PKey"
'
'DataColumn2
'
Me.DataColumn2.ColumnName = "Description"
'
'DataColumn3
'
Me.DataColumn3.ColumnName = "MSN"
Me.DataColumn3.DataType = GetType(Integer)
'
'dtParts
'
dtParts.Columns.AddRange(New System.Data.DataColumn() {Me.DataColumn4, Me.DataColumn5, Me.DataColumn6, Me.DataColumn7})
dtParts.Constraints.AddRange(New System.Data.Constraint() {New System.Data.ForeignKeyConstraint("Systems_Parts", "Systems", New String() {"PKey"}, New String() {"SystemPKey"}, System.Data.AcceptRejectRule.None, System.Data.Rule.None, System.Data.Rule.None)})
dtParts.TableName = "Parts"
'
'DataColumn4
'
Me.DataColumn4.ColumnName = "PKey"
'
'DataColumn5
'
Me.DataColumn5.ColumnName = "SystemPKey"
'
'DataColumn6
'
Me.DataColumn6.ColumnName = "Description"
'
'DataColumn7
'
Me.DataColumn7.ColumnName = "MSN"
Me.DataColumn7.DataType = GetType(Integer)
'
'PKeyDataGridViewTextBoxColumn1
'
Me.PKeyDataGridViewTextBoxColumn1.DataPropertyName = "PKey"
Me.PKeyDataGridViewTextBoxColumn1.HeaderText = "PKey"
Me.PKeyDataGridViewTextBoxColumn1.Name = "PKeyDataGridViewTextBoxColumn1"
'
'DescriptionDataGridViewTextBoxColumn1
'
Me.DescriptionDataGridViewTextBoxColumn1.DataPropertyName = "Description"
Me.DescriptionDataGridViewTextBoxColumn1.HeaderText = "Description"
Me.DescriptionDataGridViewTextBoxColumn1.Name = "DescriptionDataGridViewTextBoxColumn1"
'
'MSNDataGridViewTextBoxColumn1
'
Me.MSNDataGridViewTextBoxColumn1.DataPropertyName = "MSN"
Me.MSNDataGridViewTextBoxColumn1.HeaderText = "MSN"
Me.MSNDataGridViewTextBoxColumn1.Name = "MSNDataGridViewTextBoxColumn1"
'
'PKeyDataGridViewTextBoxColumn
'
Me.PKeyDataGridViewTextBoxColumn.DataPropertyName = "PKey"
Me.PKeyDataGridViewTextBoxColumn.HeaderText = "PKey"
Me.PKeyDataGridViewTextBoxColumn.Name = "PKeyDataGridViewTextBoxColumn"
'
'SystemPKeyDataGridViewTextBoxColumn
'
Me.SystemPKeyDataGridViewTextBoxColumn.DataPropertyName = "SystemPKey"
Me.SystemPKeyDataGridViewTextBoxColumn.HeaderText = "SystemPKey"
Me.SystemPKeyDataGridViewTextBoxColumn.Name = "SystemPKeyDataGridViewTextBoxColumn"
'
'DescriptionDataGridViewTextBoxColumn
'
Me.DescriptionDataGridViewTextBoxColumn.DataPropertyName = "Description"
Me.DescriptionDataGridViewTextBoxColumn.HeaderText = "Description"
Me.DescriptionDataGridViewTextBoxColumn.Name = "DescriptionDataGridViewTextBoxColumn"
'
'MSNDataGridViewTextBoxColumn
'
Me.MSNDataGridViewTextBoxColumn.DataPropertyName = "MSN"
Me.MSNDataGridViewTextBoxColumn.HeaderText = "MSN"
Me.MSNDataGridViewTextBoxColumn.Name = "MSNDataGridViewTextBoxColumn"
'
'txtFilter
'
Me.txtFilter.Location = New System.Drawing.Point(12, 12)
Me.txtFilter.Name = "txtFilter"
Me.txtFilter.Size = New System.Drawing.Size(362, 20)
Me.txtFilter.TabIndex = 3
'
'btnSetFilter
'
Me.btnSetFilter.Location = New System.Drawing.Point(398, 13)
Me.btnSetFilter.Name = "btnSetFilter"
Me.btnSetFilter.Size = New System.Drawing.Size(27, 19)
Me.btnSetFilter.TabIndex = 4
Me.btnSetFilter.Text = "..."
Me.btnSetFilter.UseVisualStyleBackColor = True
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(905, 522)
Me.Controls.Add(Me.btnSetFilter)
Me.Controls.Add(Me.txtFilter)
Me.Controls.Add(Me.dgvParts)
Me.Controls.Add(Me.dgvSystems)
Me.Name = "Form1"
Me.Text = "Form1"
CType(Me.Systems, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.Parts, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.dgvSystems, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.dgvParts, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.SystemsDataSet, System.ComponentModel.ISupportInitialize).EndInit()
CType(dtSystems, System.ComponentModel.ISupportInitialize).EndInit()
CType(dtParts, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents Systems As System.Windows.Forms.BindingSource
Friend WithEvents Parts As System.Windows.Forms.BindingSource
Friend WithEvents dgvSystems As System.Windows.Forms.DataGridView
Friend WithEvents dgvParts As System.Windows.Forms.DataGridView
Friend WithEvents SystemsDataSet As System.Data.DataSet
Friend WithEvents DataColumn1 As System.Data.DataColumn
Friend WithEvents DataColumn2 As System.Data.DataColumn
Friend WithEvents DataColumn3 As System.Data.DataColumn
Friend WithEvents DataColumn4 As System.Data.DataColumn
Friend WithEvents DataColumn5 As System.Data.DataColumn
Friend WithEvents DataColumn6 As System.Data.DataColumn
Friend WithEvents DataColumn7 As System.Data.DataColumn
Friend WithEvents PKeyDataGridViewTextBoxColumn1 As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents DescriptionDataGridViewTextBoxColumn1 As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents MSNDataGridViewTextBoxColumn1 As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents PKeyDataGridViewTextBoxColumn As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents SystemPKeyDataGridViewTextBoxColumn As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents DescriptionDataGridViewTextBoxColumn As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents MSNDataGridViewTextBoxColumn As System.Windows.Forms.DataGridViewTextBoxColumn
Friend WithEvents txtFilter As System.Windows.Forms.TextBox
Friend WithEvents btnSetFilter As System.Windows.Forms.Button
#End Region
Private Sub btnSetFilter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetFilter.Click
Parts.Filter = txtFilter.Text
End Sub '<= hier BreakPoint setzen
End Class