Performanceproblem bei Datenübergabe an neue Form

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Performanceproblem bei Datenübergabe an neue Form

    Hallo,
    ich gebe Detailinformationen zu einem Datensatz in einer neuen Form aus. Das öffnen der Form dauert aber verhältnismässig lange.

    Den Aufruf habe ich wie folgt:

    VB.NET-Quellcode

    1. Using frmInfo As New frmInfo
    2. With frmInfo
    3. .T_PERSONBindingSource.DataSource = Me.T_PERSONBindingSource.Current
    4. .T_AUFBindingSource.DataSource = Me.T_AUFBindingSource
    5. .T_AUFENTHALTBindingSource.DataSource = Me.T_AUFENTHALTBindingSource
    6. .ShowDialog()
    7. End With
    8. End Using
    ´
    kan man den Aufruf der Form frmInfo beschleunigen?

    Auch der Aufbau des Datagridviews auf der neuen Form geht dann recht langsam, Feld für Feld, von statten.

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

    Ok, ich habs nun angepasst:

    VB.NET-Quellcode

    1. Using frmInfo As New frmInfo
    2. With frmInfo
    3. .T_PERSONBindingSource.DataSource = Me.T_PERSONBindingSource.Current
    4. .T_AUFBindingSource.DataSource = Me.KDTS
    5. .T_AUFENTHALTBindingSource.DataSource = Me.KDTS
    6. .ShowDialog()
    7. End With
    8. End Using


    erhalte nun aber die Meldung:
    System.ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
    Parametername: index
    bei System.Collections.ArrayList.get_Item(Int32 index)
    ...
    Das hast du aber nicht, da sollst du die Datasource der Bindingsource mit Dataset von der Aufrufform verwenden (siehe Zeile #3)...
    In welcher Zeile entsteht der Fehler?

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

    @VB1963:: sieht mir aus wie eine Vorstufe von meiner Vorgehensweise für Edit-Dialoge für einzelne Datensätze.
    Gucks dir mal an - das ist eine weitere Seite von (formübergreifendem) Databinding mit BindingSources.

    (Bei mir haut das aber nicht die Performance inn Keller.)

    VB1963 schrieb:

    Du meinst also dur die Daten der T_PERSONBindingSource in der aktuellen Position...
    Da kannst du gleich die aktuelle DataRow der InfoForm übergeben...

    Hallo,

    ja, ich benötige von T_Person nur den aktuellen Datensatz und aus 2 weiteren Tabellen alle zugehörigen. Ich gebe zu Personen eine Liste von Aufenthalten an, diese werden in einem Datagridview ausgegeben.
    Der Aufbau dieser Tabelle läuft in Zeitraffer, feld für Feld ab.

    so übergebe ich die Daten an die Form:

    VB.NET-Quellcode

    1. Using frmPatInfo As New frmPatInfo
    2. With frmPatInfo
    3. .T_PERSONBindingSource.DataSource = Me.T_PERSONBindingSource.Current
    4. .T_AUFNAHMEENTLASSUNGBindingSource.DataSource = Me.T_AUFNAHMEENTLASSUNGBindingSource
    5. .T_AUFENTHALTBindingSource.DataSource = Me.T_AUFENTHALTBindingSource
    6. .ShowDialog(Me)
    7. End With
    8. End Using
    @ErfinderDesRades:
    Ich hab's mir angeschaut - das ist ja wieder einmal ganz was Tolles :) , da geht's ja bereits ohne Code ab!
    Kann man die beiden Erweiterungen .EditCurrent und .EditNew so ohne weiteres in den alten DBExtensions integrieren?

    @nemesis:
    Ich war gestern ohne VS nicht ganz bei der Sache - In welcher Zeile tritt bei dir der Fehler denn jetzt auf?
    Ich habe es et mit einer Tabelle nachgestellt, bei mir geht das ohne Fehler und zeigt mir gleich den ausgewählten Datensatz an und ohne Performance-Einbuße.
    ...aber schaue dir einmal EDR's oben angeführten Link 'Edit-Dialoge für einzelene Datensätze' an :), da wirst du staunen...

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

    das habe ich bereits, aber werde nicht ganz schlau, wie ich das auf mein "Problem" anwenden soll, ich möchte ja nicht einen einzelnen Datensatz editieren, sondern mehrere Darstellen, also sollte es doch genügen, wenn ich díe, bereits im Projekt vorhandenen Daten an die neue Form übergebe?

    Die Konstelation, die in der Detailform in einem Datagridview ausgegeben werden soll ist folgende:

    [Person]
    -ID
    -Name

    [Ereignis]
    -ID
    -Datum
    -PersonID

    [Aufenthalt]
    -ID
    -Kommen-Ereignis-ID
    -Gehen-Ereignis-ID
    -PersonID

    die Form gibt dann aber immer nur die Daten zu einer einzelnen Person aus, desshalb genügt hier Bindingsource.current, bei den anderen beiden Tabellen benötige ich aber alle passenden Datensätze
    Deine Relationen zu den 3 Tabellen wollte ich wissen, wie deine Tabellen verknüpft sind...
    etwa wie: FK_Person_Ereignis, FK_Person_Aufenthalt (Beziehung oder Fremdschlüsseleinschränkung)

    VB.NET-Quellcode

    1. Using frmPatInfo As New frmPatInfo
    2. With frmPatInfo
    3. .T_PERSONBindingSource.DataSource = Me.T_PERSONBindingSource.Current 'ParentTabelle
    4. .T_AUFNAHMEENTLASSUNGBindingSource.DataSource = Me.T_PERSON_T_AUFNAHMEENTLASSUNGBindingSource.Current 'ohne Current -> alle zugehörigen DataRows
    5. .T_AUFENTHALTBindingSource.DataSource = Me.T_PERSON_T_AUFENTHALTBindingSource.Current 'ohne Current -> alle zugehörigen DataRows
    6. .ShowDialog(Me)
    7. End With
    8. End Using

    ...dann sollten nur die aktuell ausgewählten Datensätze angezeigt werden - soferne die Namen der Bindingsourcen passt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB1963“ ()

    Quellcode

    1. [Aufenthalt]
    2. -ID
    3. -Kommen-Ereignis-ID <-- FK zur Ereignis-ID
    4. -Gehen-Ereignis-ID <-- FK zur Ereignis-ID
    5. -PersonID <-- FK zur Person-ID
    6. [Person]
    7. -ID
    8. -Name
    9. [Ereignis]
    10. -ID
    11. -Datum
    12. -PersonID

    Die Tabelle Aufenthalt zeige ich dann in dem Datagridview an und anstatt der beiden Fremschlüssel zum Ereignis, wird das Datum des Ereignisses angezeigt (über Combobox-Feld)
    Es werden mir auch alle Daten korrekt angezeigt, nur dauert der Aufbau eben recht lange