Laden...

Profil von lutzeslife

myCSharp.de - Member Mitglied seit
L
lutzeslife
myCSharp.de - Member
41
Themen
178
Beiträge
Dabei seit
25.07.2012
Letzte Aktivität
vor 3 Tagen
Beruf
Softwareentwickler
Herkunft
Dresden
Erstellt vor 18 Tagen

Microsoft passt aktuell immer wieder Schnittstellen im COM Model an. Das Problem dabei ist das schnell mal zwischen zwei Office Versionen gleichen Majorversionen eine Automation API nicht funktioniert. Wenn du neuere Versionen nicht brauchst fährt man am besten eine ältere Version der Library zu referenzieren und mitzuliefern z.B. die 15 Versionen aus Office 2013.

Wie Abt bereits geschrieben hat sind seid Office 2016 die Versionen nicht mehr aussagekräftig hinsichtlich der Hauptversion und via API hat sich die Version 16.**** nicht mehr geändert. Der einzige Weg eine vernünftige Versionsnummer zu bekommen ist via Registryauswertung über API bekommst du je nach verwendeter App mal mehr mal weniger Infos.

P.S. Microsoft liefert seid einiger Zeit auch keine aktualiserten Interop Bibliotheken aus. Wenn du immer die neusten brauchen solltest musst du die Typdefinitionen die mit dem VBA Editor von Office ausgeliefert nutzen um eine .net Bibliothek zu erstellen, die funktionieren aber nur für diese Office Version und später.

Erstellt vor 3 Monaten
var element = gltModbusPVPlainNode
        		.Element(ns + "addData")
        		.Element(ns + "data")
        		.Element(ns + "InterfaceAsPlainText")

Du kannst zunächst das Element in eine Variable schieben und was spricht dagegen den Namespace im Anschluss per Add ein neues Attribut hinzuzufügen?

XNamespace ns = "[NAMESPACE]";
element.Add(new XAttribute(ns));
Erstellt vor 4 Monaten

Wenn du es besser trennen willst, die RibbonGalleryhat ein SelectionChanged Event. Mittels EventToCommand Behaviour könntest du im ViewModel die Property umschalten die dei Command.CanExecute für den Speichern-Button steuert.

Erstellt vor 4 Monaten

Für was brauchst du ein Selection Event. Du bindest an SelectionBoxItem Property der ComboBox. Die Property wird wenn der Nutzer ein anderen Wert auswählt automatisch bei richtigem Binding aktualisiert.

Dann kannst du weiter machen.

Erstellt vor 4 Monaten

Du setzt auch jedes Mal das Dokument zurück, da wäre die Frage ob das korrekt erfolgt. Für deinen Anwendungsfall könntest du auch überlegen das DOkument ungespeichert zu schließen und erneut aufzumachen. Dann brauchst du es nicht wieder zurücksetzen.

Da du mit einer Vorlage schon arbeitest könntest du mittels SaveAs deine Änderung temporär in ein docx speichern und nach dem schließen des DOkumentes dieses löschen, das erspart das erneute ersetzen.

Falls dein Dokument sehr umfangreich ist könnte man auch überlegen ob man die Stellen die man ersetzen möchte anstelle von Search&Replace die Stellen in ContentControl setzt und dann nur den Inhalt der ContentControls ersetzt, das wäre etwas stabiler.

Erstellt vor 4 Monaten

Du convertierst immer noch rum und arbeitest nicht mit den Methoden:

// Bisher
int year = dateTimePicker.Value.Year;
int month = dateTimePicker.Value.Month;
int day = dateTimePicker.Value.Day;

// Neu
DateTime startDate = dateTimePicker.Value;

dann

 // Bisher
 DateTime endDate = new DateTime(year, month + Convert.ToInt32(Seiten), day); //Seiten=Anzahl der Monate
 
 // Neu
 endDate = startDate.AddMonths(Seiten);

dann kannst du

// Bisher
int Seiten = Convert.ToInt16(txtbxAnzahl.Text);

