vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 24.03.14 19:53

Hallo,
ich möchte Daten in ein FlexCell.Grid eintragen. Das dauert manchmal bis zu einer 1/2 Minute. Daher möchte ich das in einen anderen Thread auslagern.

Nun habe ich mich im Netz ein wenig umgesehen, und finde nicht den richtigen Ansatz.

Beim Backgroundworker bräuchte ich so wie ich das verstenden habe keinen Delegaten, jedoch ist mir unklar wie ich da DataRows oder DataTables übergeben kann.

Auf der anderen Seite ist mir aber auch unklar, wie ich das mit einem Delegaten und eigenem Thread bewerkstelligen kann.
Hier ist mal der Code wie ich die Befüllung im Mainthread bisher machte:
Private Sub FGrid_GetData(ByVal OZ As String)
        If BsMassen Is Nothing Then Return
        SetVorgang("Lese Daten zu Position")                        ' Anzeige 
        ' in der Statuszeile
        Dim DT As MassenDataTable = ProjDts.Massen
        Dim DV As New DataView(DT, "OZ LIKE '" & OZ & "'", "Adresse", _
          DataViewRowState.CurrentRows)
 
        Dim Zl As Integer = 0
        Try
            FGrid.Rows = DV.Count + 2
            For r As Integer = 0 To BsMassen.Count - 1
                Zl = r
                If intFN = 0 Then FGrid_SetHeader(FGrid) ' wenn kein Header 
                ' erzeugt wurde, dann jetzt
                FGrid.AutoRedraw = False
                FGrid.DisplayFocusRect = False
                EnableEvents = False
                FGrid.AllowUserResizing = FlexCell.ResizeEnum.Columns
                FGrid.Rows = BsMassen.Count + 2
                Dim MRow = DirectCast(DirectCast(DV.Item(r), DataRowView).Row, _
                  MassenRow)
                If MRow.OZ = aktOZ Then
                    Call Massenrow_to_FGridRow(FGrid, r + 1, MRow)      ' 
                    ' schreibt über eine Untersub die Zeile ins Grid
                    FGrid_Zeilenfomat(r + 1)                            ' passt 
                    ' das Format der Zeile an
                Else
                    FGrid.Rows = FGrid.Rows - 1                         ' eine 
                    ' Zeile abhacken
                End If
                ProgressVorgang(CInt(r / DV.Count * 100))               ' 
                ' Fortschritt anzeigen
            Next
            Dim z As Integer = FGrid.Rows - 1
            For c As Integer = 0 To DT.Columns.Count - 1
                FGrid.Cell(z, c).Text = vbNullString                    ' 
                ' letzte Zeile im Grid als Leerzeile
            Next
            FGrid.AutoRedraw = True
            FGrid.Refresh()
        Catch ex As Exception
            Debug.Print(String.Format("Fehler im Hauptform FGrid_GetData bei" & _
              "Zeile {0}", Zl))
        End Try
        EnableEvents = True
        SetVorgang("Lese Daten zu Position", True)                  ' 
        ' Statuszeile zurücksetzen
    End Sub
Könnt ihr mir bitte auf die Sprünge helfen?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Manfred X
Datum: 24.03.14 20:05

Hallo!

Warum stellst Du die FGrid-Eigenschaften für jede Zeile ein?

Wenn Du Daten direkt in ein Control füllst, läuft das eigentlich immer
in dem Thread in dem das Control erstellt worden ist.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 24.03.14 20:25

ja, mit den Eigenschaften hast Du Recht, die stelle ich an Anfang und Ende.

Bislang habe ich die Daten im Haupttread eingetragen, in dem wurde auch das Control erstellt.

Ausgelöst wird das durch das auswählen von Nodes eines TreeView-Elementes.

Wenn ich nun aber im TreeView so durchblättere, dauert das bis der Code wieder durch ist.
Alternativ könnte ich auch das befüllen durch prüfen einer Variablen abbrechen. Werden denn in dem Fall Variablen überhaupt verändert, wenn der Code im Haupttread bleibt und läuft?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: ErfinderDesRades
Datum: 24.03.14 20:42

FlexCell.Grid - was ist das für ein Control?

(Rechtschreibfehler urheberrechtlich geschützt)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 24.03.14 20:52

Das ist ein Grid, in dem ich auch Zellen verbinden kann. Ist allerdings nicht freeware. Aber die Investition war es mir wert.
In der Hilfe steht:
FlexCell Grid Control for .NET 3.0
FlexCell is a flexible and easy to use .NET grid control, it provides comprehensive functions, such as exporting to Excel, HTML and XML, importing from XML, printing, preview, sorting, charting, cell merging, virtual grids, etc. Using FlexCell Grid Control, you can create smart user interfaces and report forms in your application with very little code.


Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Manfred X
Datum: 24.03.14 21:08

Wenn das Control keine Datenbindung beherrscht, kannst Du
nur die Prüf- und Formatierungsoperationen, die auf Daten-
ebene ablaufen, in den Hintergrund schieben.
Das Befüllen des Control geschieht per Invoke (Delegate einer
geeigneten Füllmethode) im Control-Thread.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 24.03.14 21:10

Dann bringt mir in diesem Fall ein BGW nichts, oder mache ich das Invoke vom BGW.DoWork aus?
So wie Hier beschrieben?http://www.vbarchiv.net/forum/id22_i88441t88440_reihenfolge-beim-abarbeiten-des-codes.html

Danke für die Hilfe

Gruß Christian

