Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Stoffel000
Thema: System.Reflection(setValue) TargetException trotz Typumwandlung
Am im Forum: Grundlagen von C#

@ Th69,

danke für die Lösung! Da habe ich den Wald vor lauter Bäumen nicht gesehen!

Die richtige Lösung ist (falls jemand das gleiche Problem hat):


if (tabellen.TryGetValue(p.Name.ToLower(), out var val))
{
    try
    {
        Type etype = Nullable.GetUnderlyingType(p.PropertyType) ?? p.PropertyType;
        p.SetValue(obj, Convert.ChangeType(val, etype));
    }
    catch { }
}

@Abt
Der string entsteht durch das Einlesen aus einer Datei, die "wild" (kein .csv, .xml usw.) durch ein anderes Programm erstellt wird. Diese Datei wird eingelesen und die strings (die ja in diesem Fall aus der Datei als string kommen) weiterverarbeitet. Somit erhalte ich einen string der z.B. ein DateTime darstellt.
Würde es deiner Meinung nach eine bessere Alternative geben dies zu lösen? Ich bin für alles Offen und lasse mich gerne auf andere Ideen/Möglichkeiten bringen.

Thema: System.Reflection(setValue) TargetException trotz Typumwandlung
Am im Forum: Grundlagen von C#

Hallo Palladin007,

Das Dateiformat ist wild. Es ist kein bekanntes Format, das irgendwelchen Regeln folgt.

Das mit der direkten Konvertierung habe ich auch versucht.


