Laden...
T
T-Virus myCSharp.de - Experte
Entwickler noobie :D Nordhausen, Nörten-Hardenberg Dabei seit 17.04.2008 2.246 Beiträge
Benutzerbeschreibung

Forenbeiträge von T-Virus Ingesamt 2.246 Beiträge

25.09.2024 - 08:13 Uhr

Je nach UI Technologie, gibt es für Lokalisierung schon fertige Lösungen von .NET Seite her.
Dein Ansatz für jedes Control eine eigene Klasse anzulegen ist auch unnötig.
Die Implementierung macht man i.d.R. über die Basis Klasse der Controls, die die Text Property überhaupt erst anbietet.
Aber das kann man sich eigentlich sparen, da man dafür eben Bindings verwenden kann.
Sollte aber auch in der Doku zur jeweiligen UI Technik unter dem Punkt Lokalisierung stehen.

06.09.2024 - 16:38 Uhr

Hab direkt ein kleines Projekt, in dem ich Moq verwendet hab, ebenfalls auf Nsubstitute gewechselt.

Die anderen Projekte sind m.W.n. nicht umgezogen, weil einfach die Zeit fehlte.

Bei neuen Projekten würde ich auch nicht mehr auf Moq setzen, da der Entwickler mein Vertrauen verloren hat.

T-Virus

29.07.2024 - 22:06 Uhr

Im einfachsten Fall kannst du bis auf die SOAP Services alles mit Plain C# und ASP .NET Core machen.
SOAP solltest du im Idealfall einfach ersetzen, ist nicht mehrZeitgemäß und wegen XML mit ziemlichen Overhead.
Microsoft selbst hat SOAP im Grunde aufgegeben weil es technisch kaum noch sinnvoll ist.
Hier haben sich REST Apis einfach als bessere Alternative durchgesetzt.

T-Virs

20.07.2024 - 17:33 Uhr

Dateien wie Setup.exe werden teilweise geblockt.
Kannst du am einfachsten umgehen, wenn du diese als Zip Datei lieferst.
Ebenfalls wird ein Flag bei den Dateien gesetzt, dass diese rutnergeladen wurden.
Musst du dann manuell explizit entfernen in den Eigenschaften der Datei, damit diese nicht geblockt wird.

T-Virus

20.07.2024 - 11:06 Uhr

Ohne den Server im Detail zu kennen, was spricht den dagegen z.B. Kestrel als einfachen Http Server zu nehmen und dann die Api selbst einfach mit Bordmitteln oder passenden NuGet Paketen zu bauen?

Sehe jetzt nicht welchen Vorteil/Zweck Grifin hat, den man mit einem anderen Http Server nicht umsetzen kann.
M.m.n. fährst du ohne den Grifin Server, bei dem es auch Issues gibt die in 4 Jahren nicht angefasst wurde, besser als weiter auf dieses tote Pferd zu setzen.

Nachtrag:
Selbst das Framework hinter dem Server scheint keine Updates mehr zu bekommen.
Letzter comitt beim Framework war vor 9 Monaten, auch dort scheinen keine Issues mehr angefasst zu werden und die Website des Framework meldet ein fehlerhaftes Zertifikat, was eine Red Flag für mich wäre.

Nachtrag 2:
Das Projekt scheint tot zu sein.
Die Webseite des Frameworks zeigt auf eine Casino Seite!
Damit würde ich ein komplettes Replacement von Grifin Framework und Server ins Auge zu fassen!

T-Virus

15.07.2024 - 11:08 Uhr

Wie sieht den der Code aus?
Ohne diesen können wir nur raten.

T-Virus

08.07.2024 - 19:26 Uhr

@Abt
Laut Doku hat auch Microsoft.Data.SqlClient ein SqlBulkCopy.

Doku:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.data.sqlclient.sqlbulkcopy?view=sqlclient-dotnet-standard-5.2

Bei 50 Einträgen kann man auch auf normale Inserts setzen.

Wenn es halt nur einiges mehr werden sollte, dann wäre das eben die bessere Option.

T-Virus

08.07.2024 - 13:18 Uhr

Ebenfalls sollte man bei größeren Datenmengen, die man importieren will, mit Bulk Insert arbeiten.
Wird für den Sql Server mit der SqlBulkCopy Klasse gelöst.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.data.sqlclient.sqlbulkcopy?view=netframework-4.8.1

T-Virus

07.07.2024 - 14:59 Uhr

Was sind das für Datensätze?
Default Timeout ist 100 Sek.
Was genau passiert da beim einfügen, dass du mehr als 100 Sek. brauchst?

T-Virus

28.06.2024 - 09:00 Uhr

Das Thema ist seit einigen Jahren gut dokumentiert.
Kannst du dir auch in der Microsoft Doku anschauen.

Doku:
https://learn.microsoft.com/de-de/dotnet/core/extensions/globalization-and-localization

T-Virus

26.06.2024 - 13:42 Uhr

Deine Argumente sind leider alle nicht stichhaltig.

Erhöhte Sichtbarkeit und schnellere Lösungen
Entfällt schon, weil nicht jeder Crossposter sich überhaupt die Mühe macht die Crossposts zu verknüpfen oder die Lösung zu teilen.
Auch arbeiten die Platformen nicht miteinander, es gibt also keinen gemeinsamen Ansatz.
Die User der jweiligen Platform müssen immer wieder bei 0 mit der Lösung anfangen, da es keine Gemeinsame Suche gibt.
Damit erzeugst du einen Mehraufwand bei Helfern.

Wissenstransfer
Kann auch nur passieren, wenn die Crossposts geteilt werden, was aber selten bis nie passiert.

Transparenz
Funktioniert auch nur, wenn die Crossposts geteilt werden.
Du selbst warst hier wieder das beste Beispiel, warum dies nicht gemacht wird.
Passiert auch locker zu 99% der Fälle nicht.

Effizienz
Gleiches Argument wie bei Punkt 1, ist einfach nicht gegeben und erzeugt nur Mehraufwand für alle Helfer.
Steht auch in den Regeln drin!

Respekt
Hat mit dem Thema wenig bis gar nichts zu tun.
Außer, dass die Forenregeln selbst Crossposting untersagen, du es aber denoch getan hast.
Im Endeffekt ist der Punkt also Bedeutungslos bzw. von dir selbst untergraben

Regeln
Diese werden gemacht, damit es einen gemeinsamen Konsens gibt.
Diesen hast du aber bewusst wieder gebrochen und damit auch kein Interesse an den Regeln gezeigt.
Wir haben hier und auch im Leben außerhalb des Internet aus gutem Grund Regeln, die wir alle einhalten wollen.
Wenn du den Drang hast, dies nicht zu tun, bist du hier eben falsch.
Damit greifst auch auch direkt Punkt 5 wieder an, da du keinen Respekt vor den Regeln zeigst, denen du zugestimmt hast.

Mit deinem letzten Absatz zeigst du ebenfalls, dass du weder Punkt 5 noch 6 ernst meinst.
Damit würgst du selbst eigentliche deinen Post wieder ab.

Das hat auch nichts mit kindischen Diskussionen zu tun sondern dem einhalten der Regeln, den du zugestimmt hast.
Und du brauchst auch nicht die Crossposts zu erwähnen, dann wird der Posting gleich gesperrt.
Am Besten wäre es, wenn du keine Posts mehr machst, wenn dein Ziel nur Crossposts sind.

T-Virus

26.06.2024 - 12:42 Uhr

@politico
Es gehört aus gutem Grund zu den Regeln des Forums, dass kein Crossposting geduldet wird.
Damit lässt du unnötig Leute doppelte und dreifach nach Lösungen suchen.
Und wie man sieht, hast du nicht mal bei allen die Lösung verteilt, hast also dein eigenes Posting nicht ernst genommen.

Diesen Regeln hast du auch mit deinem Beitritt zugestimmt.
Wenn dir die Regeln nicht gefallen, dann wäre es zukünftig besser, dass du hier einfach keine Crossposts mehr machst.
Wenn andere Platformen dies so dulden, ist dass deren Entscheidung.
Hier ist es aber unerwünscht, entsprechend wäre es auch im Interesse aller das du dich daran hältst.

T-Virus

17.06.2024 - 21:20 Uhr

Alternativ ginge auch ConcurrentBag als Threadsichere Alternative zu List + Lock!

13.06.2024 - 11:25 Uhr

@Th69
Wäre vermutlich sinnvoller, dann muss man aber auch wieder schauen ob die restlichen Styles für die Buttons etc. wieder passen.
Ggf. müssten diese dann auch wieder angepasst werden.

Sollte aber im Idealfall kein großer Aufwand sein.
Leider kenne ich den Editor nicht, deshalb kann ich das nicht wirklich abschätzen.
Wenn es so krampfig wie die Telerik Controls ist, dann wäre das ein nicht zu unterschätzender Aufwand.

T-Virus

13.06.2024 - 11:07 Uhr

Wie weit kannst du den Editor bearbeiten was die Styles angeht?
Aktuell wird der Text in ein p Element geschrieben.
Wenn man diesem den richtigen color Style gibt, dann wird der Text angezeigt.
Da das Element aber keine ID hat, müsste man dieses manuell suchen und den Style setzen.
Aber das wäre nur möglich, wenn du Zugriff auf das Element hast.

Bsp:

<div class="ck ck-editor__main" role="presentation">
    <div class="ck ck-content ck-editor__editable ck-rounded-corners ck-editor__editable_inline ck-blurred" lang="de" dir="ltr" role="textbox" aria-label="Bearbeitungsbereich des Editors: main" contenteditable="true">
        <p style="color:black;">efawdawdawddwaawdadwawdawd</p>
    </div>
</div>
10.06.2024 - 08:48 Uhr

Eigentlich steht alles bei NuGet.
Das Paket unterstützt aktuell max. .NET 6.0, .NET Standard 2.0 und .NET Framework 4.6.2
Entsprechend kannst du nicht mit .NET 7.0 oder neuer arbeiten.

Die Abhängigkeit von weiteren Paketen, grenzen dann ebenfalls die möglichen .NET Versionen ein.

Link:
https://www.nuget.org/packages/ScottPlot/#package-manager

Nachtrag:
Die WinForms Erweiterung hängt ebenfalls nur von max. .NET 6.0 und .NET Framework 4.6.2 ab.
Entsprechend hast du auch da die Einschränkung, dass du bei .NET 6 oder Framework hängen bleiben musst.

Link:
https://www.nuget.org/packages/ScottPlot.WinForms

T-Virus

06.06.2024 - 14:35 Uhr

Das Problem sollte wohl seit 2022 gefixt sein, da Xamarin aber auf dem Abstellgleis steht bzw. auch seit Anfang Mai keinen support mehr hat, wird vermutlich kein weiterer Support in der Richtung passieren.

Ansonsten habe ich auf die schnelle nur folgendes gefunden:
https://developercommunity.visualstudio.com/t/cannot-load-apple-certificates/1692185?viewtype=solutions

Ich hoffe es kann dir helfen.

T-Virus

27.05.2024 - 12:08 Uhr

@Sprintown
Besser wäre switch case zu nehmen.

Link:
https://www.freecodecamp.org/news/python-switch-statement-switch-case-example/

T-Virus

23.05.2024 - 13:04 Uhr

Deshalb solltest du den Rat von Abt folgen und dir mal die Doku anschauen und mit entsprechenden Lehrmaterial dich einarbeiten.
Anders kommst du nicht an das Wissen und die Erfahrung um den Code zu verstehen.

T-Virus

23.05.2024 - 12:23 Uhr

@Caveman
Eigentlich kann man auf das Dictionary komplett verzichten und direkt mit einem Array arbeiten.
Du musst nur über den Index direkt auf das Array zugreifen und dort dann die Einträge hochzählen.

T-Virus

21.05.2024 - 22:16 Uhr

Klingt ein wenig nach WebDAV was du willst.
Das basiert auf Http aber hat nicht primär Dateisynchronisierung vorgesehen.

Wiki:
https://de.wikipedia.org/wiki/WebDAV

T-Virus

17.05.2024 - 11:08 Uhr

Man sollte nie den Defender und einen anderen Antivren Software gleichzeitig laufen lassen.

Führt immer zu Problemen, da diese sich auch gerne mal beide über die Füé laufen.

Wir hatten dabei auch Theater und sind komplett auf Defender umgestiegen, da Eset und Defender sich nicht zusammen vertragen hatten.

T-Virus

18.04.2024 - 12:58 Uhr

Was du da machst, ergibt keinen Sinn?
Erst instanzierst die Variable prodDataProfinet neu um diese dann mit der Referenz von prodData zu überschreiben.
Dadurch wirfst du die neue Referenz von prodDataProfinet weg und arbeitest du die Zuweisung von prodData zu prodDataProfinet über die gleiche Referenz auf prodData auch wenn du mit prodDataProfinet arbeitest.
Dadurch verändert sich bei der letzten Zeile in prodData auch die prodSW zu Null.

Die Übergabe mit ref kannst du dir sparen, wenn du prodData nicht überschreibst sondern nur die Properties änderst.
Dies wäre nur nötig, wenn du den Parameter auf null setzen willst oder mit einer anderen Instanz/Wert überschreiben willst.
Ist in dem Fall aber nicht zu erkennen!

Nachtrag:
Anbei ist es nicht ratsam für Variablen den gleichen/ähnlichen Namen zu verwenden, wie für Methoden.
Dadurch kommt man beim lesen auch gerne durcheinander.

T-Virus

17.04.2024 - 11:08 Uhr

Wenn du den Code von dem Service und dem Task ändern kannst, dann würde ich auch weg von der Ini Datei gehen.

Diese haben im .NET Umfeld eigentlich kein Existenzrecht mehr, dafür gibt es entweder die App.config (XML) oder die appsettings.json (JSON)

Damit würdest du vermutlich besser fahren, da beide Formate gut dokumentiert und auch die Klassen zum lesen/schreiben direkt teil von .NET sind.

Damit wäre deine Anwendung übrigens auch portierbar, da du aktuell an den Win32 Apis hängst.

Entsprechend wäre z.B. ein Wechsel zu anderen Platformen wie Linux nicht umsetzbar.

T-Virus

16.04.2024 - 09:57 Uhr

Klingt dann entweder nach falschem Klassenaufbau oder dein Authorization Header ist falsch.

Bzw. kann auch dein Json falsch sein, beachte hier, dass die Properties richtig serialisiert werden bzw. mit dem richtigen Schreibweise.

Per Default werden die Properties 1:1 wie sie geschrieben werden, serialisiert.

Hier braucht json aber einen kleinen Anfangsbuchstaben, entsprechende Einstellungen kannst du aber mitgeben.

Ggf. brauchst du im Header auch den Bearer mit dem Api Token.

Muss aber in der jeweiligen Api Doku stehen.

T-Virus

14.04.2024 - 10:53 Uhr

Hier muss man erstmal abwarten ob die CPUs auch leisten können, was man von ihnen erwartet.

Ebenfalls mus der Preis passen.

Niemand wird sich Windows Hardware/Software für Apple Preise kaufen, dann kann man auch direkt ein MacBook nehmen.

Und die Softwareauswahl muss dann auch erstmal reifen und zeigen ob sie ihren x86 Pendanten in nichts nachsteht.

Erst wenn das Ökosystem sich angleich, kann sich ARM auch mit Windows durchsetzen.

Gerade im mobilen Bereich wäre das mit Energie effizienten CPUs eine Verbesserung.

Mal schauen wie sich das Thema entwickelt.

T-Virus

12.04.2024 - 10:46 Uhr

Kommentarfunktion für News scheint kaputt zu sein.

Wollte gerade einen kurzen Kommentar zur News mit dem neuen Solution Format schreiben.

Folgende Meldung wwird nach dem Absenden angezeigt.

Der Kommentartext muss mindestens 1000 Zeichen lang sein.

Ist etwas lang für einen Kommentar.

Ggf. falsche Validierung bei Länge?

01.03.2024 - 13:05 Uhr

Web Server auf Endgeräten hosten ist keine gute Idee.

Soweit mir dies von der letzten Diskussion in Erinnerung geblieben ist, blockt Apple dies auch aktiv.

Warum nutzt du keine richtige Anwendung bzw. hostet direkt ein Web und rufst die Anwendung dann nur im Browser auf?

Ich halte diesen Ansatz auch nicht für zielführend bzw. technisch am sinnvollsten wenn es eben Alternativen gibt.

Nachtrag:

Hab sogar deinen alten Foren Thread gefunden:

https://mycsharp.de/forum/threads/125403/lokal-hosten-eines-https-server-auf-net-maui?page=1#forumpost-3839954

Achte auch hier auf den ersten Kommentar von Abt!

T-Virus

28.02.2024 - 12:31 Uhr

Ist für mich halt eine Red Flag, weil dies auch auf einen Entwicklungsstopp oder einfach ein Ende des Projekts hindeutet.

Das es die Mehrheit der Nuget Pakete betreffen würde denke ich auch, hab schon einiges veraltete oder tote Pakete gefunden.

Aber 99% halte selbst ich für zu hoch oder hast du eine Statistik dafür?

Warum .NET selbst?

Es geht mir nur darum, dass es ein einziges Open Issue gibt was seit Jahren rumgammelt und es auch seit 4 Jahren kein comitt mehr gibt.

Das zusammen zeigt mir, dass das Projekt im Grunde tot ist bzw. sich nichts mehr tut.

Bei .NET und den meisten Projekten gibt es auch offene Issues die teilweise Jahre offen sind, diese werden aber i.d.R. noch weiterentwickelt weshalb die Prioritäten so das andere Issues vorang haben.

T-Virus

28.02.2024 - 08:54 Uhr

Mit einem Open Issue von 2018 würde ich das Paket sicherlich nicht installieren.

Mir ist auch aktuell der Kontext nicht klar, wie das Paket jetzt die Kommunikation mit einem 3D Drucker lösen soll.

Wenn dieser auch keine Software Schnittstelle (API) anbietet, kann man diesen auch nicht ansteuern.

Erste Anlaufstelle wäre eher beim Hersteller des Geräts anzufragen ob es eine entsprechende Api gibt.

Ohne diese kann man sich jede weitere Suche sparen.

T-Virus

18.02.2024 - 10:53 Uhr