Beitrag wurde zuletzt am 24.03.14 um 21:15:38 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Manfred X
Datum: 24.03.14 22:05

Ich würde zunächst klären, wofür die Rechenzeit verwendet wird.
- Aufbereitung der Daten im Row für die Anzeige
- Füllen der Control-Eigenschaften mit den Daten
- Verarbeitung von Control-Ereignissen, die während des Füllens ausgelöst werden

Beitrag wurde zuletzt am 24.03.14 um 22:05:52 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 24.03.14 22:11

Die Hauptzeit wird für das Füllen des Control verwendet und die damit verbundene Formatierung der Zellen.
Die Control-Ereignisse fange ich mit dem EnableEvents = False ab.
In jedem Event wird das geprüft und bei False abgebrochen.

Mir würde auch anstelle des HintergrundTread reichen, das befüllen abzubrechen.
Aber da weiß ich auch keinen Ansatz.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Manfred X
Datum: 24.03.14 22:30

Ich kenne dieses Control nicht.

Allgemein ist es so, daß manche Formatierungs-Methoden
viel Zeit in Anspruch nehmen, weil sie beim Aufruf
jeweils eine Koordinierung aller bereits vorhandenen Zeilen
vornehmen.

Versuche die Formatierung über eine Methode zu erledigen,
die nur einmal - nach dem Füllen - aufgerufen werden muß.
Oder prüfe, ob man bei den Spalten(eigenschaften) eine geeignete
Voreinstellung im Control vornehmen kann.



Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 25.03.14 09:15

Ich habe anfangs mal ausprobiert ob es schneller ist, erst alle Daten zu schreiben und anschließend in einer neuen Schleife die Zeilen zu formatieren, habe mich nach dem Test dazu entschlossen jede Zeile nach dem befüllen direkt zu formatieren. Das ist geringfügig schneller.
Das bringt mich aber hier nicht weiter, ich möchte ja abbrechen.
Also angenommen mein TreeView hat 50 Zeilen, und ich laufe von der 1. bis zur letzten durch, dann wird 49 x die Sub aufgerufen, die mir das Grid befüllt. Und jedes mal wird gewartet bis der Code durch ist.

Ich suche nun nach einer Möglichkeit das befüllen des Grid abzubrechen wenn im TreeView bereits weitergeblättert wurde.

Testweise habe ich es nun mit BGW versucht, das ist aber noch nicht zu meiner Zufriedenheit, da das Abbrechen anscheinend zu lange dauert. Jedenfalls bleibe ich in einer Schleife die auf die Verfügbarkeit des BGW wartet ewig hängen.
In der Sub TreeView_After_Select rufe ich auf:
 If BGW_OZ.IsBusy Then
                        If BGW_OZ.WorkerSupportsCancellation Then
                            BGW_OZ.CancelAsync()
                        End If
                    End If
dann:
Do While BGW_OZ.IsBusy
                        Debug.Print(String.Format("warte auf BGW {0}", _
                          Now.ToString))
                    Loop
was zu einer Endlosschleife zu führen scheint, und dann
 If Not BGW_OZ.IsBusy Then
                        Dim mDV As New DataView(ProjDts.Massen, "OZ = '" & _
                          aktOZ & "' and Art LIKE '" & MassenArt & "'", _
                          "Adresse", DataViewRowState.CurrentRows)
                        BGW_OZ.RunWorkerAsync(mDV)
                    End If
um den BGW zu starten. Das funktioniert aber nur beim 1.Aufruf, danach ist er immer beschäftigt, weil der Abbruch anscheinend zu lange dauert.

Was habe ich denn sonst für Möglichkeinen?

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Manfred X
Datum: 25.03.14 16:58


Wie erwähnt, besteht Dein Problem vermutlich darin, daß das Control
intern irgendwelche rechenzeitinsive Operationen durchführt.
Dieser Vorgang läßt sich wahrscheinlich nicht abbrechen.
Du mußt ermitteln, wie Du das Control effizienter einsetzen kannst.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 25.03.14 17:16

OK,
ich dachte mit dem abbrechen der Aktion wäre das der richtige Weg.

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Franki
Datum: 27.03.14 02:52

Hallo Christian,

Es gibt halt diverse Situationen wann ein Abbruch möglich ist.
So wie mit dem Auto auf der Autobahn, die kannst du auch nur bei der nächsten Ausfahrt abbrechen. Und die kann X Kilometer entfernt sein. Ein Sofortabbruch geht auch mit einem Crash in die Leitplanke, aber das willst du nicht beim Autofahren und auch nicht beim Programmieren.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 27.03.14 16:26

ja, schon klar.
Habe es mittlerweile akzeptiert.

Gruß Christian

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: effeff
Datum: 30.03.14 23:04

Und Du meinst, es gibt Vorteile gegenüber einem stinknormalen DataGridView? Das DataGridView ist dann an eine DataTable gebunden, die Du selber in Excel exportieren kannst, direkt als XML speichern kannst, etc...

Ah, ja... und kostenlos ist das DGV auch noch...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: in FlexGrid Daten eintragen - Backgroundworker oder Delegate? 
Autor: Bazi
Datum: 31.03.14 07:12

das ist schon richtig, aber ich benötige für die Anwendung verbundene Zellen. Alle meine Versuche diesbezüglich brachten nicht das gewünschte Ergebnis.
Ich schaffe es zwar die Zellen zu verbinden, aber beim selektieren gab es dann immer Probleme.
Deswegen bin ich auch das FlexCell-Grid gegangen.

Gruß Christian

Danke für die Hilfe

Gruß Christian

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel