Prinzipiell ist der Lebenszyklus einer Desktop Applikation erst einmal an die Darstellung eines Fensters gebunden.
Was du beschreibst klingt eher nach einem Dienst als einer Desktop Applikation.
Wie viel Worker du machen solltest hängt nachher davon ab, wie viel die einzelnen Crawler machen (Bei Crawling wichtig: Die Webseiten-Eigentümer müssen genau dieses erlauben, was idr. nicht erlaubt ist) und wie nutzbar der PC noch sein soll.
Mit den Chrome selber habe ich leider keine Erfahrung, es klingt aber eher, als hättest du eine Reihe von Aufgaben, die abzuarbeiten und ggf. nicht endlich sind.
In dem Fall würde ich vermutlich eher auf ein Consumer/Producer Pattern gehen und aus einem IHostedService heraus neue Tasks starten.
Ich würde tippen auf ein Problem mit dem installierten Office. Du benötigst immer exakt dieselbe Version von der Bibliothek und dem installierten Office.
Schau die mal Bibliotheken an, die auf das Dokumtentenformat gehen. z.B. ClosedXML
Fun Fact: Eine ASP.NET Core / 5 Anwendung ist auch eine Konsolenapplikation
Schau mal, was Abt oben geschrieben hat. Mit den Infos solltest du problemlos jede Menge Anleitungen finden, wie das in einer Console ohne ASP funktioniert
Zitat von Abt
Die Standard Engine von ASP.NET nennt sich Razor. Wir generieren auf dieser Engine zum einen den HTML Code des Forums (als Teil der ASP.NET Render Pipeline) und zum anderen auch den HTML-Code der E-Mails (ohne ASP).
Dazu braucht man auch kein extra NuGet Paket mehr, nur noch IRazorViewEngine Interface (Microsoft.AspNetCore.Mvc.Razor)
glandorf hat ja die Lösung schon geschrieben, als Tipp kann ich dir noch mitgeben: Setz dir einen Breakpoint an die Stelle wo die Zelle ausgelesen wird (es gibt auch Conditional Breakpoints, die nur bei einem bestimmten Wert von i triggern) und schau, was das Zellenobjekt für Informationen für dich hat.
wir wissen leider überhaupt nicht, wie du das Excel liest und es nach RTF konvertierst.
Ohne mich genau auszukennen und zu wissen wie du das machst kann ich bloß ins blaue raten, ich würde aber tippen, dass du entweder die Formatierung beim auslesen verlierst oder diese nicht rtf kompatibel ist und du sie entsprechend vor dem Anzeigen des Textes konvertieren/den anzuzeigenden Text formatieren müsstest.
Es ist der Wahnsinn, was Abt und gfoidl da die letzten Wochen auf die Beine gestellt haben und das ganze unentgeltlich und in Ihrer Freizeit!
Meinen größten Respekt!
Mit was arbeitest du? Plain SQL mit ADO.NET (o.ä.)?
Prinzipiell gehst du so vor:
- Daten abfragen
- über die Daten iterieren & die Daten in ein Objekt Projezieren (1)
- die Daten an deine Darstellung anpassen (2)
in (1) erhälst du die Zeilen in einer Klasse wie
class MitarbeiterZuweisung
{
public int MitarbeiterId {get; set;}
public string Name {get; set; }
public string Baustelle {get ;set;}
public int Tag {get; set; }
}
in (2) gehst du her und passt es so an, wie du es anzeigen willst. Du musst also die Zeilen nach MitarbeiterId gruppieren. Das geht am einfachsten via LINQ:
var groupedByEmployee = rows.GroupBy(r => r.MitarbeiterId);
Jetzt musst du die erhaltenen Daten nur noch in eine ObservableCollection<T> überführen, wobei T eine von dir erstellte Klasse ist, die dein View benötigt.
Ein Binding muss bei WPF immer auf eine Property gehen, niemals auf eine Member Variable.
Wenn trotzdem noch nichts angezeigt wird, benötigst du INotifyPropertyChanged in deinem ViewModel, wenn du Veränderungen im Code an der gebundenen Collection machen willst, sollte es eine ObservableCollection sein.
Wenn es "nur" ein Chart ist (also z.B. LineChart), da brauchst du das nicht selber programmieren und zeichnen. Dafür gibt es zuhauf fertige Bibliotheken, die dir das abnehmen.
--> Wenn der Benutzer auch auf die DB zugreifen können soll und du den WindowsAuth dafür verwenden willst, wird es wohl ein AD User werden müssen.
Wenn der Benutzer angelegt ist, gehst du in den IIS Manager, dann auf Application Pools, erstellst einen neuen Application Pool oder wählst den vorhandenen aus und weist ihm den Benutzer zu.
Danach musst du nur sicherstellen, dass die Site im IIS auf dem Application Pool läuft. Das stellst du bei der Site ein.
Entschuldige, wenn ich deinen Code nicht komplett anschaue.
Erstelle ein Minimalbeispiel, an dessen du dir selber klar machst wie das funktioniert.
-> Du hast eine Datenhaltungsklasse (die aus deinem ersten Post)
-> Daraus erstellst du eine Objektstruktur, die anstatt einer UnterID das UnterObjekt hält (im View Model)
-> In der View erstellt du ein HierarchicalTemplate, dass die Root Node/Array deiner Objektstruktur per Datenbindung erhält und deren Kind Objekte an die Kindknoten weitergibt
Das .NET Ökosystem ist in den letzten Jahren stark gewachsen und die Dokumentation ist sehr gut. Allerdings, bei einem großen Ökosystem ist auch die Doku sehr groß.
Deswegen habe ich das auch so geschrieben und nicht einfach auf die Doku verwiesen.
Der Hintergrund ist, dass Windows Forms auf ActiveX (?) und WPF stark auf DirectX angewiesen sind und die gibt es eben nur für Windows.
Mono hat eine eigene Implementierung von Windows Forms gemacht, die auf GTK (glaube ich) basiert und damit Crossplattform.
Windows Forms (und auch WPF) benötigt zusätzlich zur .NET 5.0 Runtime auch noch die .NET Desktop Runtime. Diese gibt es nur für Windows.
Was du allerdings nutzen kannst sind Dinge wie Electron.NET oder Plattformen wie UNO (https://platform.uno/).
Edit: Aber ob du z.B. Netflix so einbinden kannst, wie du dir das vorstellst kann ich dir nicht sagen, vermute aber, dass es Netflix dir schwer machen wird, außer mit einem Browser.
Wenn du das in der Form binden willst muss die Property "UnterID" ein Objekt zurückgeben, dass dem SubItem entspricht.
Die Schicht, die du beschreibst ist die Datenhaltung (Schlüssel & Fremdschlüssel in einer SQL zum Beispiel). Das, was du aber für die UI brauchst ist eine aufgebaute Datenstruktur. Du musst die Abhängigkeiten auflösen.
Du musst weiterhin die Referenz mithilfe von Visual Studio einbinden, so wie du das auch mit VS 2010 gemacht hast.
Danach kannst du es in deinem Projekt verwenden. Inklusive des usings.
Binärdateien haben keine Zeilen. Du kannst also nichts zeilenweise einlesen :)
Prinzipiell musst du die Datei parsen und in ein für dich verarbeitbares format umwandeln. Dafür musst du die in dem pdf beschriebenen Blöcke verarbeiten. Ein Block nach dem anderen.
Alternativ suche nach einem Konverter oder einer entsprechenden Bibliothek.
In deiner Oberflächenbeschreibung (=XAML), bzw dem View sollte die Repräsentation des Zeitstempels gesteuert werden.
P.S.:
So wie du TryParse..() verwendest ist es falscht. Nicht umsonst unterscheidet sich TryParse...() von Parse...().
P.P.S.:
Du übergibst ein Objekt dessen Typ du weißt trotzdem Boxed an deine convertDateTime Methode als object.
Dadurch bekommt die convertDateTime Methode mehr Aufgaben, als ihr Name aufzeigt und du bist in zweiter Instanz Typunsicher... was passiert, wenn sender in convertDateTime nicht vom Typ DataGridView ist?
-> Wozu brauchst du das DGV, wenn du immer convertedDateTime zurück gibst?
-> Ich bin nicht sicher, was in sender drin steht, aber es müsste etwas vom DGV sein
In WPF solltest du MVVM verwenden. Hier kannst du dann das notwendige als Parameter binden.
Um noch einmal in die gleiche Kerbe zu schlagen. Das Forum geht schon lange den Weg, keine fertigen Lösungen auf Fragen zu produzieren, sondern die Mitglieder entsprechend so aufzuschlauen, dass sie die Lösungen selber erstellen können.
Das gleiche ist, die verwendeten Pattern zu erklären, anstatt eine fertige Lösung hinzuklatschen.
Es bringt dem einzelnen wesentlich mehr ein verstehen aufzubauen und eigene Fehler zu machen, als zu versuchen etwas fertiges zu kopieren und die gemachten Fehler nicht zu verstehen :)
Aber auch das ist ein Lernprozess.
Was du da machst sieht schon sehr abenteuerlich und kompliziert aus.
Du kommst von PHP - richtig? Schau dir am besten die Grundlagen und Pattern von C# an.
Zu deinem Problem:
Aktuell kann jeglicher Typ als TList genutzt werden. Wenn du dort eine update-Methode haben willst, musst du den Typen einschränken, auf entweder einen Typen, der update implementiert hat oder ein Interface, dass dieses vorschreibt.
Das geht über Generic Constraints.
Edit: oh sorry.. exakt der gleiche Link :)
Einfach nochmal den Link durchlesen... den Punkt mit dem where ...