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 Alf Ator
Thema: Refactoring: Regelmäßig sauber machen oder einmaliger Frühjahrsputz?
Am im Forum: Artikel

Hallo vkry

Die Gelegenheit möchte in nutzen und einen besonders wichtigen Punkt hervorheben und ergänzen:

Zitat von vkry
Kontinuierlich
Einige Verbesserungen kann man manuell bereits während der Codierung umsetzen. Es gilt das Prinzip: Wenn man Änderungen an einer Stelle des Quellcodes vornimmt, dann sollte man diesen sauberer verlassen, als man diesen vorgefunden hat.

Bei der täglichen Arbeit steht der Entwickler für gewöhnlich unter einem gewissen Zeitdruck. Für explizite Refactorings bekommt er nicht immer Zeit. Deswegen ist es wichtig, kontinuierlich sauberen Code zu entwickeln. Dafür muss klar definiert sein, wie der Code strukturiert sein soll und die Architektur aussieht.

Im Entwickler-Team sollten also unter anderem folgende Punkte geklärt sein:
  • UnitTests:
    - wo kommen die hin
    - in welchen Fällen kann darauf verzichtet werden
    - wird TDD gemacht.
  • Schichten:
    - welche gibt es: Domain, DB, UI, ..
    - welche Schicht, hat wo Zugriff
  • technische oder fachliche Aufteilung von Code
  • wann und wie wird die Architektur angepasst

Die Liste ist natürlich nicht vollständig. Meiner Erfahrung nach, ist das oft nicht ausreichend geklärt. Meiner Meinung nach ist es aber essentiell, für sauberen Code.

Gruss
Alf

Das Prinzip wird übrigens auch Pfadfinder-Prinzip genannt.

Arbeitest du für Visual Assist?

Thema: PHP -> C# CipherMode.CBC Übertragung
Am im Forum: Web-Technologien

Hallo stony007_de

Bei dem Code, den du dir zusammenkopiert hast, steht sowas:


//encryptor.Padding = PaddingMode.Zeros;

Kannst ja mal damit rumspielen.

Gruss
Alf

Thema: Strukturierte Programmierung erlernen
Am im Forum: Rund um die Programmierung

Hallo Gruwe

Das wichtigste ist ja schon gesagt worden. Ich wollte noch ergänzen, dass es auch stark darauf ankommt, was für ein Produkt man entwickelt.
Eine Enterprise-Solution mit 10Millionen Zeilen Code wird anders aufgebaut, als ein Kommandozeilen-Tool.

Diverse Patterns oder [Artikel] Drei-Schichten-Architektur machen bei einem kleinen Beispiel-Projekt nicht direkt Sinn. Sollte die Anwendung aber wachsen, dann wird es ohne schnell unübersichtlich.

Gruss
Alf

Thema: Zyan für .NET Core / Standard
Am im Forum: Netzwerktechnologien

Damit ist meine Frage wohl ausreichend beantwortet. Vielen Dank!

Thema: Getter und Setter Gruppieren
Am im Forum: Grundlagen von C#

Na so in etwa:


internal class Kunde
{
    public string Name { get; set; }
}

internal class Produkt
{
    public string Nummer { get; set; }
}

internal class Order
{
    public Kunde Kunde { get; set; }
    public Produkt Produkt { get; set; }
}


// und für die ausgabe
(readonly) textbox_ordernr = myorder.ordernr //  Ihre Bestellung NR. 123456 ( wird von system erstellt)
Für das readonly kannst du den Setter privat machen.

// ausgabe des Gesammten Kunden
myorder.Kunde() // Rückgabe "Hans Schmidt"
Hier kannst du eine entsprechende Methode Kunde() implementieren, oder ToString() überschreiben.

Thema: Getter und Setter Gruppieren
Am im Forum: Grundlagen von C#

Hallo Commander82

Du kannst jeweils eine Klasse Kunde und Product erstellen, mit den jeweiligen Properties.

In Order bietest du dann eine Property mit Kunde/Product an.

Gruß
Alf

Thema: Zyan für .NET Core / Standard
Am im Forum: Netzwerktechnologien

Hallo Zusammen

