florengray
Goto Top

Frage zu Datagridview Arbeitet extrem langsam in Verbindung mit Word Interop

Hallo.
Ich habe diesmal einfach nur ein hoffentlich simples Problem.
Ich habe eine Anwendung geschrieben, die mir eine Wordvoralage ausfüllt. Dabei füllt der User mit Hilfe der Anwendung
ein komplexes Formular aus. Wenn er das getan hat soll damit eine vorgefertigte Wordvorlage gefüllt werden.
Einzelheiten darf ich nicht schreiben. (Datenschutz)
Ich habe aber ein Problem welches ich mit Google und anderen diversen Foren nicht behoben kriege.
Und zwar dauert es eine Ewigkeit bis alle Daten in die Vorlage übertrugen wurden.
Warum weiß ich leider nicht.
Meine Wordvorlage enthält FormFields. Allen habe ich einen Namen gegeben.
Diese spreche ich dann so in meiner Anwednugn an:
With Word_Document.FormFields

                .Item("xyz").Result = TextBox_xyz.Text  
Davon gibt es 23.
Dann habe ich noch einen Datagridview. Der fungiert als Tabelle.
Die Daten werden ausgelesen und dann verarbeitet und dann in eine Wordtabelle übertragen.
Das sieht bei mir so aus:
For a = 1 To DataGridView1.Columns.Count - 2 
               
For b = 1 To DataGridView1.Rows.Count - 1

Word_Document.Tables.Item(Wordtable).Cell(b + 11, a).Range.Text = DataGridView1.Rows(b - 1).Cells(a).Value

Next

Next

Der Code funktioniert. Aber es dauer einfach zu lange bis die Tabelle komplett übertragen wurde.
Ich benutze einfach die Objekt Library von Word um mit der Wordvorlage zu "kommunizieren".
Ich glaube ich benutze diesen Datagridview einfach falsch. Zumal ich gerade dieses Value bei Cells(a) nirgends finden kann.
Ich habe einfach probiert bis ich die Zellen im Datagridview abfragen konnte. Mit xyz.Value hat es funktioniert.
Aber dieses Value kam nicht als Auswahl bei meinem VB2008.
Könnt ihr mir einen Tipp geben wie ich meinen Code schneller machen kann?
Ich wäre auch unendlich dankbar.

Schöne Grüße!
Florengray

Content-ID: 134074

Url: https://administrator.de/contentid/134074

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

dog
dog 21.01.2010 um 20:00:19 Uhr
Goto Top
Wäre es nicht vielleicht schlauer anstatt sich Spalten-Zeilen-Weise Zeilen-Splaten-Weise fortzubewegen?

Am Besten du findest erstmal heraus was so lange dauert.
Sprich einmal führst du nur das Abrufen aus dem DataGridView und einmal nur das Zuweisen nach Word durch (mit statischem Text).

Grüße

Max
florengray
florengray 21.01.2010 um 20:22:24 Uhr
Goto Top
Hallo!

Also das mit dem Datagridview dauert so lange.
Da ist es nicht mal linear ansteigend. Also nicht 5 Zeilen = 30 Sekunden und 10 Zeilen 60 sondern sogar 80 Sekunden.
Ja das mit dem Zeilenweise ist vielleicht richtig. Aber es dürfte doch egal sein ob ich z.B. 20 Zellen so oder so abfrage.
Das mit den Formfields geht noch. Ich habe mir das mal angeschaut mit Application.visible = True
Da geht das richtig flott. Wenn ich aber die Zeit messe wenn ich App.visible = False mache dauert es komischerweise länger.
Wenn ich vor dem Durchlauf dort einen Break setze und etwas warte und dann den Code weiter ausführen lasse, dann geht es noch schneller.
??? Nun verstehe ich gar nichts mehr. ??? Ist die Schnittstelle einfach so lam?
Wenn ich mir die Mühe mache und tausende von Varibalen anlege die mit dem Event TextChanged immer mit dem neuen Wert aktualisiert werden und diese dann direkt nach Word schicke dann geht es auch schon sehr schnell.
Also gibt es ein Problem mit dem ?Datenextrahieren? aus dem Objekt. Dauert das einfach so lange oder spreche ich das Objekt falsch an?

Grüße Florengray
dog
dog 21.01.2010 um 20:35:23 Uhr
Goto Top
Ein DataGridView ist ja nun eben primär ein View, also für die visuelle Darstellung konzipiert.
Benutzt du ihn auch so?

Wenn nicht reicht nämlich ein einfacher multidimensionaler Array.
florengray
florengray 21.01.2010 um 20:46:10 Uhr
Goto Top
Hmm. Ja. Bei dem Grid View ging es mir um die Tabelle die mir da zur Verfügung gestellt wird.
Es wird nämlich automatisch eine neue Zeile hinzugefügt wenn man die braucht.
Und nein ich mißbrauche den GridView. Nicht zum darstellen, sondern zum Daten kurzfristig zwischenzuspeichern.
Gibt es ein anderes Steuerelement das dazu geeigneter wäre?
Ich wüsste nicht wie man das anstellen würde aber könnte man einen Datatable nehmen den man ständig aktualisiert und dann den nach Word schickt? Dann würde man sich das einzelne Zellen ansprechen sparen.

Grüße Florengray
florengray
florengray 24.01.2010 um 16:03:38 Uhr
Goto Top
Hallo nochmals.

Also wenn ich das richtig verstanden habe:
Ein Dataset könnte man vergleichsweise wie eine Excelworkbook beschreiben.

In diesem Dataset kann mann dann viele Datatables anlegen. Das wären dann die Excelsheets.
Jedes Excelsheet enthält dann Spalten und Zeilen.
Das gleiche könnte ich dann mit einem spezifischen Datatabel machen. Richtig? Also dort per Add Spalten und Zeilen hinzufügen.
Meine Überlegung: Ich binde einen Datatabel über die Eigenschaftsspalte an meinen Datagridview.
Dann müsste doch diese Tabelle immer vom datagridview aktualisiert werden bzw. imme reine Kopie des Datagridviews sein?
Dann bräuchte ich ja nur diesen Datatable abfragen und dann die Daten nach Word schicken. Richtig?

Bis dann Florengray
florengray
florengray 04.03.2010 um 17:28:21 Uhr
Goto Top
Also,
das erste was viel "Zeit" kostet sind FormFields. Jedenfalls bei mir.
Also habe ich alles über eine Tabelle gelöst.
Dann noch was ganz komisches.
Wenn ich Word_App.Visible = True mache und mein Proggi da dann die Daten in die Tabelle einträgt genügt es, wenn ich
mit der Maus irgendwo auf das Doc klicke und dann rasst das Ding dadurch und füllt alles 10mal schneller aus.
Warum konnte ich mir bis heute nicht erklären.
Die Frage war jetzt wie ich diesen "Klick" simuliere.
Es geht auf jeden Fall mit der Kombi aus:
Word_App.Visible = True
Word_App.Activate
Word_App.Visible = False.
Das Problem ist nur, dass dann der Bildschirm kurz flackert.
Das kann man auch lösen indem man Word_App.WindowState auf Minimized stellt.
Was anderes kann ich im Moment dazu nicht bieten.
Habe da was mit aktiven Handels im Verdacht aber das sind nur Vermutungen.

florengray