Kommt halt darauf an was dein Ziel ist.

Wenn du z.B. ein SPA planst, dann machen Frameworks wie Vue und co. schon Sinn und dann brauchst du eben nur die Api auf Server Seite.

Wenn du aber eine Anwendung planst, die auf Seiten verteilt ist wie z.B. mit Razor Pages und auch Serverseitige alles gerendert werden soll, dann kannst du auch mit Razor Pages gut arbeiten.

Was ich bisher gelesen habe klingt wie eine SPA und damit bräuchstest du Serverseitig nur die API.

T-Virus

18.02.2024 - 10:17 Uhr

Das "normale" .NET ist das .NET Framework, was aber im Grunde keine Zukunft mehr hat.

Es wird im Grunde nur noch für Legacy Software am Leben gehalten, der Rest hat sich mit .NET Core bzw. jetzt .NET 8+ schon weiterentwickelt.

Auf das .NET Framework sollte man bei Neuentwicklungen nicht mehr aufsetzen, wenn man keinen driftigen Grund hat.

T-Virus

18.02.2024 - 09:49 Uhr

Einen guten Anfang kann man bei der Doku von ASP .NET machen.

Mir ist aber nicht klar woher die News mit Blazor sei tot kommt.

Wird von Microsoft nicht mal im Ansatz in der Doku erwähnt.

Blazor ist auch nur eine Möglichkeit, wie man Web Anwendungen entwickelt.

Gibt auch noch andere Ansätze wie z.B. mit Razor Page.

Kannst du dir in der Doku mal anschauen.

Link:

https://learn.microsoft.com/de-de/aspnet/core/tutorials/choose-web-ui?view=aspnetcore-8.0

T-Virus

15.02.2024 - 11:51 Uhr

Wenn du die Lib verteilst, dann sollte der User der Lib entscheiden wann er etwas loggt.

I.d.R. machen das auch alle mit bekannten Libs so, dass dort der User einen entsprechenden Logger mitgeben muss um Ausgaben zu bekommen.

Ein Beispiel dafür ist z.B. StackExchange.Redis wo über Injection dann die Nullable ILogger Instanz mitgegben wird.

Wenn diese nicht gesetzt ist, dann wird auch nichts geloggt.

Da du auch nicht wissen kannst in welchen Umgebungen deine Lib verwendet wird, wäre es fatal wenn du dort Vorgaben mit nötigen Logging hast.

Ggf. läuft deine Lib in einer Anwendung im Embedded Bereich, dann wäre auch Logging ggf. gar nicht möglich oder nur im kleinen Bereich.

T-Virus

09.02.2024 - 20:15 Uhr

Mal von der schlechten Formatierung abgesehen, ist das kein C# sondern C++ Code.

Ist das falsche Forum bzw. die falsche Programmiersprache.

T-Virus

02.02.2024 - 11:22 Uhr

Literatur über .NET bzw. C# Fullstack wirst du keine finden, dafür sind die Bereiche für die du C# und .NET einsetzen kannst einfach zu groß.

Du kannst aber für .NET 6 einige brauchbare Bücher finden.

Z.B. hab ich folgendes, was ich immer mal wieder lese.

Dort sind zwar alle Bereiche angeschnitten, aber keins zu 100% abgedeckt.

Ist auch kaum möglich bei der Fülle an Möglichkeiten.

Ansonsten hilft aber auch die Doku für ASP .NET Core als Einstieg.

Link:

https://www.amazon.de/NET-Grundlagen-Profiwissen-Rezepte/dp/3446469303/ref=sr_1_3?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=2E14PY5EZ88ZF&keywords=C%23+Buch&qid=1706869248&sprefix=c%23+buch%2Caps%2C96&sr=8-3

T-Virus

09.01.2024 - 16:05 Uhr

Ah okay.
Kann man ggf. einen Hinweis oder Warnung anzeigen, wenn man im Text ein Zeichen hat ohne entsprechendes Quote?
Bei langen Texten/Antworten geht sonst was verloren und man merkt es nicht.

T-Virus

09.01.2024 - 15:44 Uhr

Hab ggf. noch einen Fehler gefunden.
Beim schreiben einer Antwort mit dem Text List<blub> scheint die Antwort u.U. einen Filter/Parser anzuwenden, der dann die Zeile zerlegt.
Ist das ein bekanntes Problem?

Link:
https://mycsharp.de/forum/threads/125623/abstrakte-klasse-mit-listeadresse

Bei der Antwort werden Spitze Klammern scheinbar samt Inhalt entfernt.

Dadurch wird aus der List "<"T">" dann List.

Nachtrag:

Beim erstellen des Beitrags wird der Text entfernt, beim bearbeiten dann nicht mehr.

