Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#, Word late binding]Vul volgende cell in

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben druk bezig mijn C# applicatie die via early binding een document aanpast om te zetten naar late binding zodat mijn applicatie ook op andere versies van Word werkt.
Ik heb hier al een topic over: \[C#, Word, win2003Server] COM class factory error maar omdat de topic post over iets anders gaat, ben ik maar dit nieuwe topic gestart. Dat is wel zo overzichtelijk, dacht ik.

Het probleem waar ik nu nog mee zit is dat ik een voorgedefinieerde tabel heb met drie kolommen en 1 rij. Ik wil de tabel vullen door gegevens uit mijn Oracle tabel daar in te zetten. In mijn early binding deed ik dat door 1 cell in te vullen, vervolgens naar de volgende cell te gaan met
C#:
1
2
Object oUnit = Word.WdUnits.wdCell;
_WordDoc.ActiveWindow.Selection.MoveRight(ref oUnit, ref _missing, ref _missing);

Nu wil ik hetzelfde doen met late bindig maar daar kom ik nog niet echt uit.
Misschien moet ik het op een andere manier doen. Het gaat er in ieder geval om dat ik op een specifieke plaatst in het document een reeks data moet plaatsen waarvan ik wel weet hoeveel kolommen maar het aantal rijen niet weet.

Code wat ik al heb geprobeerd is oa.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
object objSelection = wordType.InvokeMember(
    "Selection",
    BindingFlags.GetProperty,
    null,
    wordApplication,
    new object[]
{
});
//wdCell = 12
wordType.InvokeMember(
    "MoveRight",
    BindingFlags.InvokeMethod,
    null,
    objSelection,
    new object[]
{
    12
});


Ik krijg dan deze error:
code:
1
2
This method or property is not available because some or all of the object
 does not refer to a table.


Als iemand een ander idee heeft om dit op te lossen dan hoor ik het graag.

Wat ik ook graag zou willen weten is of er een overzicht is van de Properties en InvokeMethods die binnen late binding beschikbaar zijn. Ik heb al bij Microsoft gezocht maar daar kon ik het niet vinden. Overigens heb ik nauwelijks voorbeeldcode van late binding van Word gevonden bij MS.

Verwijderd

Topicstarter
Ik heb inmiddels uit gedokterd hoe een tabel te vullen, het gaat jammerlijk niet zo generiek als de early binding versie, maar toch.
Tabellen hebben geen naam maar een index, dus moet ik de index meegeven. Dat gaat wel problemen geven als er later nog weer een tabel aan de template wordt toegevoegd, maar dat is voor latere zorg.
Verder moet ik ook meegeven om hoeveel kolommen het gaat, want als ik een cell wil invullen die niet bestaat wordt die niet automatisch toegevoegd maar wordt een collection error gegeven.
Voor de liefhebbers, hier is de code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
object tables = wordType.InvokeMember(
    "Tables",
    BindingFlags.GetProperty,
    null,
    wordDocument,
    new object[] 
            {
            } );

object table = wordType.InvokeMember(
    "Item",
    BindingFlags.InvokeMethod,
    null,
    tables,
    new object[] 
            {
                    1 //table index
            } );

for (int rij=1;rij<10;rij++)
{
        //Er is al 1 rij gedefinieerd in de template:
    if(rij>1)
    {
        //Add row:
        object rows = wordType.InvokeMember(
            "Rows",
            BindingFlags.GetProperty,
            null,
            table,
            new object[] {                                       
                         } );
        wordType.InvokeMember(
            "Add",
            BindingFlags.InvokeMethod,
            null,
            rows,
            new object[] {                                       
                         } );
    }
    for (int kolom=1;kolom<4;kolom++)
    {
        object cells = wordType.InvokeMember(
            "Cell",
            BindingFlags.InvokeMethod,
            null,
            table,
            new object[] {
                             rij, kolom
                         } );                   
        object range = wordType.InvokeMember(
            "Range",
            BindingFlags.GetProperty,
            null,
            cells,
            new object[] {
                         } );
        wordType.InvokeMember(
            "Text",
            BindingFlags.SetProperty,
            null,
            range,
            new object[] {
                             "Kolom: " + kolom.ToString() + " rij: " + rij.ToString()
                         } );
    }
}