// Neu
int Seiten = Convert.ToInt32(txtbxAnzahl.Text);

Der Typ int selber ist ein Wrapper der wählt auf dem System die Variante entsprechend aus. Außerdem musst du nicht hin unher konvertieren zwischen int16 und int32

Dann

dateTimePicker.Value = DateTime.Parse(lastDayOfMonth.ToString("dd MMMM yyyy"));
replaceDate = dateTimePicker.Text;

Du brauchst nicht den Weg über den DateTimePickergehen. Du konvertiesert deine Berehcnung ja zu einem String das Format ist frei wählbar da kannst für replacedDate gleich das entsprechende String erstellen und du sparst dir das Parsing.

Und dann gehst du immer noch unsauber mit den COM Objekten der API um. Immer und ich meine immer wenn du ein Objekt der API abrufst das eine Reference und kein Value ist muss und damit meine ich wirklich muss das Objekt auch wieder freigegeben werden.

Beispiel

wordApp = new Word.Application(); // muss freigegebn werden
doc = wordApp.Documents.Open // hier erfolgt ein Abruf des Documents Object das gar nicht freigegeben wird und natürlich Document selber das von Open geliefert wird

weiter unten dann Selection, Find usw.

Für die Lesbarkeit bitte

  • auskommentierten Code löschen, deswegen gibt es Versionsverwaltung wie git
  • keine Variablen deklarieren     TimeSpan time2 = new TimeSpan(800); die nicht gebraucht werden.
Erstellt vor 4 Monaten

Bevor wir zum eigentlichen Problem kommen, bitte die Konvertierungen zu String vermeiden

  string replaceDate = dateTimePicker.Value.ToString();
    int year = Convert.ToInt32(replaceDate.Substring(6,4));
    int month = Convert.ToInt32(replaceDate.Substring(3,2));
    int day = Convert.ToInt32(replaceDate.Substring(0, 2));

DateTimePicker.Value hat als Objekttyp das DateTime das über Properties für Day, Month Year verfügt. Damit kannst du dir also das startDateschon erzeugen. Außerdem kannst du das endDateerzeugen mit startDate.AddMonth(2) und bekommst das neue DateTime. Bitte hier schauen was das Framework liefert.

Die Schleife sieht auch merkwürdig aus:

    for (DateTime date = startDate; date <= endDate; date = date.AddMonths(1))
    {
        // Berechne den letzten Tag des aktuellen Monats
        DateTime lastDayOfMonth = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
        MessageBox.Show(lastDayOfMonth.ToString("dd.MMMM yyyy"));
        dateTimePicker.Value = lastDayOfMonth;
        temporarydate = Convert.ToString(dateTimePicker.Value.ToString("dd.MMMM yyyy"));
        ReplaceTextInWordDocument3(filePath, searchString, replaceString, searchDate, temporarydate, Seiten);

    }

Die doppelte Konvertierung zu stringConvert.ToString(dateTimePicker.Value.ToString("dd.MMMM yyyy"))kann mann sich sparen, warum willst du den Wert dem DateTimePicker  zu ordnen?  usw.

Ich würde da erstmal aufräumen und anschließend die genaue Fehlermeldung posten ggf. auch im Netz danaach suchen sonst ist das das nur raten. Und was genau wird in Replace gemacht und wo tritt die Meldung auf.

Erstellt vor 5 Monaten

Fast alles was du in VBA machen kannst kannst du auch über die C# Schnittstelle machen, ich würde da nichts mixen.

Erstellt vor 5 Monaten

Okay vielleicht mal schauen welcher Process den Dialog aufmacht, eventuell kann man über Automation den Dialog ansteuern und bestätigen

Erstellt vor 5 Monaten

Kann denn der Drucker randlos drucken? Wenn ja vielleicht mal als Standard im Drucker hinterlegen dass es unterstützt wird. Wenn der Drucker den Dialog erzwing wirst du nicht viel machen können.