Scheint also ein Problem beim anlegen zu sein.

T-Virus

09.01.2024 - 15:29 Uhr

Beide Ansätze würde ich so nicht machen.
Ich würde einfach eine Property "Addresses" vom Typ List in die Basis Klasse einfügen.
Diese kann als auto Property auch direkt initialisiert werden z.B. mit dem Default Konstruktor von List.
Oder gibt es hier einen Grund für die Liste mit abstract zu markieren?

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        Teacher teacher = new Teacher();
        teacher.Addresses.Add(new Address());
        
        Student student = new Student();
        student.Addresses.Add(new Address());
    }
}

public class Address
{
    public string Postal { get ; set; }
    
    public string City { get ; set; }
    
    public string Street { get ; set; }
    
    public string Country { get ; set; }
}

public abstract class Human
{
    // Liste direkt bei Instanzierung erstellen lassen
    public List<Address> Addresses { get; set; } = new List<Address>();
}

public class Teacher : Human
{
    // Weitere Properties hier einfügen
}

public class Student : Human
{
    // Weitere Properties hier einfügen
}

T-Virus

12.12.2023 - 11:40 Uhr

Wenn du nur eine Seite hast, warum hast du dann nicht einfach ein Modell mit entsprechenden Properties mit allen Daten?
Dieses Modell kann dann einfach zwei Properties haben, jeweils für Person und Animal.
Dann kannst du Combine einfach als getter umsetzen, der dann die Anzeige liefert.
Oder denke ich gerade zu einfach?

T-Virus

11.12.2023 - 11:11 Uhr

Hab mir den Code angeschaut und muss Th69 sowie Abt beipflichten.
Du arbeitest hier im Grunde komplett an WPF vorbei.
In deiner Page.xaml.cs stehen auch am Ende sämtliche Klassen, die du dort nutzt.
Die .cs Datei ist ein Paradebeispiel wie man es in WPF und auch in C# im allgemeinen nicht macht.
Schau dir die Artikel für "MVVVM und DataBinding" sowie Drei-Schichten-Architektur umbedingt an, damit du dort eine saubere Trennung zwischen Code und UI hinbekommst.

An sonsten bleibt auch der Blick in die Doku von Microsoft selbst immer ein wichtiger Einstiegspunkt in solche Themen.
Diese solltest du neben den Artikeln ebenfalls durchlesen und ggf. mit kleinen Testprojekten erstmal verinnerlichen.
Sonst wirst du bei WPF nicht glücklich und zukünftig nur noch Krücke und Krücke bauen, da du am Grundkonzept vorbei arbeitest.

Doku:
https://learn.microsoft.com/de-de/dotnet/desktop/wpf/getting-started/introduction-to-wpf-in-vs?view=netframeworkdesktop-4.8
https://learn.microsoft.com/de-de/dotnet/desktop/wpf/introduction-to-wpf?view=netframeworkdesktop-4.8

Nachtrag:
Weiterer Kritikpunkt ist auch, dass sich der Aufbau deiner Klasse unnötig wiederholt.
Entweder brauchst du mehr Abstraktion, also einen Basisklasse, oder es reicht eine Klasse für deine Varianten.
Dadurch sparst du vermutlich schon mehr als die Hälfte deiner Klassen aus.

Ebenfalls sind alle Properties in diesen Klasse nur stumpfe Strings.
Die Bezeichnungen wiedersprechend sich auch bzw. gibt es Konstruktore die bool entsprechen.
Dadurch wird der Code nicht nur unklarer, es nutzt auch unnötig mehr Speicher und du umgehst damit das Typsystem komplett.
Entsprechend kann sonst was in den Properties stehen, am Ende musst du dann noch zusätzliche Konvertierungen und Fehlerbehandlungen umsetzen.
Damit machst du dir zusätzlich unnötige Arbeit, die dir das DataBinding mit Eingabevalidierung abnimmt.

Im Code habe ich auch folgende Zeile gefunden:

ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

Für mich sieht das ganze aber nicht nach einem nicht kommerziellen Projekt aus bzw. sieht es nach einem Firmeninternen Projekt aus.

Ob dann die Lizenz hier korrekt ist, müsste ebenfalls noch geprüft/geklärt werden!

T-Virus

07.12.2023 - 18:31 Uhr

Und was genau ist das Problem bei deinem jetzigen Code/Ansatz?
Wenn du nicht sagst wo es Probleme/Fehler gibt, kannst du ewig auf eine Antwort warten.
Ebenfalls wirst du kaum für deinen Ansatz eine 1:1 Anleitung finden, da es vermutlich zig Ansätze gibt, die alle zum gleichen führen können.

