Laden...

Forenbeiträge von Th69 Ingesamt 4.931 Beiträge

12.03.2023 - 10:01 Uhr

Anstatt den String zu parsen, sollte man auch direkt entweder Convert.ChangeType() oder speziell für enum-Typen Enum.ToObject aufrufen können.

08.03.2023 - 11:06 Uhr

Läuft die calibrationRoutine direkt im UI-Thread? Dann s. [FAQ] Warum blockiert mein GUI?

Du solltest das komplette Lesen und Schreiben vom COM-Port in eine eigene Klasse auslagern und mit Tasks arbeiten (anstatt direkten Threads).

Evtl. hilft dir auch Template SerialPort ?

08.03.2023 - 08:52 Uhr

Hallo und willkommen,

du brauchst nur die DLL als Referenz zu deinem Projekt hinzufügen und solltest dann auf die enthaltenen Klassen (in den zugehörigen Namensbereichen) zugreifen können.

04.03.2023 - 14:44 Uhr

Sorry, ich kenne mich mit den Online-Diensten nicht so aus.
Die Antworten von @Abt klingen aber sehr hilfreich.

04.03.2023 - 09:47 Uhr

👍

Bei den einfachen Anführungsstrichen dachte ich erst, daß sonst die cid direkt als Pfad interpretiert wird (aber ist wohl nicht so). Es würden auch doppelte Anführungsstriche funktionieren (aber von C# aus ist das komplizierter wegen dem Escaping).

PS: Für andere Mail-Pakete (u.a. MailKit) habe ich noch folgende Seite gefunden: How to send emails from C#/.NET - The definitive tutorial

03.03.2023 - 17:27 Uhr

In Zeile 57 (deines Originalcodes)


var alternateView = new AlternateView(new MemoryStream(Encoding.UTF8.GetBytes(Mail.Body)), "text/html");

erzeugst du den Stream aus dem original Mail.Body und erst später ersetzt du in diesem die Pfade durch die GUIDs...

03.03.2023 - 16:58 Uhr

Das kannst du mit Rectangle.Contains(Rectangle) überprüfen (s.a. das Beispiel dort, nur statt rectangle1 dann DesktopBounds der Form benutzen).

Evtl. mußt du noch die Client-Koordinaten in Screen-Koordinaten umrechnen, falls du explizit ein Unterelement der Form überprüfen willst: PointToScreen.

03.03.2023 - 16:29 Uhr

Da es ja mit einem Dateinamen funktioniert, was passiert, wenn du <GUID>.png als ContentId verwendest?

03.03.2023 - 09:51 Uhr

Wie sieht denn der ersetzte HTML-Body (für <img .../>) aus?
Dort dürfen dann keine einfachen Anführungsstriche mehr drin sein, sondern nur


<img src=cid:ID/>

(s. z.B. Sending Image Embedded HTML Mail with C# - mußt in der Ansicht bei //Creating AlternateView for HTML Mail ein bißchen scrollen)

Aber du solltest wirklich auf MailKit umstellen.

03.03.2023 - 09:26 Uhr

Das ist direkt nicht möglich, da die Signatur der Ereignismethoden nicht verändert werden kann/darf.
Du kannst aber einen Lambda-Ausdruck benutzen:


float f = 42.0;
timer.Tick += (s, e) => MyTick(f);
timer.Start();

Oder alternativ eine (private) Membervariable benutzen.

02.03.2023 - 16:43 Uhr

Sollte dann nicht einfach folgendes funktionieren?


DatenEintrag suchEintrag = MyDatenView.Skip(MyDatenView.CurrentPosition).Cast<DatenEintrag>().FirstOrDefault(s => s.StringWert.Contains(MySuchWert));

(also die Einträge, bis zur CurrentPosition zu überspringen)

28.02.2023 - 16:37 Uhr

Hallo,

also die Internet-Suche nach "Office VSTO global settings" liefert einige Ergebnisse, z.B. Speichern von Settings in Office Addin VSTO.

28.02.2023 - 09:15 Uhr

Dann ist das wohl kein Standard-Windows Programm, sondern zeichnet selber den X-Button (wie z.B. in Eigene Window Rahmen zeichnen beschrieben).
So wie Palladin007 schon geschrieben hat, hilft dann wohl nur die Simulation des Mausklicks.

27.02.2023 - 11:13 Uhr

Dafür habe ich dann auch keine Erklärung - dann bleibt wohl wirklich nur die Timer-gesteuerte Umsetzung.

26.02.2023 - 10:29 Uhr

Hast du auch explizit GetFormats(false) aufgerufen (denn GetFormats() liefert auch alle konvertierbaren Formate), s. GetFormats(Boolean)?

26.02.2023 - 10:18 Uhr

Hallo und willkommen,

schau auch mal in [FAQ] Wie finde ich den Einstieg in C#?

25.02.2023 - 16:28 Uhr

Es gibt diese Methode auch als Überladung mit einem zusätzlichen IEqualityComparer-Parameter: SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

25.02.2023 - 14:44 Uhr

Rufe Enumerable.SequenceEqual für die sortierten Listen auf, s.a. "2. Compare two List objects for equality, ignoring order" in Compare two lists for equality, ignoring order in C#.

25.02.2023 - 11:27 Uhr

Ich denke, der Workaround ist schon sinnvoll. Es wird wohl so sein, daß für jedes Format, das zum Clipboard hinzugefügt wird, ein WM_CLIPBOARDUPDATE ausgelöst wird (je nach Anwendung können ja z.B. TEXT, HTML und RTF als Formate erzeugt werden). Daher könntest du testweise mal die Formate während eines WM_CLIPBOARDUPDATE loggen.

Geht es dir bei deinem Programm denn nur um ein spezielles Format (also z.B TEXT) oder alle möglichen Formate (auch BITMAP etc.)?

PS: Als Programm zum Ansehen der verschiedenen Formate kann ich Free Clipboard Viewer empfehlen.

24.02.2023 - 16:08 Uhr

Du könntest den Hashcode der Formate vergleichen:


int hash = data.GetData(format).GetHashCode();

Also eine Liste für jedes Format (data.GetFormats()) erzeugen und dessen Hashcodes speichern.
Dann bei WM_CLIPBOARDUPDATE die Formate und deren Hashcodes vergleichen.

PS: Statt Fettdruck entweder "Code (Inline)" oder "vorformatierter Text" (die beiden rechten Buttons) hier im Forum benutzen.

23.02.2023 - 09:59 Uhr

Kannst du (den Source-Code von) App1 nicht in App2 integrieren, so daß du nur noch eine App hast?

21.02.2023 - 21:02 Uhr

Hallo und willkommen,

ich denke, das ist ein Problem bzgl. plattformunabhängigen Code (MainPage) und plattformabhängigen Code (MainActivity).
Zum einen liegt MainActivity ja in einem eigenen Namensbereich AppCommunication.Droid als auch architekturtechnisch sollte der Zugriff nur in die andere Richtung stattfinden.
Du solltest also wie in [FAQ] Kommunikation von 2 Forms vorgehen und ein Ereignis in der MainPage erzeugen und von der MainActivity-Klasse abonnieren und empfangen (welche dann die sendBroadcastMessage-Methode aufruft).

21.02.2023 - 18:05 Uhr

Du hast die Spalten doch schon in der Methode EinAdd_Load erzeugt und fügst dann noch mal in btnEinHin_Click neue hinzu (wenn es sich um statische Spalten handelt ist es m.E. am einfachsten, diese schon im VS-Designer anzulegen).

Bezgl.

Gerade muss ich noch rausfinden, warum die jeweiligen Einträge nun nicht angezeigt werden

Bist du schon mit dem Debugger vertraut: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Desweiteren solltest du das Einlesen der JSON-Daten in eine eigene Klasse auslagern (Stichwort: Trennung von UI, Logik und DAL), s. [Artikel] Drei-Schichten-Architektur.

Leider unterstützt die WinForms-ListView kein DataBinding, sonst wäre das die eleganteste Art der Datenanzeige (als Alternative käme dazu ein DataGridView in Betracht, s.a. Vergleich DatagridView - ListView).

21.02.2023 - 16:26 Uhr

Hallo und willkommen,

setze die ListView-Eigenschaft View auf Details.

PS: Dein Thema ist im falschen Unterforum, "GUI: Windows-Forms" wäre besser - vllt. verschiebt es aber ein Moderator?

19.02.2023 - 10:07 Uhr

Dann verhält sich das andere Programm aber sehr seltsam, denn CloseMainWindow() sendet einfach die WM_CLOSE-Nachricht an das Fenster (das auch bei Klick auf den Button "X" gesendet wird).

Erscheint denn das Cleanup-Fenster auch, wenn du manuell "ALT+F4" bei dem anderen Programm aufrufst?

17.02.2023 - 11:44 Uhr

Jetzt verwendest du aber den SQL-Parameter nicht mehr, sondern dein Code ist nun anfällig für SQL-Injection!

Und warum verwendest du jetzt zwei verschiedene MySqlCommand-Objekte?
Außerdem benötigst du durch konsequente Verwendung der using-Anweisungen auch keinen expliziten Close()-Aufruf mehr.

17.02.2023 - 07:41 Uhr

Kannst du auch mal einen Screenshot von der Konfliktmeldung machen?

Was ich irritierend finde: Sollte die Meldung nicht eigentlich "Aktualisieren Sie Ihren Branch, indem Sie vor dem Pushvorgang einen Pullvorgang ausführen." lauten (so wie auch die Buttons beschriftet sind)?
Kannst du es mal auf englisch anzeigen lassen?

16.02.2023 - 15:47 Uhr

Hallo,

dann mußt du dafür das ComboBox.SelectedIndexChanged-Ereignis verwenden.

16.02.2023 - 09:24 Uhr

Der meistbenutzte Algorithmus dafür ist Myers O(ND) Difference Algorithm, s.a. Visualizing Diffs - The Myers difference algorithm.
Eine C#-Implementierung gibt es unter Diff.

15.02.2023 - 17:09 Uhr

Hallo,

deine "on ..."-Bedingung ist falsch.
Verwende eine der 3 Möglichkeiten aus der Top-Antwort in Avoid duplicates in INSERT INTO SELECT query in SQL Server.

15.02.2023 - 10:09 Uhr

Brauchst du dies denn auch? Wenn doch (falls sonst das Drag&Drop auf dem UserControl nicht ausgelöst wird), hast du denn auch die passenden Drag&Drop-Events für diese Subcontrols zugewiesen?

14.02.2023 - 12:10 Uhr

Hallo,

hast du denn AllowDrop nur für die UserControls gesetzt oder auch für die darauf enthaltenen Controls?

14.02.2023 - 09:04 Uhr

Es fehlt ja auch noch der Aufruf zum Anzeigen der Form:


LoginForm login = new LoginForm();
if (login.ShowModal() == DialogResult.OK)
{
   LoginCredentials credentials = login.GetLoginCredentials();
   // ...
}

11.02.2023 - 15:02 Uhr

Sorry, aber du mußt erst vernünftig C# lernen, bevor du solche UI-Projekte angehst, s.a. [FAQ] Wie finde ich den Einstieg in C#?

Der Code in deiner "Customer.cs" kann so nicht kompilieren, da es in C# keine globalen Objekte gibt: Customer[] customers muß innerhalb einer Klasse stehen!

09.02.2023 - 17:38 Uhr

So hast du ein bißchen zuviel in die eigene EventArgs-Klasse gepackt.

Die EventHandler-Variable (aber ohne static !) sowie die beiden Methoden gehören in die CSV-Klasse (und die Form-Klasse abonniert dann dieses Event, da sie ja die CSV-Klasse kennt).
Und dann entspricht dies genau dem Beispiel in meinem Artikel.

Der Member event ErrorOccured(...) ist hier außerdem überflüssig (und dürfte so auch gar nicht kompilieren).

09.02.2023 - 17:05 Uhr

Dann zeige mal deinen Code in deiner CSV-Klasse, wie du das Ereignis dort definierst und aufrufst.

PS: Fertigen C&P-Code für Events wirst du nicht finden, da dieser immer an die eigenen Bedürfnisse angepaßt werden muß (insb. die EventArgs).
Und wie du schon erkannt hast, ist eine Form auch nur eine Klasse, daher kann hierfür der Code aus meinem Artikel genauso übernommen werden (mit entsprechender Namensänderung und Anpassung der EventArgs).

09.02.2023 - 14:40 Uhr

Hallo und willkommen,

schau in [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse).
Oder auch detailliert in meinem Artikel Kommunikation von 2 Forms (in "Lösung: Verwendung von Eigenschaften (Properties) und Ereignissen (Events) / 2. Ereignisse" - die SubForm entspricht dabei dann deiner Klasse).

07.02.2023 - 12:47 Uhr

Freut mich für dich.

PS: Ich hatte deinen vorletzten Beitrag auch schon gelesen.

06.02.2023 - 17:10 Uhr

Du brauchst dann nur das UserControl (auf deutsch: Benutzersteuerelement) verstecken bzw. wieder anzeigen, es werden dann automatisch alle dadrin enthaltenen Elemente versteckt bzw. wieder angezeigt.
Als englischen Artikel habe ich Create User Control in C# Winforms Applications dazu gefunden.

Schau dir auch mal den Beispielcode in [FAQ] Assistenten/Wizards: Mit Windows Forms eine Art Frameset einer Website nachbauen an (statt dem Panel benutzt du dann ein entsprechendes UserControl).

Hilfreich kann auch folgender Artikel für dich sein: [FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls

06.02.2023 - 15:43 Uhr

Hallo,

meinst du das Arbeiten im visuellen Designer oder zur Laufzeit?
Ich verstehe jedoch nicht, was du mit dem MenuStrip meinst? Über ein Menü kannst du die verschiedenen Bereiche zur Auswahl stellen, so daß der Anwender zwischen diesen wechseln kann - das Anzeigen und Verstecken mußt du jedoch selber ausprogrammieren.

Ich würde vorschlagen, du erzeugst je Bereich ein eigenes UserControl (diese kannst du auch im Designer erstellen und bearbeiten). Und dann hältst du die einzelnen UserControls in einer Liste und merkst dir jeweils die gerade Aktive in einer Eigenschaft.

06.02.2023 - 10:33 Uhr

Das sind die Debug-Infos, welche beim Kompilieren mitgegeben werden.
Wenn du diese nicht benötigst, dann erstelle deine Applikation als Release und liefere keine ".pdb"-Dateien aus.

06.02.2023 - 10:27 Uhr

Hallo,

schau auch mal in Interprocess Communications (der deutsch übersetzte Artikel ist leider nicht zu verstehen).

06.02.2023 - 10:23 Uhr

OK, schön, daß ersteres schon auf dem Wege ist.

Wenn ich Dateien aus dem Internet herunterlade, möchte ich schon direkt den passenden (angezeigten) Dateinamen haben, anstatt jedesmal diesen wieder ändern zu müssen (denn wenn alle Dateien nachher nur "attachments-..." heißen, bringt mir das nicht viel). Vllt. hilft hier Change the name of your file with – HTML5 “Download” attribute?

06.02.2023 - 10:08 Uhr

Sollte der Forenbereich "FAQ" (und evtl. auch "Artikel") für normale Benutzer nicht besser schreibgeschützt sein (da gerade dort ein Thema fälschlicherweise eröffnet wurde)?

Außerdem ist mir noch eine andere Sache aufgefallen:
Beim Herunterladen von Anhängen wird nicht der angezeigte Dateiname genommen, sondern "attachment-...", so daß man selber den Dateinamen beim Abspeichern wieder ändern muß.

04.02.2023 - 09:20 Uhr

Bei einem GUI-Programm kann man Process.CloseMainWindow (sowie anschließend Process.Close) aufrufen. Das startende Programm muß sich also dessen Process-Instanz merken.

03.02.2023 - 13:13 Uhr

Ja, du benötigst dazu einen HTTP Server.
Gefunden habe ich noch folgende Links:

Weitere Stichworte zum Nachlesen: HTTP/Web/REST API, z.B. Einfache REST-API mittels PHP

03.02.2023 - 11:51 Uhr

Soll deine App denn nur bei dir im lokalen Netzwerk funktionieren oder willst du Zugriff auch über das Mobilfunknetz auf die Datenbank haben?

Es gab neulich erst folgendes Thema: XAMARIN MySQL Datenbankverbindung wirft Exception - beachte besonders die Hinweise von Abt.

03.02.2023 - 11:41 Uhr

Möchtest du gleichzeitig die PDF-Datei lesen und beschreiben? Das wird wohl so nicht direkt funktionieren - gib mal als 2. Parameter für PdfStamper einen eigenen Output-FileStream an, s.a. C# (CSharp) iTextSharp.text.pdf PdfStamper Beispiele.
Dann sollte auch das File.Copy überflüssig sein.

03.02.2023 - 10:16 Uhr

In welcher Zeile genau erhältst du denn die Exception?
Durch die using-Anweisung in Zeile 20 sollte pdfStamper.Close() überflüssig sein (aber es sollte trotzdem keine Exception geworfen werden).
Analog solltest du beim Zugriff auf PdfReader pdfReader besser ebenfalls eine using-Anweisung benutzen.

02.02.2023 - 14:21 Uhr

Einfach das NuGet-Package ShellFileDialogs zu deinem Projekt hinzufügen und dann dessen ShellFileDialogs.FolderBrowserDialog benutzen.

Falls du noch nie vorher mit NuGet gearbeitet hast, dann lies Schnellstart: Installieren und Verwenden eines Pakets in Visual Studio (nur Windows) (s. "Hinzufügen des NuGet-Pakets „Newtonsoft.Json“", nur daß du dort dann das andere Paket suchst und auswählst).