Ich habe das Zyan Communication Framework gerne benutzt. Gibt es etwas ähnliches für .NET Core? Was benutzt ihr so für die Kommunikation im LAN, oder zwischen Prozessen??

Danke für eure Kommentare und winterliche Grüße
Alf

Thema: DGV Zeilen bleiben leer
Am im Forum: GUI: Windows-Forms

Hallo kstanger


        private void DataGridViewTiming_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int loop = 0; loop < Timings.Count; loop++)
            {
                ...
                DataGridViewTiming.DataSource = BindingSourceTiming;
            }
        }

Das hier kommt mir ein bisschen fishy vor. Wenn das DataBinding complete ist, weist du eine neue DataSource zu? Und das auch noch mehrfach?
Ich könnte mir vorstellen, dass er hier viel zu oft reinrennt. Kannst du das mal mit dem Debugger testen?

Gruß
Alf

Thema: Krypton Toolkit: Palette auf KryptonStatusStrip anwenden?
Am im Forum: GUI: Windows-Forms

Hallo BlueSubmarine

Hier kannst du dir das anschauen:
Standard-Toolkit/KryptonStatusStrip.cs at master · Krypton-Suite/Standard-Toolkit

Andere Controls leiten von irgendwelchen Basis-Klassen ab, z.B. VisualForm, oder VisualControlBase. Das fehlt beim KryptonStatusStrip, deswegen vermute ich, dass es die Palette einfach nicht unterstützt.

Wenn du es dringend brauchst, kannst du dich ja auch mal direkt an die Macher wenden.

Gruß
Alf

Thema: Wie muß man denken und handeln lernen?
Am im Forum: Smalltalk

Hallo AlphaNumerisch0815

Dein Text ist nicht ganz einfach zu verstehen und es sind viele Fragen drin, dich ich nicht einzeln beanworten will.

Grundsätzlich kann man sagen, dass man als Entwickler Spaß daran hat, Probleme zu Lösen. Die Informationen dazu holt er sich auf den verfügbaren Wegen. Als es noch kein Internet gab, waren das z. B. Bücher (aus Papier :P). Dabei lernt der Entwickler bestimmte Patterns und Best Practices kennen und anzuwenden. Mit steigender Erfahrung bekommt der Entwickler ein Gefühl für sauberen Code und guten Programmaufbau.

Für den Angfang schau hier rein: [FAQ] Wie finde ich den Einstieg in C#?
Dann suchst du dir ein interessantes Problem und ran an den Speck.

Gruß
Alf

Thema: Arrays vergleichen und Unterschiedliche Werte ausgeben
Am im Forum: Grundlagen von C#

Hallo Kjell

Erstmal wäre es sinnvoll dein Problem auf das wesentliche zu reduzieren:
(Ich habe bei dem Beispiel mal List<T> genommen, statt string-Arrays)


        static void Main(string[] args)
        {
            var list1 = new List<string>
            {
                "Software 1",
                "Software 2",
                "Software 3"
            };

            var list2 = new List<string>
            {
                "Software 1",
                "Software 3"
            };

            var differences = GetDifferences(list1, list2);

            Console.ReadKey();
        }
            
        private IEnumerable<string> GetDifferences(List<string> list1, List<string> list2)
        {
            // hier Listen vergleichen
            return new List<string>();
        }

Das ganze könntest du auch ganz hervorragend mit UnitTests machen:
C# unit test tutorial - Visual Studio (Windows)