Ansonsten wäre es ggf. hilfreich zu erklären was dein "Auto" sein soll.
Meinst du damit den nahtlosen Übergang zwischen Blazor Server und WebAseembly.
Dann wäre immer noch unklar was genau das Problem ist.

Anbei hast du oben die Doku bekommen.
Da hast du schon einen Ansatz, musst du nur mal lesen und schauen ob es für dich passt.
Beispiel gibt es dort auch.

T-Virus

06.12.2023 - 15:23 Uhr

Aus deinem Post geht nicht hervor was den das Problem bei der Migration ist.
Gibt es einen Fehler, fehlen Methoden etc.
Wenn nicht gerade zufällig jemand das gleiche Problem hat, dann dürfte es schwer werden dir zu helfen.

Ansonsten hilft immer der Blick in die Doku:
https://learn.microsoft.com/de-de/aspnet/core/blazor/security/?view=aspnetcore-8.0#authenticationstateprovider-service

T-Virus

01.12.2023 - 12:23 Uhr

Die Meldung sagt im Endeffekt, dass dein Control AddEmployeeButton bereits ein Unterelement eines anderen Controls ist.
Entsprechend musst du AddEmployeeButton erst entfernen und dann dem MainGrid wieder hinzufügen.
Ob das aber so sauber gelöst ist, würde ich erstmal bezweifeln.
Dann du musst dann auch wieder die Umkehrung des Ganzen umsetzen.
Ich habe da meine Zweifel, dass dies durch Code Behind sauber gelöst wird.
Ggf. müsste man dies über Styles umbrechen lassen können.

T-Virus

30.11.2023 - 13:22 Uhr

Da es bei dem Thema um eine Umstellung von lokaler APF Anwendung zu Cloud DB geht, muss man davon ausgehen, dass es hier einen Mehrbenutzerzugriff gibt.
Ich bezweifle, dass er für jede Installation eine eigene Datenbank einrichten wird/will.
Auch wird es nicht pro Gerät einen Benutzer geben.
Die Verwaltung + Kosten dürfte dann bei vielen Benutzern Kostenrahmen sprengen.
Entsprechend ergibt sich schon aus dem urspünglichen Vorhaben der Mehrbenutzer Zugriff.

Ansonsten hattest du übrigens selbst VPN in den Ring geworfen.
Das du dann keine zwei Antworten noch die Frage stellst, wer davon redet, ist auch eine wundersame Art das Thema zu leiten.

Der Lösungsansatz sowohl mit VPN sowie SSH führt aber zu dem gleichen Problemen, wie ich es oben schon angemerkt habe.
Auch dort kannst du den Datenabfluss überhaupt nicht kontrollieren.
Sobald jemand den Rechner karpert, kannst du genau 0 gegen einen Datenabfluss machen.
Da sich in dieser Situation auch noch alle den gleichen Zugang teilen müssten, wäre unmöglich irgendwas sinnvolles zu protokollieren.
Du lieferst also ohne eine Api vor der DAtenbank die DAten in jeder Form den Leuten mit Zugriff aus.

Eine Api bringt dann auch weitere Vorteile, die dir der rohe DB Zugriff nicht bieten kann.
Z.B. kann man in einer Api noch zusätzliche Authetifizierung sowie Authorisierung umsetzen.
Gerade Authorisierung kann u.U. durch eine Lizenzmodell bestimmte Zugriffe blockieren, was mit direkten Zugriff nicht möglich ist.
Ebenfalls sind Caching, Logging und weitere Möglichkeiten erst mit einer Api sauber machbar.

T-Virus

29.11.2023 - 14:01 Uhr

Wenn du bisher nur mit der DB auf dem gleichern Server gearbeitet hast, dann ist jetzt Zeitpunkt auf eine Api umzulernen.
Gute Ansätze dafür gibt es z.B. mit Microsofts Web Api mit Json als Format.
Entsprechende Anleitungen und Lernbeispiele gibt es auch in der Doku von Microsoft.

Doku:
https://learn.microsoft.com/de-de/aspnet/core/fundamentals/apis?view=aspnetcore-7.0
https://learn.microsoft.com/de-de/aspnet/core/tutorials/first-web-api?view=aspnetcore-7.0&tabs=visual-studio

Nachtrag:

@pollito
Den VPN Ansatz würde ich schon aus Kontrollgründen nie verwenden.
Wenn jemand Zugriff auf das VPN bekommt, was schon durch einen Rechner eine Benutzer passieren kann, dann wäre der Datenabfluss nicht kontrollierbar.
Da man dann durch das VPN in falscher Sicherheit gewiegt ist, macht sich kaum einer die Mühe mehr als Benutzer/Passwort zur DB zu konfigurieren.
Durch eine Api, ist der Zugang zur Datenbank sauber gesichert.
VPN zur DB ist also kein Ersatz für eine Api!

