Aus C# in Word Indizes markieren

FutureProgrammer

Grünschnabel
Hallo Programmierasse,

Ich habe folgendes Problem:

Ich möchte in einem Worddokument nachträglich ein Textformularfeld bzw. dessen Inhalt
als Index für ein Indexverzeichnis markieren. Die Daten die dort eingetragen werden, werden ja an die Methode übergeben, daher müssen sie nicht extra aus dem Feld wieder geholt werden

Mein Programm läuft so ab das es zunächst alle Textformularfelder ausfüllt und dann
bei einem bestimmten Feld "number" den Inhalt als Index markieren soll.
In dem Feld steht eine Nummer mit 2 Buchstaben und einigen Zahlen dahinter

Bsp.: AB0212322 daraus soll der Index (so wie er als Code im Word steht)

{ XE "AB:AB0212322" } werden
also die Buchstaben als Haupteintrag und der gesamte Eintrag als Untereintrag

bis jetzt hab ich nur Themen zum Inhaltsverzeichnis gefunden die mir in diesem Fall null helfen gefunden.
Vielleicht hat einer von euch eine Idee wie das richtig funktioniert.

Hier die Methode die dann das ganze tun soll:
C#:
public void SetField(string strName, string strValue)
{
try
{
object oFieldname = strName;
wdDoc.FormFields.get_Item(ref oFieldname).Result = strValue;
if (oFieldname == "number")
{
//wdDoc.GoTo(ref missing, ref oFieldname, ref missing, ref oFieldname).Paragraphs.Add(ref missing);
//appWord.CommandBars.ActionControl

//strValue += " { XE \"" + strValue.Substring(0, 2) + ":" + strValue + "\" }";
-> Hier soll der Index markiert werden <-
}

}
catch (Exception ex)
{
MessageBox.Show(strName + ":" + System.Environment.NewLine + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
 
Ich habs nun doch selber hin bekommen.
An die die Helfen wollten und auch noch keine Lösung hatten möchte ich trotzdem ein Dankeschön aussprechen.

Die Lösung des Problems ist eigentlich recht simpel wenn man es weiß.
Ich bin zufälig auf WordDocument.Indexes gestossen und damit lässt sich das ganze realisieren

Und um anderen die verzweifelt danach Suchen oder das ganze ebenfalls implementieren wollen zu zeigen wie es geht, hier nun der funktionierende Quelltext:

C#:
// Diese Methode setzt den übergebenen Text oder Wert in das Platzhalterfeld im Word Dokument
        public void SetField(string strName, string strValue)
        {
            try
            {
                object oFieldname = strName;                        // umspeichern des Feldnamen in ein objekt
                if (strValue == "-") { strValue = "noEntry"; }      // abfragen ob strValue per def leer ist 
                object entry = strValue.Substring(0,2) + ":" + strValue;// einspeichern des Index String
                if (oFieldname == "number" || oFieldname == "family")// Überprüfen ob das angesprochene Feld 
                {                                                    // number oder family heisst
                    object missing = System.Reflection.Missing.Value;// wenn ja dann soll 
             
                Word.Range range = appWord.ActiveDocument.Content;   // die definierte range gefunden werden
                Word.Find find = range.Find;
                find.ClearFormatting();                             // Suche ohne Formate zu berücksichtigen
                find.Text = "rebmun";                               // Finde das Wort der Variable findText im Text
                if (oFieldname == "family") { find.Text = "ylimaf"; }// wenn das Feld family heisst soll nach ylimaf
                while (find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing))// suche solange wie du findest
                {
                    if (strValue == "noEntry") {  }                 // wenn strValue leer ist soll nichts geschehen
                    else                                            // Andernfalls soll der Index markiert werden
                    {
                        wdDoc.Indexes.MarkEntry(range, ref entry, ref missing, ref missing // Index mit entry markieren
                                                   , ref missing, ref missing, ref missing,// und an die gefundene
                                                   ref missing, ref missing);              // range setzen
                    }
                    range.Text = "";                                // Ersetze alle Treffer durch "strValue"
                }
              
                }
                if (strValue == "noEntry") { }                      // Wenn strValue leer ist nichts
                else                                                // Ansonsten strValue in das Textformularfeld
                {                                                   // eintragen
                    wdDoc.FormFields.get_Item(ref oFieldname).Result = strValue;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(strName + ":" + System.Environment.NewLine + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

mfG
 
Zurück