OK, ich hatte erst überlesen, daß es sich um einen direkten Screenshot vom Handy handelt.
Deinen angehängten (mit Paint.NET bearbeiteten) Screenshot kann ich aber problemlos sowohl im Window-Explorer (auch separat im Vorschaufenster) als auch in "Fotos" oder IrfanView anschauen. Ich sehe auch in den Metadaten nichts auffälliges.
Um DataBinding mit WinForms und dem DataGridView (DGV) zu verstehen, empfehle ich den Artikel A Detailed Data Binding Tutorial (bes. auch den dazugehörigen Source-Code zum Testen und Ausprobieren).
Generell solltest du dein Programm nach und nach auf die 3-Schichten Architektur umstellen (d.h. Trennung von UI, Logik und Datenzugriff), dadurch vereinfacht sich vieles am Programmcode (und du bist nicht auf dauernde Workarounds angewiesen).
Hab Dir auch den Link gegeben, in dem steht, dass Du .Result nicht verwenden sollst. Denke nicht mal 1% der .NET Entwickler werden den eigentlichen Sinn von .Result verwenden (müssen); in 99% ist es ein (unwissentlicher, aus Bequemlichkeit) Missbrauch, der die im Link beschriebenen negativen Nebenwirkungen hat, die dann Fehler auslösen können, die dann schwer zu finden / reproduzieren sind.
Hast du evtl. den falschen Link gepostet, denn der bezieht sich auf die TPL (nicht Task) - da steht zumindestens nichts von Task.Result?
Gefunden habe ich z.B. C# Async Antipatterns ("4. Blocking on tasks with .Result or .Wait").
Hallo MoaByter,
und dies ist dann auch der Grund warum dein bisheriger Code hängenbleibt. Du blockierst mittels task.Result den UI-Thread und in deinem Nebenthread wird versucht den UI-Thread (per Invoke) anzusprechen (der aber gerade auf das Ende der Methode wartet -> Deadlock!).
Gerade habe ich die Suche benutzt, und neben dem schon von @Wilfried gemeldeten Fehler bzgl. „Treffer als Themen anzeigen“, ist mir noch aufgefallen, daß es keine Möglichkeit mehr gibt, die Suche auf bestimmte Unterforen zu beschränken (und auch bei der Anzeige der Themen wäre es schön, wenn zumindestens dann das Unterforum dazu aufgelistet wird).
Edit: Bei der Suche fehlt bei den weiteren Buttons für die Seiten der view-Parameter (d.h. &view=ThreadView).
OK, jetzt habe ich wohl den Grund gefunden: die letzte Login-Session war noch mit "Firefox 85" registriert, die aktuelle mit "Firefox 86".
Trotzdem ist das eigenartig, denn die Version hatte ich schon letzte Woche aktualisiert (die Firefox Version 86 erschien am 23.2.).
Heute morgen mußte ich mich aber auch wieder neu einloggen, obwohl ich die letzten Tage aktiv war (und sogar letzte Woche am Donnerstag noch einen Beitrag geschrieben hatte).
Da wirst du wohl blockweise Daten auslesen müssen und dann den Suchtext dadrin suchen müssen (und dann jedemal Blockgröße - Länge_des_Suchtexts weiterspringen, damit der Suchtext nicht übersprungen wird).
PS: Um was für ein Dateiformat handelt es sich denn?
Das mache ich (bisher) jetzt auch, aber dort kann ich weder "alle Themen als gelesen" markieren (oder einzelne), noch sehe ich dort die Forenkategorie des Beitrags (mich interessieren einige Unterforen, z.B. "Web" gar nicht, d.h. Filterung ist auch nicht möglich). Und dauerhaft "orange Icons" (weil nicht gelesen) zu sehen, finde ich sehr irritierend.
Und wofür ist sonst die Hauptseite "Diskussionsforum"?
habe jetzt gerade deine Antwort gelesen.
Aber das heißt dann, daß ich auf der Hauptseite nicht mehr sofort erkenne, in welchen Unterforen neue Beiträge sind (solange ich nicht alle orange markierten Unterforen öffne)?
Ich hatte bisher ein Unterforum erst dann geöffnet, wenn es mehr als den "letzten Beitrag" gab (und somit nach Lesen dessen das Unterforum weiterhin als orange markiert war).
Und für mich nicht interessante Unterforen (bzw. Beiträge dadrin), habe ich danach "alle Themen als gelesen" aufgerufen und später nach einem Reload sehe ich dann evtl. wieder neue Beiträge.
Wie stellst du dir denn die gesamte Prozedur jetzt vor?
Noch zwei Kleinigkeiten auf der https://mycsharp.de/forum sind mir aufgefallen:
1. Oben stehen die beiden Links "Aktive Themen Themen ohne Antwort" direkt nebeneinander. Vllt. wäre ein Trennstrich (" | ") o.ä. etwas schöner - um die beiden als Links besser identifizieren zu können. Und "alle Themen als gelesen markieren" fehlt dort noch - aber das habt ihr wahrscheinlich schon auf euer Liste?
2. Unten stehen erst die "Derzeit aktive Benutzer: ..." und darunter dann in Fettschrift das Wort "Statistik" - das kommt mir etwas eigenartig vor...
PS: Schon wieder wurde der Link-Titel nicht in der Vorschau hinzugefügt (sondern wieder die ganze URL) - diesmal lasse ich es so, damit ihr es mal seht (ich hatte nur https://mycsharp.de/forum in den Editor eingefügt).
Mir gefällt die orange Farbe bei den Icons auch sehr gut.
Mir ist jedoch jetzt aufgefallen, daß auf der Hauptseite myCSharp.de - Diskussionsforum noch einige Unterforen mit orangem Icon dargestellt werden (nach Reload), obwohl ich direkt über die Aktive Themen die neuen Beiträge alle gelesen habe. Erst wenn ich direkt die Unterforenseite (z.B. GUI Windows-Forms) aufrufe und danach dann einen Reload mache, verschwindet das orange Icon auf der myCSharp.de - Diskussionsforum.
PS: Weiterhin werden mir alle älteren Themen (d.h. die vor Umstellung des Forums) in den Unterforen als orange angezeigt?!
PPS: Außerdem wurden bei den obigen Links zu den Unterseiten ("Aktive Themen" sowie "GUI Windows-Forms") von der Forensoftware (in der Vorschau) die Titel nicht gesetzt (sondern stattdessen die gesamte URL) - daher habe ich dies händisch nachgepflegt.
@ChristianAT. Du hast meinen eingeklammerten Satz noch nicht beachtet. Nimm dir ein Beispiel an dem Code in C# WPF & MVVM | update data of a property with a binding to the object (bei dir dann die Klasse Mitarbeiter statt Student).
Und statt dem Neuladen aller Daten, einfach die passenden Eigenschaften des Mitarbeiter-Objekts ändern (und dieses ruft dann PropertyChanged auf!).
Wie auch JimStark geschrieben hat, wenn Mitarbeiter bei dir bisher eine reine Modelklasse ist, dann erzeuge eine weitere ViewModel-spezifische Klasse und verwende diese dann (d.h. kopiere die Daten aus dem Model in das VM-Datenobjekt).
PS: Auch die Verwendung von [CallerMemberName] beim OnPropertyChanged-Aufruf vereinfacht den Code.
Öffne die Solution EDSDKWrapper.sln und lass sie kompilieren, dann füge die damit erzeugte EDSDKWrapper.Framework.dll zu deinem Kamera-Projekt hinzu.
Beachte, daß du dann auch die nativen COM-DLLs zum Ausführen benötigst:
Zitat
To use EDSDK in your .NET project, put these DLLs and folder “icc” into your Debug or Release folder and add a reference to the EDSDKWrapper.Framework.dll.
Dann würdest du im ViewModel direkt eine Eigenschaft vom Typ ObservableCollection<Mitarbeiter> halten und nach Änderung des einen Eintrags PropertyChanged(...) aufrufen (dazu muß jedoch auch die Klasse Mitarbeiter das Interface INotfiyPropertyChanged implementieren, evtl. brauchst du dazu dann eine ViewModel-spezifische Mitarbeiter-Klasse).
Alternativ zum Portieren des Codes nach C# (je nach Umfang):
Wenn schon Code in C da ist, dann könntest du daraus eine DLL (Library) erzeugen und diese von C# aus mittels P/Invoke (DllImport) einbinden (die Datenstrukturen müssten dann entsprechend "gemarshallt" werden).
du hast also das Projekt mit dem Basisformular als Verweis (reference) zu dem Hauptprojekt hinzugefügt und dann bei einer Form die Basisklasse entsprechend geändert? Und beim Ausführen kommt dann die Fehlermeldung?
Ist die DLL denn beim Bauen in das Ausgabeverzeichnis ("bin/debug" bzw. "bin/release") kopiert worden? Ansonsten gibt es beim Verweis dafür eine Einstellung ("Copy local").
Neben dem Gesagten von @Abt: beim Lesen greifst du bisher gar nicht auf die Daten des Streams zu (analog zum BinaryWriter benötigst du hier dann einen BinaryReader) - Array01 sowie die FileInfo-Instanz sind also überflüssig.
Außerdem solltest du keine Magic-Numbers verwenden, sondern mittels Array.GetLength(DIM) (mit DIM = 0, 1, ...) kannst du die Größen des Arrays auslesen.
Trotzdem ist da noch ein Logikfehler, da du innerhalb der Ereignismethode ja mittels timer.Interval = ... das Intervall änderst, dieses dann aber für alle 4 Ampeln gleichzeitig gilt.
Du mußt je Ampel einen eigenen Timer verwenden (bzw. einen Timer mit der höchsten Frequenz erzeugen und je Phase einen Zähler (als Faktor) verwenden).
In der Methode CmdGleich_Click mußt du nur MathOperation mit den passenden Parametern (aus deinen Listen) aufrufen.
Dazu mußt du aber noch in CmdPlus_Click (und den anderen zweistelligen Operatormethoden) den ausgewählten Operator in die operatorenListe eintragen (bzw. wie schon geschrieben, wäre hier Stack<string> besser, so daß du die Elemente mittels Push und Pop hinzufügen und wieder davon entfernen kannst).
PS: Schlecht zu lesen finde ich deinen Code nicht, jedoch hast du noch ziemlich viele Code-Wiederholungen drin.
Du könntest z.B. folgenden Zeilen in eine eigene Methode AddDigit (mit Parameter) auslagern:
txtOben.Text += "1";
txtUnten.Text += "1";
zahl = zahl += "1";
Und du könntest sogar alle 10 Ziffernbuttons mit derselben Ereignismethode verknüpfen und dann dessen Text (Ziffer) auslesen:
private void CmdDigit_Click(object sender, EventArgs e)
{
Control control = sender as Control;
if (control != null)
{
string digit = control.Text;
AddDigit(digit); // obige Methode mit Parameter aufrufen
}
}
Ja genau, den Link meine ich. Ist denn wirklich der (teilweise gekürzte und um Umlaute bereinigte) Titel im Link erforderlich? Was ist, wenn der Titel nachträglich geändert wird (passen dann die Links noch)? Die Thread-ID alleine ist doch eindeutig (der Aufruf des Themas funktioniert ja auch so).
Beim Erstellen einer Antwort ist mir gerade aufgefallen, daß Links auf andere myCSharp-Themen zwar mit URL-Tags versehen werden, der Titel jedoch nicht übernommen wird (dies fand ich beim alten Forum sehr bequem ;-), sondern gleich der URL gesetzt wird.
da hast du dir aber eine für Anfänger schwierige Aufgabe gestellt.
Du solltest ersteinmal deinen Taschenrechner so programmieren, daß direkt nach Eingabe des Operators die Rechnung ausgeführt wird (also ohne Punkt-vor-Strich).