T-Virus

20.11.2023 - 16:06 Uhr

Der Code ist alles andere als lesbar und ohne Hintergrundwissen zum Aufbau der Datei nicht ganz klar.
Der Hintergrund scheint zu sein, dass es sich dabei um eine Job Liste für das Spiel Euro Truck Simulator 2 (ETS2) handelt.

Es wäre vermutlich einfacher, wenn du den Code umstrukturierst als am jetzigen festzuhalten.
Wenn der Aufbau der Job Einträge gleich ist, was dein StringBuilder Ansatz suggeriert, wäre es vermutlich sauberer eine eigene Klasse für die Jobs sowie zum lesen/schreiben der Liste jeweils eine Reader/Writer Klasse anzulegen.
Der Reader kann dir im einfachsten Fall aus der Datei die Jobs als Liste liefern, der Aufbau sollte im einfachsten Fall für alle Jobs gleich sein.
Der Writer kann diese Liste anch Anpassung dann sauber zurück schreiben.
Damit wäre dein Code sauber aufgeteilt und sollte nur gültige Jobs lesen/schreiben.

Wenn es sich nicht zufällig bei dem Format der Dateien um JSON handelt, könntest du sogar direkt über De/Serialisierung arbeiten z.B. mit System.Text.Json
Dann kannst du dir die Reader/Writer Klassen sparen, gibt es dann Quasi an Bord.

Nachtrag:
Könntest du eine Beispieldatei liefern bzw. eien Ausschnitt mit mehreren Jobs pasten?
Dann könnte man u.U. das Format ableiten, aber sieht sehr nach JSON aus.

T-Virus

20.11.2023 - 14:53 Uhr

Wenn du den Content der gesamten Datei in der Liste hast, ist es am einfachsten die Datei komplett neu zuschreiben.
Dann kannst du einfach mit File.WriteAllLines arbeiten und die Liste dann schreiben lassen.
Wäre die einfachere Lösung als selbst die passenden Zeilen ermitteln und zu schreiben.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.io.file.writealllines?view=net-8.0#system-io-file-writealllines(system-string-system-collections-generic-ienumerable((system-string)))

T-Virus

03.11.2023 - 20:10 Uhr

Wozu willst du noch Windows XP als Zielplatform berücksichtigen?
Windows XP ist seit vielen Jahren ohne support, da würde ich keine 5 Min. für eigenen Software Support verschwenden.

async/await gibt es ebenfalls seit mehreren Jahren.
Wenn man nicht gerade mit uralten und nicht mehr supporteten .NET Versionen arbeitet, kommt man schon durch aktuelle Libs damit in Kontakt.
Entsprechend ist es heute recht schwierig sich um async/await zu drücken.

Abt hat dir alle wichtigen Mittel gegeben.

Wenn dir auf "Arbeit" weder Zeit zum debuggen noch in einfaches lesen der Doku gesteckt werden darf, dann ist dein Arbeitgeben kein Softwareentwickler oder IT Dienstleister.
Falls doch, dann kein ernstzunehmender.
Das gehört zu den grundlegenden Aufgaben einen Software Entwickler.

Wenn es hier um ein privates Projekt geht, dann solltest du dies auch in deiner Freizeit entwickeln.
Auf Arbeit muss man sich nunmal um die Arbeit kümmern, da ist kein Platz für private Projekte.

T-Virs

01.11.2023 - 19:41 Uhr

Anstelle von zwei Listen solltest du schauen ob ggf. eine andere Datenstruktur nicht besser wäre.
Z.B. bei einer reinen Prüfung ob Artikelnummern vorhanden sind, wäre HashSet<T> schneller als eine Liste.

Bei Listen muss immer umständlich über alle Einträge bis zu einem Treffer gesucht werden, was abhängig von der Menge  der Einträge und der komplexität der Suche enorm Zeit fressen kann.
Dann brauchst du nur das HashSet<string> und nur eine Schleife um die äußeren Artikel zu prüfen.

public class Artikel
{
    public string NR { get; set; }
    public bool Skip{ get; set; }
    public string Artikel { get; set; }
}

List<Artikel> artikelListe = new List<Artikel>();
HashSet<string> nummern = new HashSet<string>();

// Hier musst du deine Artikel einladen und das HashSet mit den Nummern füllen
// Die Schleife könntest du auch mit Linq vereinfachen, lasse ich hier aber aus für das einfachere Verständnis!

foreach(Artike artikel in artikelListe)
{
    if (!nummern.Contains(artikel.NR))
        artikel.Skip = true;
}

T-Virus