| |
VB.NET - Ein- und Umsteigerin 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 | |
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.
| |
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 | |
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) | |
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 | |
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.
| |
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. | |
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 | |
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.
| |
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 | |
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.
| |
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 | |
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 | |
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 | |
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 | |
| 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 |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|