if(p.PropertyType == typeof(DateTime)
{
    if(DateTime.TryParse(value, out DateTime dt))
    {
        p.SetValue(p.Name, dt); // <-- Auch hier erhalte ich den Fehler
    }
}

Selbst bei dieser direkten Konvertierung klappt es leider nicht. Der Fehler ist der gleiche.
Die Convert.ChangeType-Methode hatte ich nur versucht, weil es mit der direkten Methode nicht funktioniert hat.

Thema: System.Reflection(setValue) TargetException trotz Typumwandlung
Am im Forum: Grundlagen von C#

Hallo an alle im Forum. Ich habe leider ein Problem mit dem schreiben von Werten in eine Klasse.
Egal um welchen Typ es sich handelt (string, int, double, double?), ich bekomme immer folgende Fehlermeldung

Fehler
System.Reflection.TargetException: "Das Objekt stimmt mit dem Zieltyp nicht überein."

Dies passiert in folgendem Codeausschnitt:


foreach (PropertyInfo p in pi) // Propertys aus meiner Klasse
{
    if (dicTemp.TryGetValue(p.Name.ToLower(), out var val)) // Dictionary von einer Datei aus einer anderen Anwendung
    {
        try
        {
            Type etype = Nullable.GetUnderlyingType(p.PropertyType) ?? p.PropertyType;
            p.SetValue(p.Name, Convert.ChangeType(val, etype)); // <-- Hier erhalte ich die Exception
        }
        catch { } // Nur zum testen damit Programm weiter läuft
    }
continue; // hier zu Testzwecken ein Abbruch

Beispiele zum verdeutlichen:
Format: string: "01.01.2022 00:00:00" aus dem Dictionary soll in ein DateTime-Format geschrieben werden
Format: string: "11" aus dem Dictionary soll in ein Integer-Format geschrieben werden

In beiden Fällen ist die Umwandlung ohne Fehler abgeschlossen und der Wert wird mit dem entsprechenden Datentyp angezeigt.

Zum Test habe ich auch versucht einen Konstanten wert


int test = 12;
p.SetValue(p.Name, test);

oder auch


string test = "12";
p.SetValue(p.Name, (int)test);

versucht. Leider bekomme ich immer die gleiche Fehlermeldung. Die Properties der Klasse verfügen alle über get{} und set{} und können somit beschrieben werden.

Thema: Explorerfenster in den Vordergrund mit Beachtung des Pfades
Am im Forum: Rund um die Programmierung

Danke, danke, danke!!

@Th69: Ich habe viel zu kompliziert gedacht. Deine Lösung funktioniert einwandfrei!

@Abt: zu Punkt 1: Da hast du wirklich recht. Ich arbeite ein altes Programm auf, bei dem leider solche Dinge noch vorhanden sind. Wird aber noch geändert

zu Punkt 2: Ich habe viel zu kompliziert gedacht. Die Lösung von Th69 war für mich die richtige. Ich hatte das Problem, durch das starten des Prozesses mit


Process.Start("explorer.exe", pfad);

wurde immer eine neue Instanz des Explorers geöffnet (ist ja auch klar). Somit hatte mein Programm bei jedem Aufruf eine neu Instanz geöffnet. Wenn diese der Benutzer nicht geschlossen hat, waren es mehrere Instanzen mit dem gleichen Pfad. Das wollte ich vermeiden.

Ich habe es jetzt so gelöst:


internal bool OpenExplorer(string path)
        {
            try
            {
                Process.Start(path);
            }
            catch(Exception e)
            {
                MessageBox.Show($"Folgender Fehler wurde erzeugt:\n{e}", "Fehler beim Öffnen des Ordners", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

Somit ist auch Punkt1 erledigt

Thema: Explorerfenster in den Vordergrund mit Beachtung des Pfades
Am im Forum: Rund um die Programmierung

Hallo Community,

ich habe ein Problem bei dem ich leider absolut nicht weiter komme.

Ich will von meinem Programm ein Explorer-Fenster öffnen. Wenn dieser Pfad noch nicht in einem Fenster geöffnet ist, erstelle ich einen neuen Process. Das funktioniert auch soweit.


internal bool ExplorerfensterÖffnen(string pfad)
        {
            try
            {
                SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();

                string filename, folderPath = "";
                foreach (SHDocVw.InternetExplorer ie in shellWindows)
                {
                    filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

                    if (filename.Equals("explorer"))
                    {
                        folderPath = ie.LocationURL;
                    }
                    if (folderPath.Length > 0)
                    {
                        folderPath = folderPath.Substring(8);
                        folderPath = folderPath.Replace("/", "\\");
                        folderPath = folderPath.Replace("%20", " ");
                    }
                    if (folderPath == pfad)
                    {
                        string result = new DirectoryInfo(folderPath).Name;
                        IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, result);
                        if (windowPtr == IntPtr.Zero)
                        {
                            // Fenster ist nicht vorhanden, neues Fenster im Explorer öffnen
                            Process.Start("explorer.exe", pfad);
                            return true;
                        }
                        else
                        {
                            // Fenster ist vorhanden, und wird in den Vordergrund geholt
                            IntPtr handle = windowPtr;
                            if (IsIconic(handle))
                            {
                                ShowWindow(handle, SW_RESTORE);
                            }

                            SetForegroundWindow(handle);
                            return true;
                        }

                    }
                }
            }
            catch 
            {
                return false;
            }
            // Kein Fenster geöffnet
            Process.Start("explorer.exe", pfad);
            return true;
        }

Jetzt zu meinem Problem:
Durch unterschiedliche Laufwerke (Lokal, Netzlaufwerk) und unterschiedliche Ordnerstrukturen (Ordner1\Ordner2 und Ordner3\Ordner2) wird immer das erste Fenster mit "Ordner2" in den Vordergrund geholt. Die Suche berücksichtigt nicht den gesamten Pfad, was allerdings in diesem Fall nötig wäre.

Ich hoffe ich habe mich verständlich ausgedrückt. Für Tipps, wie ich das lösen kann, bin ich sehr dankbar.

Grüße Stoffel

Thema: Zugriff auf Klasse mittels String-Variable
Am im Forum: Grundlagen von C#

Danke für die Hilfe. Da werde ich dann mal lesen und googlen um das zu verstehen. Die Eigenschaftsnamen setzte ich mit ToLower() alle auf Kleinbuchstaben. Somit sind sie dann gleich.

Danke, danke, danke. Hast mir sehr geholfen.

Grüße

Thema: Zugriff auf Klasse mittels String-Variable
Am im Forum: Grundlagen von C#

Hallo Th69,

ich habe mir soeben den verlinkten Beitrag angesehen. Leider verstehe ich das nicht ganz. Kannst du mir ein Beispiel geben?

Danke

Grüße Stofffel000

Thema: Zugriff auf Klasse mittels String-Variable
Am im Forum: Grundlagen von C#

Hallo JimStark,

hier ein kleiner Ausschnitt meiner Klasse:


 public class ClassDatenblatt_DC
    {
        public int Id { get; set; }
        public string Zeitstempel { get; set; }
        public string Ersteller { get; set; }
        public Nullable<int> Status { get; set; }
        public string Datum { get; set; }
        public string Artnr { get; set; }
        public string Berechnungsnummer { get; set; }
        public Nullable<int> Version { get; set; }
        public Nullable<int> Aenderung { get; set; }
        public string Stromrichter { get; set; }
....
}
und hier ein Ausschnitt der List:


 wandlerlistDc = new List<Tuple<string, string, string, string, string, string>>
            {
                new Tuple<string, string, string, string, string, string>("abnummer", "", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("pos", "", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("status", "status", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("erst_dat", "datum", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("a1", "berechnungsnummer", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("v1", "version", "", "", "", ""),
....
}

Wenn aus meiner List der 5. Eintrag an der Reihe ist, soll a1 als Label angezeigt werden und die Berechnungsnummer als Wert der Klasse geladen werden (würde dem 7. Eintrag der Klasse entsprechen.)
Der Zugriff auf den Wert der Klasse funktioniert mit:


internal Klassenbibliothek.ClassDatenblatt_DC neuerDatensatzBearbeiten = new Klassenbibliothek.ClassDatenblatt_DC(); //erstellen einer Ableitung der Klasse
TextBox.Text = neuerDatensatzBearbeiten.berechnungsnummer;
Da ich aber über den String der List zugreifen möchte (um mir sehr viel Arbeit zu ersparen) müsste das in etwa so aussehen:


internal Klassenbibliothek.ClassDatenblatt_DC neuerDatensatzBearbeiten = new Klassenbibliothek.ClassDatenblatt_DC(); //erstellen einer Ableitung der Klasse
TextBox.Text = neuerDatensatzBearbeiten.[StringDerListeFürDenZugriff];

Wie gesagt ich bin nicht wirklich fit in der Programmierung. Sollte ich einen komplett falschen Ansatz gewählt haben, dies bitte auch sagen und evtl. einen Vorschlag machen wie ich es besser machen könnte.

Danke.

Thema: Zugriff auf Klasse mittels String-Variable
Am im Forum: Grundlagen von C#

Hallo liebes Forum,
in diesem Forum habe ich schon oft Hilfe gefunden. Doch leider diesmal nicht. Ich bin ziemlich neu in der Programmierung und habe momentan ein Problem an dem ich mir die Zähne ausbeiße.


List<Tuple<string, string>> list = new List<Tuple<string,string>>();
TextBox.Text = MeineKlasse.[hier sollte der 2. wert der liste stehen];

Die Klasse selbst und auch die List ist kein Problem. Das funktioniert soweit. Nun meine Frage: Ist es möglich aus dem String der List auf ein Objekt der Klasse zuzugreifen?

Dies ist ein vereinfachtes Beispiel. Die Klasse selbst hat über 400 Objekte und die List hat 6 Strings. Ein direkter Zugriff wäre zwar möglich aber ein sehr hoher Programmieraufwand.

Ich hoffe ich habe nichts vergessen. Falls doch, bitte einfach nachfragen.

Danke im Voraus.

LG Stoffel000