Zum Listenvergleich kannst du Linq verwenden:
Language-Integrated Query (LINQ) (C#)

Es ist aber auch eine gute Übung, so einen Listenvergleich händisch umzusetzten. Wenn deine UnitTests funktionieren kannst du das gut machen und deine eigene Implementierung damit testen.

Zum Arbeiten mit csv-Dateien empfehle ich eine vorhandene Lösung zu verwenden, zum Beispiel:
https://www.nuget.org/packages/CsvHelper/

Beim programmieren gilt: aller Anfang ist schwer. Man muss viel Lesen, ausprobieren und verstehen. Aber immer wenn man dann einen Schritt weiterkommt und etwas verstanden und gelernt hat, macht es riesenspaß.

Viele Grüße
Alf

Thema: Vorgehensweise bei ComboBoxen im DataGridView
Am im Forum: GUI: Windows-Forms

Zitat von kstanger
Ich wollte das mit einer Linq-Abfrage lösen, aber folgender Code funktioniert nicht:

Was funktioniert denn nicht?

Thema: Vorgehensweise bei ComboBoxen im DataGridView
Am im Forum: GUI: Windows-Forms

Eine passende Lösung habe ich ja schon beschrieben, hat das funktioniert?

Thema: 2 Properties innerhalb eines Controls multiplizieren
Am im Forum: Grundlagen von C#

Hallo Webwiesel1212

Du kannst eventuell vom NumericVarOut-Control den Setter von Value überschreiben, oder es das Control bietet sowas wie ValueChangedEvent an.
Kann ich von hier aus jetzt nicht sehen.

Ansonsten kannst du zusätzlich im Setter von FactoryFloat die Berechnung auslösen oder machen.


public Double FactorFloat
{
    get { return (Double)GetValue(FactorPropertyFloat); }
    set
    {
        SetValue(FactorPropertyFloat, value); }
        this.Value = this.Value * FactorFloat;
    }

Gruß
Alf

Thema: Vorgehensweise bei ComboBoxen im DataGridView
Am im Forum: GUI: Windows-Forms

Hallo kstanger

Deine Aufgabenstellung ist nicht richtig gut erklärt, dass könnte noch klarer werden. Eventuell auch mit etwas Code. Les das mal als jemand, der deinen Code nicht kennt.

Zum Problem:
Die Liste mit Objekten in deinem ViewModel, an die die ComboBoxen gebunden sind, könnten jeweils Objekte1 oder Objekte2 zurückgeben, in Abhängigkeit von Property in dem List1 oder Liste2 eingestellt ist.

Gruß
Alf

Thema: WPF Listbox SelectedItem Wert aus Teplate
Am im Forum: GUI: WPF und XAML

Hallo MMCSharp

So ganz verstanden habe ich das nicht, wie es bei dir aussieht. Ohne Code kann man da nur raten.

Prinzipiell würde ich sagen, dass du dafür einen IValueConverter verwendest: Wertumwandlung mit IValueConverter - The complete WPF tutorial

Gruß
Alf

Thema: [Resolved] Binding zu DependencyProperty tut nicht. Lösung: DataContext von UserControl nicht überschreiben..
Am im Forum: GUI: WPF und XAML

Hallo liebe Forenten

Heute habe ich ein Problem, bei dem ich nicht weiterkomme. Folgende Situation:

Ich habe ein UserControl mit einem DependencyProperty im CodeBehind:


<UserControl
    DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <TextBox Text="{Binding WatermarkText}" />

</UserControl>


        public static readonly DependencyProperty WatermarkTextProperty = DependencyProperty.Register(nameof(WatermarkText), typeof(string), typeof(ValueSpinner), new PropertyMetadata("dp_default"));
        public string WatermarkText
        {
            get => (string)GetValue(WatermarkTextProperty);
            set => SetValue(WatermarkTextProperty, value);
        }

Im MainWindow ist im CodeBehind ein Property:


        private string _testText = "MainWindow_CodeBehind";
        public string TestText
        {
            get => _testText;
            set => SetField(ref _testText, value);
        }

Das binde ich nun auf das DependencyProperty vom UserControl:

<Window
    DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <StackPanel>
        <TextBox Margin="10" Text="{Binding TestText}" />
        <local:ValueSpinner Margin="10" WatermarkText="MainWindow_Xaml" />
        <local:ValueSpinner Margin="10" WatermarkText="{Binding TestText}" />
        <local:ValueSpinner Margin="10" WatermarkText="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=TestText}" />
    </StackPanel>

</Window>

Ergebnis sieht so aus:




Man kann sehen, dass bei der Zeile

<local:ValueSpinner Margin="10" WatermarkText="{Binding TestText}" />
das Binding nicht greift und ich verstehe nicht warum.

Edit: Setter und Callback vom DependencyProperty werden hier übrigens nicht aufgerufen.

Kann mir jemand erklären, warum das nicht tut, wie ich das will?

Viele Grüße
Alf

PS:
Das hier tut interessanterweise:

        <local:ValueSpinner Margin="10" WatermarkText="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=TestText}" />

Auf diese Idee kam ich dank Binding an einen DataContext von einem DataGrid das an eine ItemsSource gebunden ist

Edit2:
Ich verstehe jetzt, warum das Property nicht gebunden wird. Ich setze den DataContext vom ValueSpinner. Der DataContext von der Instanz von ValueSpinner wird deswegen anscheinend nicht geerbt.
Jetzt muss ich nur noch überlegen, wie ich dann mein ValueSpinner-View auf mein CodeBehind (oder ViewModel) binden kann.

Edit3:
Das ist tatsächlich die Lösung. DataContext vom UserControl nicht setzen und dafür beim bindenden Control direkt.

<UserControl>
    <TextBox Text="{Binding WatermarkText}" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:ValueSpinner}}}" />
