.
Anmeldung | Registrieren | Hilfe
in Suchen

RowFilter auf Relation?

Letzter Beitrag 23. Mrz 2010 12:20 von hepter. 5 Antworten.
Seite 1 von 1 (6 Treffer)
Beiträge sortieren: Zurück Weiter
  • 12. Mrz 2010 12:48

    • hepter
    • Top 150 Mitwirkender
    • Registriert am 12. Mrz 2010
    • Beiträge 10
    • Punkte 80

    RowFilter auf Relation?

    Hallo Zusammen,

    ich bin noch neu hier und hoffe dass mir jemand helfen kann. Ich entwickle eine Datenbankanwendung mit C# als WindowsFormsApplication. In einem Fenster habe ich ein DataGridView für Masterdaten und eines für Detaildatensätze.
    Die Daten sind über eine 1:n Relation miteinander verbunden.
    Die Bindung sieht wie folgt aus:

    Es gibt 1 Tabelle "Systeme" mit den Masterdaten, eine Tabelle "Einzelteile" mit den Detaildaten und eine Relation "Systeme_Einzelteile" Durch die folgende Bindung sind die Daten synchron. D.h. wähle ich im ersten Grid ein System aus sehe ich automatisch im zweiten die Detaildatensätze. Nun möchte ich das Detailgrid aber noch über eine Dataview und den RowFilter filtern. Ich finde leider keine Möglichkeit dies zu tun.

                dgvSysteme.DataSource = this.metaDataSet.Systeme.DefaultView;
                dgvEinzelteile.DataSource = this.metaDataSet.Systeme.DefaultView;
                dgvEinzelteile.DataMember = "Systeme_Einzelteile";

    Probiert habe ich bereits:

    this.metaDataSet.Relations["Systeme_Einzelteile"].ChildTable.DefaultView.RowFilter = "MSN=4";
    oder auch:
    this.metaDataSet.Einzelteile.DefaultView.RowFilter = "MSN=4";

    Beides ist meiner Meinung nach das gleich aber leider falsch...

    So ich hoffe ich habe das Problem verständlich umschrieben.

    Vielen Dank für jede Art von Hilfe.

    Viele Grüße,

    hepter

    • IP-Adresse ist Registriert
  • 12. Mrz 2010 14:25 Antwort zu

    • akk
    • Top 50 Mitwirkender
    • Registriert am 24. Nov 2009
    • Beiträge 49
    • Punkte 725

    RowFilter auf Relation?

    Das Problem läßt sich lösen, wenn zwei Instanzen der Klasse System.Windows.Forms.BindingSource genutzt werden:

    BindingSource1.DataSource = metaDataSet;
    BindingSource1.DataMember = "System";
    BindingSource2.DataSource = BindingSource1;
    BindingSource2.DataMember = "System_Einzelteile";
    dgvSystem.DataSource = BindingSource1;
    dgvEinzelteile.DataSource = BindingSource2;

    Der gewünschte RowFilter ist an BindingSource2.Filter zu setzen.

    • IP-Adresse ist Registriert
  • 12. Mrz 2010 14:54 Antwort zu

    • hepter
    • Top 150 Mitwirkender
    • Registriert am 12. Mrz 2010
    • Beiträge 10
    • Punkte 80

    RowFilter auf Relation?

    Vielen vielen Dank. Ich habe es auch schonmal mit BindingSources probiert aber irgendwas muss ich falsch gemacht haben. Aber wenn man eine Woche vor so etwas sitzt und nicht weiter kommt, sieht man manchmal den Wald vor lauter Bäumen nicht.

    Also vielen Dank nochmal.
    • IP-Adresse ist Registriert
  • 19. Mrz 2010 11:00 Antwort zu

    • hepter
    • Top 150 Mitwirkender
    • Registriert am 12. Mrz 2010
    • Beiträge 10
    • Punkte 80

    RowFilter auf Relation?

    Hallo nochmal,

    nachdem ich dachte, dass die Lösung wunderbar funktioniert habe ich erst diese Woche einen Fehler bemerkt.
    Sowohl die Mastertablle als auch die Detailtabelle haben eine Spalte mit dem Namen "MSN". Ich hatte den Filter ensprechend gesetzt:
    BindingSource2.Filter = "MSN <= 4". Mir ist bisher nicht aufgefallen, dass damit nur nochmal die Mastertabelle gefiltert wird, da sich die MSN nur selten unterscheidet.

    Nach etwas Suche habe ich rausgefunden, dass dies über die Child.MSN Expression funktionieren sollte. Leider bekomme ich da aber eine Fehlermeldung: Child kann an Position x nicht interpretiert werden... Auch das Aggregieren durch Sum() .. funktioniert nicht.

    Hat jemand einen Tipp wie es funktionieren könnte?

    Vielen Dank
    • IP-Adresse ist Registriert
  • 20. Mrz 2010 12:37 Antwort zu

    • akk
    • Top 50 Mitwirkender
    • Registriert am 24. Nov 2009
    • Beiträge 49
    • Punkte 725

    RowFilter auf Relation?

    Antworten

    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

    • IP-Adresse ist Registriert
  • 23. Mrz 2010 12:20 Antwort zu

    • hepter
    • Top 150 Mitwirkender
    • Registriert am 12. Mrz 2010
    • Beiträge 10
    • Punkte 80

    RowFilter auf Relation?

    Bin leider erst heute dazu gekommen mich wieder mit dem Thema zu beschäftigen, danke aber für die zeitnahe Antwort.
    Ich habe die Daten beim Debuggen entsprechend überprüft und das was du sagst stimmt und funktioniert auch so.
    Mein Problem war, dass ich zuerst den Filter für die MSN auf die Systeme angewendet habe wodurch ein CellEnter event ausgelöst wurde, was wiederum die Datenreihe auswertet und dazu auch wieder den Filter benutzt. Erst danach wurde der Filter Auf die Einzelteiltabelle gesetzt und wieder das Event ausgelöst. Durch die Ausführungsreihenfolge kam es schließlich dazu dass der Filter am Ende einfach wieder gelöscht war. Ich habe mir den Filterstring zwischengespiechert und am Ende der Auswertung von CellEnter wieder reingesetzt. Dadurch funktioniert das ganze jetzt, auch wenn mein Code nun vielleicht etwas unsauber vorgeht.
    Deine Antwort hat aber sehr zu meinem Verständnis beigetragen.

    Also vielen Dank nochmals.
    • IP-Adresse ist Registriert
Seite 1 von 1 (6 Treffer)

WPF Forum | ASP.NET Forum | ASP.NET MVC Forum | Silverlight Forum | Windows Phone 7 Forum | SharePoint Forum | Dotnet Jobs | Dotnet Termine | Developer Blogs | Dotnet News

Das Team | Regeln | Impressum