Filtern der Bindingsource EDIT: Fehler gefunden

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Filtern der Bindingsource EDIT: Fehler gefunden

    Hallo,

    ich habe auf meiner Form einmal ein DGV und einmal daneben ein DetailView, aber von dem Fremdschlüssel-Datensatz des ausgewählten Datensatzes.
    Ich habe eine ReceiveTable und über Fremdschlüssel verbundene übergeordnete SensorTable. Im DGV werden Daten von ReceiveTable angezeigt plus über ComboBoxCell noch ein Wert von der SensorTable. Rechts werden die Daten von der SensorTable angezeigt.

    Damit ich rechts die aktuelle Daten angezeigt bekomme, muss ich die SensorBindingsource filtern, nach Fremdschlüssel-ID. Das klappt auch soweit, das Problem ist nur, wenn ich es filtere, kriege ich im DGV auch nur den aktuellen Wert angezeigt, nur beim ausgewählten Datensatz. Alle anderen bleiben leer, weil die Sensorbindingsource ja gefiltert ist (es hat schon gedauert rauszufinden, dass es daran liegt :evil: ).

    Kann ich es überhaupt realisieren, dass ich links alle Datensätze der ReceiveTable angezeigt bekomme, inkl. eines Wertes von SensorTable und rechts die ausgewählten Daten der SensorTable?

    Danke.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sonne75“ ()

    ich peile mal wieder nicht die Zusammenhänge, aber prinzipiell ist das sicher möglich.
    vlt. machst du den Fehler, zuviele Sachen an dieselbe BS zu binden - dann hat das natürlich Wechselwirkung.
    Soll der eine View gefiltert sein, der annere nicht (oder anners), dann kann man nicht beide an dieselbe Bs hängen.
    Mein Detailview soll einen Datensatz vom zugehörigen Fremdschlüssel anzeigen.
    Ich habe ID, Channel, SensorID im DGV, der Datensatz vom zugehörigen SensorID soll daneben angezeigt werden. Die Bindingsource vom SensorID und dem DetailView daneben ist bisher die Gleiche. Darf ich sie trennen?
    Ich habe jetzt TestSolution gemacht und dann habe ich das mit 2 Bindingsourcen ausprobiert, es funktioniert super. :thumbup:

    Allerdings habe ich ein anderes Problem: ich bekomme vom anderen Thread ein Event in frmMain, da wurde ein Datensatz verändert. Wenn ich in diesem Event einen Breakpoint setze und nachschaue, sind die Daten verändert. Nur leider aktualisiert sich die Anzeige nicht. ;(
    Ich habe auch schon eine Test-Sub erstellt, die ich mit BeginInvoke aus dem Event aufrufe, da schaue ich nochmal den Datensatz an, er ist immer noch verändert. Es gibt nur den einen Datensatz für diese Tabelle, in der Testsolution zeigt er alles automatisch an (mit Buttonklick werden die Daten verändert), sogar ohne Bindingsource.MoveFirst(). Ich habe es bei mir mit und ohne versucht, den Datensatz nochmal in der Test-Sub verändert - es wird nichts angezeigt (bzw. die alten Daten).

    Weißt du, was ich noch ausprobieren könnte?
    Ich weiß, ich dachte, wenn sich das Problem mit 2 Bindingsourcen gelöst hat, brauche ich das nicht... Ich habe für DGV einfach eine andere Bindingsource genommen.

    Aber beim anderen Problem kann ich es nicht so leicht nachstellen, weil ich einen anderen Thread brauche. Wobei, das könnte ich trotzdem machen, braucht nur etwas Zeit.

    @ErfinderDesRades

    Habe jetzt nachgestellt, es liegt tatsächlich am Thread, die Daten werden zwar im DataSet verändert, aber nicht angezeigt.
    Dateien
    • TestBinding.zip

      (570,79 kB, 130 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    Was ich seltsam finde: andere Tabellen bearbeite ich auch im anderen Thread, das funktioniert wunderbar. Der einzige Unterschied: die anderen Datensätze werden über DGV ausgewählt und Bindingsource dann angepasst. ?(

    EDIT: jetzt habe ich nochmal in der Testsolution geschaut: plötzlich geht es, wenn die Daten erst im Hauptthread verändert werden (vorher ging es definitiv nicht), aber wenn noch im Event in frmMain, der noch im anderen Thread läuft, dann nicht. ?(

    EDIT2: Der Unterschied zwischen den anderen Änderungen, die funktionieren, und denen, die nicht funktionieren: bei ersten übergebe ich die typ. DataRow, bei zweiten das DataSet. Vielleicht liegt es daran.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()

    bei mir schon:

    VB.NET-Quellcode

    1. Private Sub ChannelDataGridView_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles ChannelDataGridView.DataError
    2. e.Cancel = True
    3. End Sub
    4. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    5. _worker = New Worker(True)
    6. End Sub
    7. Private Sub DataReady(ByVal sender As Object, ByVal e As EventArgs) Handles _worker.DataReady
    8. Me.BeginInvoke(Sub() Test())
    9. 'Test() 'das failt - aber nur halb: Die Daten werden geändert, aber die Bindings binden ins Nirvana
    10. End Sub
    11. Private Sub Test()
    12. Dim rwInfo = DataSet1.Info(0)
    13. rwInfo.MinTime += 1
    14. rwInfo.BaseID += 2
    15. End Sub

    sonne75 schrieb:

    Aber wenn du die Daten noch im Event veränderst


    Ich meinte so:


    ErfinderDesRades schrieb:

    bei mir schon:

    VB.NET-Quellcode

    1. Private Sub ChannelDataGridView_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles ChannelDataGridView.DataError
    2. e.Cancel = True
    3. End Sub
    4. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    5. _worker = New Worker(True)
    6. End Sub
    7. Private Sub DataReady(ByVal sender As Object, ByVal e As EventArgs) Handles _worker.DataReady
    8. Dim rwInfo = DataSet1.Info(0)
    9. rwInfo.MinTime += 1
    10. rwInfo.BaseID += 2
    11. End Sub
    12. ' Private Sub Test()
    13. ' Dim rwInfo = DataSet1.Info(0)
    14. ' rwInfo.MinTime += 1
    15. ' rwInfo.BaseID += 2
    16. 'End Sub





    @ErfinderDesRades
    Auf jeden Fall sieht es bei mir so jetzt aus (im echten Projekt):

    VB.NET-Quellcode

    1. Private Sub InfoDataReady(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles InfoReg.DataReady
    2. Me.BeginInvoke(Sub() Test())
    3. End Sub
    4. Private Sub Test()
    5. Dim rwInfo = (From inf In DtsSTCModbus.Info)(0)
    6. rwInfo.MinResponseTime = 100
    7. InfoBindingSource.MoveFirst()
    8. End Sub


    Und es wird nicht mal die "MinResponseTime" verändert (beim Haltepunkt sieht man schon, dass die Werte alle richtig sind).

    EDIT2:
    Oh Mann, ich habe den Fehler gefunden, ich habe die Bindingsource falsch erstellt (nicht direkt vom DataSet, sondern von der übergeordneten Tabelle). :evil:

    Jetzt werden die Werte angezeigt, danke schön!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sonne75“ ()