</UserControl>

Ich danke euch für eure Aufmerksamkeit. Für ergänzenden Anmerkungen bin ich dankbar.

Viele Grüße
Alf

Thema: System.Office.Interopt.Excel outside the bounds of the array
Am im Forum: Office-Technologien

Hallo Maendler53


 internal static void CellsMerge(string address)
        {
            string[] splited = address.Split(Convert.ToChar(":"));
            int firstCol;
            int firstRow = Cvr.GetIndexes(splited[0], out firstCol);
            int lastCol;
            int lastRow = Cvr.GetIndexes(splited[1], out lastCol);

            var von = Ws.CurrentSheet.Cells[firstRow, firstCol];
            var bis = Ws.CurrentSheet.Cells[lastRow, lastCol];

            Exc.Range rng = Ws.CurrentSheet.Range[von, bis] as Exc.Range; // Beim erstellen des Rangeobjekt, entsteht der Fehler.  Die Felder firstCol, firstRow, lastCol und lastRow sind  entsprechend Excel 1 basiert und richtig initialisiert.
            rng.Merge(Type.Missing);
        }

Mach das doch mal so, geh mit dem Debugger rein und schau dir an, ob die Exception bei 'von', oder bei 'bis' geworfen wird.

Gruß
Alf

Thema: In Applikation Teilbereiche als anderer user ausführen
Am im Forum: Rund um die Programmierung

Hallo prokrammer

Zitat von prokrammer
Dann noch ein Hinweis: Ich hatte vesucht bei mir am Rechner den Bereich als Netzlaufwerk zu verbinden, mit den Userdaten des lokalen Users, das hat auch nicht funktioniert.
Fällt euch dazu noch etwas anderes ein, an was es scheitern könnte ??

Ich hatte damals, einen Service im Netz laufen lassen, an den die Maschinen ihre Daten senden konnten.

Gruß
Alf

Thema: Gültigkeit von array
Am im Forum: Grundlagen von C#

Hallo kstanger

Das liegt daran, dass du Presettings im Scope der if-Abfrage definierst.

Der Scope geht von der { bis zur } der if-Abfrage. Alles was innerhalb definiert wird, ist ausserhalb nicht verfügbar.

Mach das mal so:


