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.
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.
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.
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
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?
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.
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.
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.
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ß.
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;
}
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.
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:
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.
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.
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.
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.
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.
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);
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."
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.