Presetting[] presettings;
if (..)
{
  ..
  presettings = JsonSerializer.Deserialize<Presetting[]>(jsonString);
  ..

Gruß Alf

PS: Les mal das: C# Coding Conventions

Thema: Textbox nur für Zahlen
Am im Forum: Grundlagen von C#

Hallo kstanger

Zitat von kstanger
numericUpDown war mir wohl bekannt, aber ich wollte die Auf- und Ab-Pfeile nicht.
Andererseits ist es besser, eine einfache (= NumericUpDown) Lösung zu nehmen.

Da sind ein paar Lösungen dabei:

Google Suche nach "c# numericupdown remove arrows"

Gruß
Alf

Thema: XML-Dokumentstrukturen müssen innerhalb derselben Entity beginnen und enden?
Am im Forum: Grundlagen von C#

Hallo kingflo

Als erstes habe ich vermutet, dass das XML nicht valide ist. Das habe ich mit folgendem Tool überprüft:

https://community.notepad-plus-plus.org/topic/16983/xml-tools

Das XML ist aber valide, dass heißt der Fehler wird eher im Code zu finden sein. Der ist aber in deinem Beitrag nicht zu sehen. Du kannst ja mal posten, was du gemacht hast und was du versucht hast, um diesen Fehler zu beheben.

Les dir bitte auch diesen Beitrag durch: [Hinweis] Wie poste ich richtig?

Gruß
Alf

Thema: Net Mau DataViewModel Picker zeigt aktuelle Auswahl nicht an
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Zitat von Toube
Problem ist gelöst




Das mit dem UpdateSourceTrigger ist ja interessant. Hatte ja seine Berechtigung.
Mode=TwoWay ist imho der Default-Wert.

Thema: Net Mau DataViewModel Picker zeigt aktuelle Auswahl nicht an
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo Toube

Das sieht eigentlich ganz gut aus. Hast du eine Lösung gefunden?

Wenn nicht, vielleicht probierst du mal bei dem Picker sowas:


SelectedItem="{Binding Parent, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

Gruß
Alf

Thema: Printer suchen wenn nicht gefunden dann
Am im Forum: Rund um die Programmierung

Zitat von Bender1988
If(printDocument1.Print)
... [/csharp]

allerdings bringt es einen Fehler gleich in der ersten Zeile
Can not convert method group print in bool

Du hast die Klammern vergessen.

Thema: Text aus dynamisch erzeugter Textbox auslesen
Am im Forum: Grundlagen von C#

Hallo Djavan

Schau dir das Ganze doch mal im Debugger an:


var index = j * 5 + k;
var text = auswahlFragen[index].Text
StringBuilder text_audio = new StringBuilder();
// Hier soll der Text des dynamisch erzeugten Feldes eingelesen werden.
text_audio.Append(';');
text_audio.Append(text);

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

Gruß
Alf

Thema: Brauche Hilfe bei verschiedenen Basis-Hausaufgaben
Am im Forum: Grundlagen von C#

Zitat von MM72
Da ich selber nicht die kompletten Dateien zur Verfügung gestellt bekommen hatte, die im Lehrbuch angegeben waren und die in der Aufgabenstellung aufgeführt sind, konnte ich noch nicht alle Lektion praktisch auch nachvollziehen.

Also sind die Codeschnipsel unter a) - e) nicht Teil der Aufgabe, sondern du hast die Lösung von jemand anderem bekommen? Code irgendwo her kopieren und zusammenstöpseln ist kein Programmieren.

Nach deinen bisherigen Antworten und Bemühungen die Aufgabe zu lösen, bin ich ehrlich gesagt etwas enttäuscht. Es sind nicht irgendwelche fehlenden Dateien das Problem. Mit dem vorhandenen Material kann man die Aufgabe lösen. Mit dem kopierten Code hast du sogar noch zusätzliche Hilfe. Außerdem gehst du wenig auf die Lösungsansätze der Foristen ein.

Wie heißt es so schön: "Ich kann dir die Lösung erklären, aber ich kann sie nicht für dich verstehen."

Thema: Brauche Hilfe bei verschiedenen Basis-Hausaufgaben
Am im Forum: Grundlagen von C#

Stimmt, so wie du das weiter oben ja schon geschrieben hast. Danke für die Korrektur.

Thema: Brauche Hilfe bei verschiedenen Basis-Hausaufgaben
Am im Forum: Grundlagen von C#

Wie du schon richtig erkannt hast, muss der typ schon in Flugzeug, oder Luftfahrzeug deklariert sein. Also mach das mal und dann auf zum nächsten Schritt.
Ich habe bei mir den Typ in Luftfahrzeug deklariert.

Schau dir auch mal die Warnings an, hab ein Bild angehängt. Die Methode Schreiber in Düsenflugzeug kann beispielsweise weg.

Thema: Brauche Hilfe bei verschiedenen Basis-Hausaufgaben
Am im Forum: Grundlagen von C#

Okay. Das heißt du sollst die bestehenden Code-Fragmente nehmen und einbauen.

Das lässt sich ja alles lösen. Die Korrektur für a) hast du ja selbst schon herausgefunden. Was ist mit b), wo hakt es da?