Zum Inhalt springen

ihkaka

Mitglieder
  • Gesamte Inhalte

    46
  • Benutzer seit

  • Letzter Besuch

Reputationsaktivitäten

  1. Positiv
    ihkaka hat eine Reaktion von D. Ment erhalten in IPv6 Subnetting   
    16Binär-Bits(pro IPv6-Segment) / 4 Teilnetze (Aufgabenstellung) = 4 Schrittweite, heißt 0 +4(Schrittweite) = 4 +4(Schrittweite) = 8 +4(Schrittweite) = 12 => C Hex.
     
    Das hilft nur bei einfachen Aufgaben, Schrittfolge ist kontraproduktiv wenn sowas kommt :
  2. verwirrt
    ihkaka hat eine Reaktion von 0x00 erhalten in ​Hilfe bei der Internetanbieterauswahl   
    Hallo, liebe IT-ler, könntet ihr bitte ein Ping-Test für mich ausführen.
    ping google.de -t (lasst es ca. 1 Minute laufen), oder wenn das zu kompliziert ist: packetlosstest.com (wählt Germany als Server aus) Bitte hier die Ping-Statistik und den Namen des Internetanbieters und Art des Anschlusses posten.
    Außerdem gebt bitte an, ob ihr in ein anderes Bundesland geroutet werdet bzw. ob euer Standort größer als 50 km entfernt erkannt wird über folgende Seite.
    whatismyip.com  
    Meine aktuelle Daten:
    Ping-Statistik für 142.250.186.99(google.de):
        Pakete: Gesendet = 12, Empfangen = 9, Verloren = 3
        (25% Verlust),
    Ca. Zeitangaben in Millisek.:
        Minimum = 121ms, Maximum = 146ms, Mittelwert = 133ms
    Geroutet werde ich aus Hessen nach NW, Bayern etc. 
    Anbieter: O2
  3. Like
    ihkaka hat eine Reaktion von Ts61 erhalten in C#/ .Net Erste Anwendung   
    Es kann nur das sein, denn localPdfWorker.ListOfFiles hat ja einen Nullcheck oben und wenn es "null" wäre, dann würde es eine Argumentnull-Ausnahme anstatt Objektverweis-Ausnahme produzieren.
    Bedeutet in der localPdfWorker. ListOfFiles gibt es Elemente, deren Eigenschaft SysFileInfo null ist, also keine FileInfo-Objekte enthalten.
  4. Positiv
    ihkaka hat eine Reaktion von SENDMELOCATON erhalten in GA1 Winter 2015/2016 IPv6   
    Trace sieht nach Ping-Antwort aus. 

  5. Danke
    ihkaka hat eine Reaktion von SENDMELOCATON erhalten in GA2 2015 Sommer | Kapazität pro Festplatte | Bruttpkapazität | Speichereffizienz   
    Stimmt, deswegen kannst du auch nicht 2 TiByte nehmen. Es soll genau 6 TiByte rauskommen. Probier mal die Rechnung mit 3 und 4 TiByte. Oder kannst auch die Formel nach Kapazität-HD umstellen und dann hast du sofort das Ergebnis ohne probieren.
  6. verwirrt
    ihkaka hat eine Reaktion von Rienne erhalten in Schnellere alternativen zum Operative Professional für Hochschulzugang?   
    Yo schnellstmöglich ist:
    - Auf https://einschreibung.fernuni-hagen.de/qisserver/rds?state=wimma&stg=f&imma=einl gehen
    - Die Formulare ausfüllen
    - Ausbildungszeugnis der IHK, Arbeitszeugnis des Betriebes und Omas persönliche Empfehlung anfügen
    - Ausdrucken, Abschicken
    - Auf Antwort warten
    Uni-Hagen: #72 in Germany, https://edurank.org/geo/de/
    IU International University of Applied Sciences Rankings: #239 in Germany 
    Er will ja nicht im Hörsaal sitzen und die Allgemeine Hochschulreife braucht er auch nicht mit der Ausbildung, er will ja Informatik studieren und nicht Wirtschaftswissenschaft, Physik etc. Er ist automatisch qualifiziert für das Studium, das Zeugnis der IHK-Ausbildung ist mehr wert als so ein "Operative Professional" welches überflüssig ist.
    Du bekommst automatisch Skripte und Einsendearbeiten zur Verfügung und außerdem hast du Online-Zugriff auf sehr sehr viele Bücher (pdf) der meisten Verlage ... keine Extrakosten. Teilzeit brauchst du nicht nehmen, wenn du gut bist, kriegst du alles mit dem normalen Urlaub geregelt und kannst trotzdem hier im Forum nebenbei abhängen . 
  7. Haha
    ihkaka hat eine Reaktion von Whitehammer03 erhalten in Schnellere alternativen zum Operative Professional für Hochschulzugang?   
    Selbststudium oder so klingt für mich nach Bullshitstudium und IU Fernschule klingt auch nicht so toll.
    Du willst studieren, dann mach das doch auf der Fernuni Hagen.
    Alles online abgesehen von Prüfungen (bei Corona-Lockdown auch online).
    Es ist nicht leicht und auch nicht schnell, aber wenigstens haste am Ende ein Bachelor von einer richtigen Uni.
     
    Fernuni Hagen:
    Formulare ausfüllen + Nachweis der Ausbildung, losschicken fertig.
    https://www.fernuni-hagen.de/studium/studienangebot/bachelor.shtml
    https://www.fernuni-hagen.de/studium/studienangebot/bachelor-informatik.shtml
    https://www.fernuni-hagen.de/studium/einschreiben/einschreiben.shtm
  8. verwirrt
    ihkaka hat eine Reaktion von 0x00 erhalten in Schnellere alternativen zum Operative Professional für Hochschulzugang?   
    Selbststudium oder so klingt für mich nach Bullshitstudium und IU Fernschule klingt auch nicht so toll.
    Du willst studieren, dann mach das doch auf der Fernuni Hagen.
    Alles online abgesehen von Prüfungen (bei Corona-Lockdown auch online).
    Es ist nicht leicht und auch nicht schnell, aber wenigstens haste am Ende ein Bachelor von einer richtigen Uni.
     
    Fernuni Hagen:
    Formulare ausfüllen + Nachweis der Ausbildung, losschicken fertig.
    https://www.fernuni-hagen.de/studium/studienangebot/bachelor.shtml
    https://www.fernuni-hagen.de/studium/studienangebot/bachelor-informatik.shtml
    https://www.fernuni-hagen.de/studium/einschreiben/einschreiben.shtm
  9. Like
    ihkaka reagierte auf Whiz-zarD in C# Methode aus delegat entfernen   
    Die Delegates sind ja keine Zauberei. Die sind lediglich nur eine Liste von Funktionszeigern. Eine Methode ist im Grunde ja auch nichts weiter als eine Referenz auf einen Speicherbereich.
    Ich verstehe aber immer noch nicht so ganz, wieso du dies löschen möchtest. Ich habe da nur ein Verdacht, wieso du das tun möchtest aber wenn ich richtig liege, dann muss ich dir sagen, dass die Delegates dafür nicht gedacht sind. Ich vermute mal, dass du die aufzurufenden Methoden per Multithreading abarbeiten möchtest und daher mehrere Instanzen von der Caller-Klasse erzeugst, die alle die gleichen Methodenaufrufe bekommen und du dann die herauslöschen möchtest, du dann schon aufgerufen wurden. Liege ich da richtig?
    Dafür sind Delegates aber nicht gedacht. Delegates werden einfach in einem Thread sequentiell abgearbeitet. Wenn du nebenläufige Aufgaben erledigen möchtest, gibt es die Klasse Task<T>, die solche darstellen und ausgeführt werden. Mit den Methoden Task.WhenAll() bzw. Task.WhenAny() kann man dann auf die Ergebnisse der Tasks warten:
    class Program { public static async Task Main(string[] args) { var tasks = new Task<(string, bool)>[] { new Task<(string, bool)>(() => { Console.WriteLine("Start Task 1"); Thread.Sleep(1000); Console.WriteLine("End Task 1"); return ("Task 1", true); }), new Task<(string, bool)>(() => { Console.WriteLine("Start Task 2"); Thread.Sleep(100); Console.WriteLine("End Task 2"); return ("Task 2", false); }) }; foreach (var task in tasks) task.Start(); foreach (var result in await Task.WhenAll(tasks)) Console.WriteLine($"{result.Item1} => {result.Item2}"); } } Das Threadhandling übernimmt dann die CLR bzw. das .NET Framework für uns.
    Dein Beispiel mit dem Bescheidsager und Ausführer lässt sich auch eleganter lösen, denn im Grunde ist dies das Decorator Pattern. Du schreibst ein Interface, was sowohl dein Bescheidsager, als auch dein Ausführer implementiert. Im Konstruktor vom Bescheidsager gibst du dann eine Instanz vom Ausführer mit, die dann nicht null sein darf. Dann sparst du dir auch dieses lästige if-then-else bei der Ausführung.
    interface IAusfuehrer { bool Ausfuehren(); } class Bescheidsager : IAusfuehrer { private readonly IAusfuehrer _ausfuehrer; public Bescheidsager(IAusfuehrer ausfuehrer) { _ausfuehrer = ausfuehrer ?? throw new ArgumentNullException(nameof(ausfuehrer)); } public bool Ausfuehren() { Console.WriteLine("Starte Methode"); return _ausfuehrer.Ausfuehren(); } } class Ausfuehrer : IAusfuehrer { public bool Ausfuehren() { Console.WriteLine("Ausfuehrer wird ausgeführt"); return true; } } class Program { public static void Main(string[] args) { var ausfuehrer = new Ausfuehrer(); var bescheidsager = new Bescheidsager(ausfuehrer); Console.WriteLine(bescheidsager.Ausfuehren()); } }
  10. Like
    ihkaka hat eine Reaktion von Spellkraft erhalten in Bereitstellen einer Webapp auf einem lokalen Server   
    Klingt ok. Den Titel würde ich genauer angeben. Als Integrator musst du nicht die App/Software bereitstellen, sondern die Umgebung für die App bereitstellen und die App in die Umgebung integrieren. Server-Hardware, Server-Betriebsys, Applikationsserver-Software,  Datenbank,  Virtualisierungssoftware, Backup-Software... brauchst für alles Lizenzen.
    Was für die Projektdokumentation wichtig ist:
    -Welches Vorgehensmodell(Wasserfall. V-Model, Spiral etc.) für die Projektdurchführung du benutzt hast
    -Gant-Diagramm für den Zeitplan
    -Netzwerkplan von dem Netzwerk in welches der Server integriert werden soll, Konfiguration, Adressierung etc.
    -Softwarekomponenten und VMs in einem Diagramm darstellen, genau darstellen was in der VM läuft und was nicht.  
    -Was sind die Anforderungen der App/Software, damit die erfolgreich integrierbar ist.
    -Warum du dich für eine z.B. Datenbank entschieden hast im Vergleich zu vielen anderen. Warum ein bestimmtes BS usw.
    -Alle deine Entscheidungen und auch Fehlentscheidungen im Projekt müssen in der Projektdokumentation dargestellt werden.
    -Der Ist/Soll Zustand soll genau dargestellt werden
    -Konfigurationsdateien, Skripte im Anhang 
     
    Es geht vor allem um die genaue Darstellung der Vorgehensweise bei einer Projektdurchführung, also genau so wie es in der realen Betriebswelt stattfindet. Wie sexy das Projekt klingt ist zweitrangig, Hauptsache ist die IHK genehmigt es. 
     
     
  11. Like
    ihkaka reagierte auf Balboa44 in Das erste mal MVVM anwenden. (WPF, C#)   
    Ich habe es geschafft, die Datagrid und die Listbox an eine generische Liste zu binden. Jetzt werden alle Daten aus der Datenbank angezeigt. Ich habe jetzt probiert, einen angeklickten Datensatz aus der Datagrid/Listbox an die Textboxen zu binden, aber leider gelingt mir das nur, indem ich
    DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.KundenNummerPK 
    definiere.
    Jetzt ist die Textbox an die Datagrid gebunden, sollte aber lieber an die Liste gebunden werden. Ich möchte im Endeffekt, dass ich die Kunden in der Listbox/Datagrid auswählen und deren Daten in den Textboxen automatisch verändern kann.
    Hat jemand vielleicht eine Idee, was ich machen könnte? Am besten mit Code Beispielen.
    Und danke KeeperOfCoffee  für den Hinweis. 👍
     
    MainWindow.xaml
    <Window x:Class="..._Kunden.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:..._Kunden" mc:Ignorable="d" Title="MainWindow" Height="679.747" Width="1353.764" WindowStartupLocation="CenterScreen"> <Window.DataContext> <local:KundenDatenViewModel/> </Window.DataContext> <Grid Background="#FF434751" Margin="0,0,-6.8,0.4"> <Label x:Name="labelKundenNummerPK" Content="Kunden Nummer PK:" HorizontalAlignment="Left" Margin="858,6,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxKundenNummerPK" HorizontalAlignment="Left" Height="24" Margin="865,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" IsEnabled="False" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.KundenNummerPK , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelOffeneVorgaenge" Content="Offene Vorgänge:" HorizontalAlignment="Left" Margin="858,61,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffeneVorgaenge" HorizontalAlignment="Left" Height="24" Margin="865,97,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.OffeneVorgaenge , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelKundenBruttopreise" Content="Bruttopreise:" HorizontalAlignment="Left" Margin="858,115,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxBruttopreise" HorizontalAlignment="Left" Height="24" Margin="865,149,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Bruttopreise , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelOffenePosten" Content="Offene Posten:" HorizontalAlignment="Left" Margin="858,170,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffenePosten" HorizontalAlignment="Left" Height="24" Margin="865,205,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.OffenePosten , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelTransportweg" Content="Transportweg:" HorizontalAlignment="Left" Margin="858,225,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffeneTransportweg" HorizontalAlignment="Left" Height="24" Margin="865,260,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Transportweg , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelPreis" Content="Preis:" HorizontalAlignment="Left" Margin="858,280,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxPreis" HorizontalAlignment="Left" Height="24" Margin="865,316,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Preis , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelVersandanschrift_" Content="Versandanschrift:" HorizontalAlignment="Left" Margin="858,336,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxVersandanschrift" HorizontalAlignment="Left" Height="24" Margin="865,370,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Versandanschrift , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelVersicherung" Content="Versicherung:" HorizontalAlignment="Left" Margin="858,391,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxVersicherung" HorizontalAlignment="Left" Height="24" Margin="865,426,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Versicherung , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelBenutzer" Content="Benutzer:" HorizontalAlignment="Left" Margin="858,442,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxBenutzer" HorizontalAlignment="Left" Height="24" Margin="865,476,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Benutzer , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="labelZeit" Content="Zeit:" HorizontalAlignment="Left" Margin="858,497,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxZeit" HorizontalAlignment="Left" Height="24" Margin="865,532,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" DataContext="{Binding ListeKundenDaten}" Text="{Binding ElementName=dataGrid, Path=SelectedItem.Zeit , Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> <Button x:Name="buttonSpeichern" Content="Speichern" HorizontalAlignment="Left" Margin="260,593,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonSpeichern_Click" IsEnabled="False"/> <Button x:Name="buttonLoeschen" Content="Löschen" HorizontalAlignment="Left" Margin="1251,561,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonLoeschen_Click"/> <Button x:Name="buttonBearbeiten" Content="Bearbeiten" HorizontalAlignment="Left" Margin="1171,561,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonBearbeiten_Click"/> <Button x:Name="buttonClearListBoxUndTextBoxen" Content="Clear" HorizontalAlignment="Left" Margin="1251,591,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonClearListBoxUndTextBoxen_Click"/> <Label x:Name="labelListBoxUndTextBoxenClear" Content="Listbox und Textboxen:" HorizontalAlignment="Left" Margin="965,585,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <Button x:Name="buttonReload" Content="Reload" HorizontalAlignment="Left" Margin="1171,591,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonReload_Click"/> <RadioButton x:Name="radioButtonKundenNrPK" Content="Neuen Kunden erstellen" HorizontalAlignment="Left" Margin="27,593,0,0" VerticalAlignment="Top" FontSize="18" FontWeight="Bold" Checked="RadioButtonKundenNrPK_Checked" Unchecked="RadioButtonKundenNrPK_Unchecked" Foreground="White"/> <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="278" Margin="27,28,0,0" VerticalAlignment="Top" Width="812" Background="#FF354D93" SelectionChanged="ListBox_SelectionChanged" FontWeight="Bold" Foreground="White" ItemsSource="{Binding ListeKundenDaten, UpdateSourceTrigger=PropertyChanged}"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel Orientation="Vertical" IsItemsHost="True" /> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Margin="0 0 10 0"> <TextBlock Text="{Binding KundenNummerPK, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0" /> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding OffeneVorgaenge, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Bruttopreise, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding OffenePosten, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Transportweg, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Preis, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Versandanschrift, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Versicherung, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Benutzer, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> <TextBlock Text="|" Margin="0 0 10 0"/> <TextBlock Text="{Binding Zeit, UpdateSourceTrigger=PropertyChanged}" Margin="0 0 10 0"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Height="278" Margin="27,310,0,0" VerticalAlignment="Top" Width="812" Background="#FF354D93" Foreground="Black" AutoGenerateColumns="False" ItemsSource="{Binding ListeKundenDaten, UpdateSourceTrigger=PropertyChanged}" SelectionChanged="DataGrid_SelectionChanged"> <DataGrid.Columns> <DataGridTextColumn Header="KundenNummerPK" Binding="{Binding KundenNummerPK, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="OffeneVorgaenge" Binding="{Binding OffeneVorgaenge, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Bruttopreise" Binding="{Binding Bruttopreise, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="OffenePosten" Binding="{Binding OffenePosten, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Transportweg" Binding="{Binding Transportweg, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Preis" Binding="{Binding Preis, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Versandanschrift" Binding="{Binding Versandanschrift, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Versicherung" Binding="{Binding Versicherung, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Benutzer" Binding="{Binding Benutzer, UpdateSourceTrigger=PropertyChanged}"/> <DataGridTextColumn Header="Zeit" Binding="{Binding Zeit, UpdateSourceTrigger=PropertyChanged}"/> </DataGrid.Columns> </DataGrid> </Grid> </Window> MainWindow.xaml.cs (Ganz unten im Code steht die komplette Aufgabenstellung als Kommentar)
    using System.Windows; using System.Windows.Controls; namespace MLAN_Kunden { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); KundenDatenViewModel kundenDatenViewModel = new KundenDatenViewModel(); kundenDatenViewModel.LadeDatenInsKundenDatenViewmodel(); DataContext = kundenDatenViewModel; } private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (listBox.SelectedIndex != -1) { KundenDatenViewModel kundenDatenViewModel = new KundenDatenViewModel(); kundenDatenViewModel.test(listBox.SelectedIndex); this.DataContext = kundenDatenViewModel; } } private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { } private void ButtonSpeichern_Click(object sender, RoutedEventArgs e) { } private void ButtonBearbeiten_Click(object sender, RoutedEventArgs e) { } private void ButtonLoeschen_Click(object sender, RoutedEventArgs e) { } private void ButtonClearListBoxUndTextBoxen_Click(object sender, RoutedEventArgs e) { } private void ButtonReload_Click(object sender, RoutedEventArgs e) { } private void RadioButtonKundenNrPK_Checked(object sender, RoutedEventArgs e) { } private void RadioButtonKundenNrPK_Unchecked(object sender, RoutedEventArgs e) { } } } /* In der ... können u.a. Kundendaten verwaltet werden. Es soll eine Applikation erstellt werden, die die Kundendaten in eine Liste/Tabelle anzeigt und mit der die Kundendaten bearbeitet werden können. Links soll die Tabelle/Liste mit allen Kunden zu sehen sein und rechts die einzelnen Eingabefelder für einen Kundendatensatz. Wir links in der Tabelle ein Kundendatensatz ausgewählt, so sind die Daten rechts in den Eingabecontrols zu sehen und können bei Bedarf geändert und gespeichert werden. Die Kundennummer (Primärschlüssel) darf nicht geändert werden, da dieser von der Datenbank verwaltet wird. Die Tabelle in der Datenbank heißt "Kunden". Der Primärschlüssel/Kundennummer heißt "KDNUMMER". Es müssen nicht alle Tabellenfelder in der Tabelle und rechts zhur Bearbeitung angezeigt werden, 10 Felder sollen ausreichend sein. Es ist die Datenbank aus Aufgabe2 zu verwenden. Die einzelnen Tabellenfelder sind in der Datei Table_Kunden.txt beschrieben. Es ist sich auch mit folgenden Git-Befehlen/Funktionen (Team-Explorer in Visual Studio) zu beschäftigen: - Fetch (Abrufen) - Pull (Remote-Änderungen in die lokale Arbeitskopie übernehmen/überspielen) - Commit - Push ---------------------------------------------------------------------------------------------------------- Datenbindung Model -> ViewModel -> View Ziel: Es sollen sämtliche direkten Verweise auf die Controls (ListBox, TextBox, etc.) in den Klassen entfernt werden und die Zuweisung der einzelnen Kundendaten durch Datenbindung der Properties erreicht werden. Beispiel: statt textBoxName.Text = "Gerd" wird geschrieben kunde.Name = "Gerd". kunde ist hier das Objekt der Model-Klasse "Kunde" und besitzt die Property "Name". Diese Property wird an die Text-Property der TextBox in der View (XAML) gebunden. Der ListBox werden nicht einzeln die Items durch die hinzugefügt (listBox.Items.Add(...)), sondern an eine List von Kunden gebunden. Benötigt wird die Model-Klasse für einen bzw. die Kunden (hier schon vorhanden in KundenDaten.cs). Eine generische List zur Bindung der aller Kundendaten an die ListBox. MVVM Design pattern (Entwurfsmuster): https://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_28_005.html DataTable belegeDaten = new DataTable(); ViewModel holt Kundendaten aus der Datenbank und erhält somit eine generische Liste mit den Kundendatensätzen --> List<KundenDaten> Die Liste wird an die ItemsSource der ListBox bzw. der Tabelle gebunden (DataGrid). KundenDatenViewModel besitzt eine Initial-Methode zum Holen der Datensätze über die Datenbankklasse. MainWindow.xaml.cs var kundenDatenViewModel = new KundenDatenViewModel(); KundenDatenViewModel.Init(); this.DataContext = KundenDatenViewModel; Im DataGrid die Spalten (Columns) einzeln definieren und an die jeweilige Eigenschaft des Kunden-Model binden (pro Kunden-Property eine Spalte). */ KundenViewModel.cs
    using System.Collections.Generic; using System.ComponentModel; namespace ..._Kunden { class KundenDatenViewModel : INotifyPropertyChanged { private Datenbank datenbank = new Datenbank(); public event PropertyChangedEventHandler PropertyChanged; private List<KundenDaten> listeKundenDaten = new List<KundenDaten>(); private string kundenNummerPK; private string offeneVorgaenge; private string bruttopreise; private string offenePosten; private string transportweg; private string preis; private string versandanschrift; private string versicherung; private string benutzer; private string zeit; public List<KundenDaten> ListeKundenDaten { get { return listeKundenDaten; } set { if (listeKundenDaten == value) return; listeKundenDaten = value; OnPropertyChanged("ListeKundenDaten"); } } public string KundenNummerPK { get { return kundenNummerPK; } set { if (kundenNummerPK == value) return; kundenNummerPK = value; OnPropertyChanged("KundenNummerPK"); } } public string OffeneVorgaenge { get { return offeneVorgaenge; } set { if (offeneVorgaenge == value) return; offeneVorgaenge = value; OnPropertyChanged("OffeneVorgaenge"); } } public string Bruttopreise { get { return bruttopreise; } set { if (bruttopreise == value) return; bruttopreise = value; OnPropertyChanged("Bruttopreise"); } } public string OffenePosten { get { return offenePosten; } set { if (offenePosten == value) return; offenePosten = value; OnPropertyChanged("OffenePosten"); } } public string Transportweg { get { return transportweg; } set { if (transportweg == value) return; transportweg = value; OnPropertyChanged("Transportweg"); } } public string Preis { get { return preis; } set { if (preis == value) return; preis = value; OnPropertyChanged("Preis"); } } public string Versandanschrift { get { return versandanschrift; } set { if (versandanschrift == value) return; versandanschrift = value; OnPropertyChanged("Versandanschrift"); } } public string Versicherung { get { return versicherung; } set { if (versicherung == value) return; versicherung = value; OnPropertyChanged("Versicherung"); } } public string Benutzer { get { return benutzer; } set { if (benutzer == value) return; benutzer = value; OnPropertyChanged("Benutzer"); } } public string Zeit { get { return zeit; } set { if (zeit == value) return; zeit = value; OnPropertyChanged("Zeit"); } } protected internal void OnPropertyChanged(string propertyname) { PropertyChangedEventHandler propertyChanged = PropertyChanged; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); } } public void LadeDatenInsKundenDatenViewmodel() { listeKundenDaten = datenbank.KundenLesenNew(); } public List<KundenDaten> test(int index) { listeKundenDaten = datenbank.KundenLesenNew(); listeKundenDaten.Add( new KundenDaten { KundenNummerPK = listeKundenDaten[index].KundenNummerPK, OffeneVorgaenge = listeKundenDaten[index].OffeneVorgaenge, Bruttopreise = listeKundenDaten[index].Bruttopreise, OffenePosten = listeKundenDaten[index].OffenePosten, Transportweg = listeKundenDaten[index].Transportweg, Preis = listeKundenDaten[index].Preis, Versandanschrift = listeKundenDaten[index].Versandanschrift, Versicherung = listeKundenDaten[index].Versicherung, Benutzer = listeKundenDaten[index].Benutzer, Zeit = listeKundenDaten[index].Zeit }); return listeKundenDaten; } } } KundenDaten.cs
    using System.Collections.Generic; namespace ..._Kunden { public class KundenDaten { public List<KundenDaten> ListeKundenDaten; public string KundenNummerPK { get; set; } public string OffeneVorgaenge { get; set; } public string Bruttopreise { get; set; } public string OffenePosten { get; set; } public string Transportweg { get; set; } public string Preis { get; set; } public string Versandanschrift { get; set; } public string Versicherung { get; set; } public string Benutzer { get; set; } public string Zeit { get; set; } public KundenDaten() { } public string GetCSVSatz() { string getCSVSatzString; getCSVSatzString = KundenNummerPK + " / " + OffeneVorgaenge + " / " + Bruttopreise + " / " + OffenePosten + " / " + Transportweg + " / " + Preis + " / " + Versandanschrift + " / " + Versicherung + " / " + Benutzer + " / " + Zeit + "\n"; //getCSVSatzString = KundenNummerPK + ";" + OffeneVorgaenge + ";" + Bruttopreise + ";" + OffenePosten + ";" + Transportweg + ";" + Preis + ";" + Versandanschrift + ";" + Versicherung + ";" + Benutzer + ";" + Zeit + ";"; return getCSVSatzString; } } } Datenbank.cs
    using System.Collections.Generic; using System.Data; using System.Data.SqlClient; namespace ..._Kunden { class Datenbank { public readonly string sqlPath = "SERVER=...;DATABASE=...;UID=...;PASSWORD='...';"; public DataTable dataTable = new DataTable(); private List<KundenDaten> listeKundenDaten = new List<KundenDaten>(); public Datenbank() { } public List<KundenDaten> KundenLesenNew() { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); using (SqlCommand sqlCommand = new SqlCommand("SELECT KDNUMMER, KDOPVA, KDBRUTTO, KDOPRG, KDEMTRWEG, KDPREISKZ, KDVANUMMER, KDVERSICH, KDWSNAME, KDWSZEIT FROM KUNDEN ORDER BY KDNUMMER", sqlConnection)) { SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand); sqlDataAdapter.Fill(dataTable); foreach (DataRow dataRow in dataTable.Rows) { listeKundenDaten.Add( new KundenDaten { KundenNummerPK = dataRow["KDNUMMER"].ToString(), OffeneVorgaenge = dataRow["KDOPVA"].ToString(), Bruttopreise = dataRow["KDBRUTTO"].ToString(), OffenePosten = dataRow["KDOPRG"].ToString(), Transportweg = dataRow["KDEMTRWEG"].ToString(), Preis = dataRow["KDPREISKZ"].ToString(), Versandanschrift = dataRow["KDVANUMMER"].ToString(), Versicherung = dataRow["KDVERSICH"].ToString(), Benutzer = dataRow["KDWSNAME"].ToString(), Zeit = dataRow["KDWSZEIT"].ToString() }); foreach (KundenDaten kundenDaten in listeKundenDaten) { } } return listeKundenDaten; } } } public void KundenDatenBearbeiten(KundenDatenViewModel kundenDatenViewModel) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); string sqlAnweisung; SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlAnweisung = string.Format("UPDATE KUNDEN SET KDNUMMER = '{0}', KDOPVA = '{1}', KDBRUTTO = '{2}', KDOPRG = '{3}', " + "KDEMTRWEG = '{4}', KDPREISKZ = '{5}', KDVANUMMER = '{6}', KDVERSICH = '{7}', KDWSNAME = '{8}', KDWSZEIT = '{9}' ", kundenDatenViewModel.KundenNummerPK, kundenDatenViewModel.OffeneVorgaenge.Replace(",", "."), kundenDatenViewModel.Bruttopreise, kundenDatenViewModel.OffenePosten.Replace(",", "."), kundenDatenViewModel.Transportweg, kundenDatenViewModel.Preis, kundenDatenViewModel.Versandanschrift, kundenDatenViewModel.Versicherung, kundenDatenViewModel.Benutzer, kundenDatenViewModel.Zeit); sqlAnweisung += string.Format("WHERE KDNUMMER = '{0}';", kundenDatenViewModel.KundenNummerPK); sqlCommand.CommandText = sqlAnweisung; sqlCommand.ExecuteNonQuery(); sqlConnection.Close(); } } } } Logik.cs
    using System.Windows.Controls; namespace ..._Kunden { class Logik { public Logik() { } public void ListBoxTextBoxenClear(ListBox listBox, TextBox textBoxKundenNummerPK, TextBox textBoxOffeneVorgaenge, TextBox textBoxBruttopreise, TextBox textBoxOffenePosten, TextBox textBoxTransportweg, TextBox textBoxPreis, TextBox textBoxVersandanschrift, TextBox textBoxVersicherung, TextBox textBoxBenutzer, TextBox textBoxZeit) { listBox.Items.Clear(); textBoxKundenNummerPK.Text = ""; textBoxOffeneVorgaenge.Text = ""; textBoxBruttopreise.Text = ""; textBoxOffenePosten.Text = ""; textBoxTransportweg.Text = ""; textBoxPreis.Text = ""; textBoxVersandanschrift.Text = ""; textBoxVersicherung.Text = ""; textBoxBenutzer.Text = ""; textBoxZeit.Text = ""; } public void NurTextBoxenClear(TextBox textBoxKundenNummerPK, TextBox textBoxOffeneVorgaenge, TextBox textBoxBruttopreise, TextBox textBoxOffenePosten, TextBox textBoxTransportweg, TextBox textBoxPreis, TextBox textBoxVersandanschrift, TextBox textBoxVersicherung, TextBox textBoxBenutzer, TextBox textBoxZeit) { textBoxKundenNummerPK.Text = ""; textBoxOffeneVorgaenge.Text = ""; textBoxBruttopreise.Text = ""; textBoxOffenePosten.Text = ""; textBoxTransportweg.Text = ""; textBoxPreis.Text = ""; textBoxVersandanschrift.Text = ""; textBoxVersicherung.Text = ""; textBoxBenutzer.Text = ""; textBoxZeit.Text = ""; } } }  
  12. Like
    ihkaka reagierte auf KeeperOfCoffee in Das erste mal MVVM anwenden. (WPF, C#)   
    Der Standard UpdateSourceTrigger von klassichen TextBoxen ist "LostFocus" ... soll heißen Änderungen werden im ViewModel erst behandelt, wenn das UI Control seinen Focus verliert (in diesem Fall Keyboard Fokus...nocht logical aber das ist ein anderes Thema).
    Sprich...du änderst Text in ner TextBox, klickst speichern => Property hat aber den alten Wert, da die Property erst aktualisiert wird, wenn der Fokus weg ist.
     
    Du kannst dies beheben, wenn du den UpdateSourceTrigger auf "PropertyChanged" setzt.
    Sprich:
    <TextBox Width="250" HorizontalAlignment="Left" VerticalAlignment="Top" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> Dadurch wird jetzt die Änderung der TextBox im ViewModel bei der Property erkannt.
    Vermutlich wird dir beim testen aufgefallen sein, dass immer eine Property nicht gepasst hat.
  13. Like
    ihkaka reagierte auf Balboa44 in Das erste mal MVVM anwenden. (WPF, C#)   
    Aufgabe:
    In der ... können u.a. Kundendaten verwaltet werden.
    Es soll eine Applikation erstellt werden, die die Kundendaten in eine Liste/Tabelle anzeigt und mit der die Kundendaten bearbeitet werden können.
    Links soll die Tabelle/Liste mit allen Kunden zu sehen sein und rechts die einzelnen Eingabefelder für einen Kundendatensatz.
    Wir links in der Tabelle ein Kundendatensatz ausgewählt, so sind die Daten rechts in den Eingabecontrols zu sehen und können bei Bedarf geändert und gespeichert werden.
    Die Kundennummer (Primärschlüssel) darf nicht geändert werden, da dieser von der Datenbank verwaltet wird.
    Die Tabelle in der Datenbank heißt "Kunden".
    Der Primärschlüssel/Kundennummer heißt "KDNUMMER".
    Es müssen nicht alle Tabellenfelder in der Tabelle und rechts zur Bearbeitung angezeigt werden, 10 Felder sollen ausreichend sein.
    Die Aufgabe habe ich so gelöst:
    MainWindow.xaml:
    <Window x:Class="... .MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MLAN_Kunden" mc:Ignorable="d" Title="MainWindow" Height="679.747" Width="1001.764" WindowStartupLocation="CenterScreen"> <Grid Background="#FF434751"> <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="550" Margin="27,28,0,0" VerticalAlignment="Top" Width="434" Background="#FF354D93" SelectionChanged="ListBox_SelectionChanged" FontWeight="Bold" Foreground="White"/> <Label x:Name="labelKundenNummerPK" Content="Kunden Nummer PK:" HorizontalAlignment="Left" Margin="498,28,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxKundenNummerPK" HorizontalAlignment="Left" Height="24" Margin="504,62,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" IsEnabled="False"/> <Label x:Name="labelOffeneVorgaenge" Content="Offene Vorgänge:" HorizontalAlignment="Left" Margin="498,83,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffeneVorgaenge" HorizontalAlignment="Left" Height="24" Margin="504,118,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelKundenBruttopreise" Content="Bruttopreise:" HorizontalAlignment="Left" Margin="498,137,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxBruttopreise" HorizontalAlignment="Left" Height="24" Margin="504,171,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelOffenePosten" Content="Offene Posten:" HorizontalAlignment="Left" Margin="498,192,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffenePosten" HorizontalAlignment="Left" Height="24" Margin="504,227,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelTransportweg" Content="Transportweg:" HorizontalAlignment="Left" Margin="498,247,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffeneTransportweg" HorizontalAlignment="Left" Height="24" Margin="504,282,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelPreis" Content="Preis:" HorizontalAlignment="Left" Margin="498,302,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxPreis" HorizontalAlignment="Left" Height="24" Margin="504,338,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelVersandanschrift_" Content="Versandanschrift:" HorizontalAlignment="Left" Margin="498,358,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxVersandanschrift" HorizontalAlignment="Left" Height="24" Margin="504,392,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelVersicherung" Content="Versicherung:" HorizontalAlignment="Left" Margin="498,413,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxVersicherung" HorizontalAlignment="Left" Height="24" Margin="504,448,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelBenutzer" Content="Benutzer:" HorizontalAlignment="Left" Margin="498,464,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxBenutzer" HorizontalAlignment="Left" Height="24" Margin="504,498,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Label x:Name="labelZeit" Content="Zeit:" HorizontalAlignment="Left" Margin="498,519,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxZeit" HorizontalAlignment="Left" Height="24" Margin="504,554,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold"/> <Button x:Name="buttonSpeichern" Content="Speichern" HorizontalAlignment="Left" Margin="260,588,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonSpeichern_Click" IsEnabled="False"/> <Button x:Name="buttonLoeschen" Content="Löschen" HorizontalAlignment="Left" Margin="891,583,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonLoeschen_Click"/> <Button x:Name="buttonBearbeiten" Content="Bearbeiten" HorizontalAlignment="Left" Margin="811,583,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonBearbeiten_Click"/> <Button x:Name="buttonClearListBoxUndTextBoxen" Content="Clear" HorizontalAlignment="Left" Margin="891,613,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonClearListBoxUndTextBoxen_Click"/> <Label x:Name="labelListBoxUndTextBoxenClear" Content="Listbox und Textboxen:" HorizontalAlignment="Left" Margin="605,607,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <Button x:Name="buttonReload" Content="Reload" HorizontalAlignment="Left" Margin="811,613,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonReload_Click"/> <RadioButton x:Name="radioButtonKundenNrPK" Content="Neuen Kunden erstellen" HorizontalAlignment="Left" Margin="27,588,0,0" VerticalAlignment="Top" FontSize="18" FontWeight="Bold" Checked="radioButtonKundenNrPK_Checked" Unchecked="radioButtonKundenNrPK_Unchecked" Foreground="White"/> </Grid> </Window> MainWindow.xaml.cs:
    using System.Windows; using System.Windows.Controls; namespace ..._Kunden { public partial class MainWindow : Window { private Datenbank datenbank = new Datenbank(); private Logik logik = new Logik(); public MainWindow() { InitializeComponent(); datenbank.KundenLesen(listBox); } private void ButtonSpeichern_Click(object sender, RoutedEventArgs e) { KundenDaten kundenDaten = new KundenDaten(textBoxKundenNummerPK.Text, textBoxOffeneVorgaenge.Text, textBoxBruttopreise.Text, textBoxOffenePosten.Text, textBoxOffeneTransportweg.Text, textBoxPreis.Text, textBoxVersandanschrift.Text, textBoxVersicherung.Text, textBoxBenutzer.Text, textBoxZeit.Text); datenbank.NeuenKundenSpeichern(kundenDaten, listBox); datenbank.KundenLesen(listBox); } private void ButtonBearbeiten_Click(object sender, RoutedEventArgs e) { KundenDaten kundenDaten = new KundenDaten(textBoxKundenNummerPK.Text, textBoxOffeneVorgaenge.Text, textBoxBruttopreise.Text, textBoxOffenePosten.Text, textBoxOffeneTransportweg.Text, textBoxPreis.Text, textBoxVersandanschrift.Text, textBoxVersicherung.Text, textBoxBenutzer.Text, textBoxZeit.Text); datenbank.KundenDatenBearbeiten(kundenDaten, listBox); datenbank.KundenLesen(listBox); } private void ButtonLoeschen_Click(object sender, RoutedEventArgs e) { datenbank.KundenDatenLoeschen(listBox); datenbank.KundenLesen(listBox); } private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (listBox.SelectedIndex != -1) { datenbank.LadeDatenInTextboxen(textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit, listBox.SelectedIndex, listBox); } } private void ButtonClearListBoxUndTextBoxen_Click(object sender, RoutedEventArgs e) { logik.ListBoxTextBoxenClear(listBox, textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit); } private void ButtonReload_Click(object sender, RoutedEventArgs e) { logik.ListBoxTextBoxenClear(listBox, textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit); datenbank.KundenLesen(listBox); } private void radioButtonKundenNrPK_Checked(object sender, RoutedEventArgs e) { textBoxKundenNummerPK.IsEnabled = true; buttonSpeichern.IsEnabled = true; logik.NurTextBoxenClear(textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit); } private void radioButtonKundenNrPK_Unchecked(object sender, RoutedEventArgs e) { textBoxKundenNummerPK.IsEnabled = false; buttonSpeichern.IsEnabled = false; } } } KundenDaten.cs:
    namespace ..._Kunden { class KundenDaten { public string KundenNummerPK { get; set; } public string OffeneVorgaenge { get; set; } public string Bruttopreise { get; set; } public string OffenePosten { get; set; } public string Transportweg { get; set; } public string Preis { get; set; } public string Versandanschrift { get; set; } public string Versicherung { get; set; } public string Benutzer { get; set; } public string Zeit { get; set; } public KundenDaten(string strKundenNummerPK, string strOffeneVorgaenge, string strBruttopreise, string strOffenePosten, string strTransportweg, string strPreis, string strVersandanschrift, string strVersicherung, string strBenutzer, string strZeit) { KundenNummerPK = strKundenNummerPK; OffeneVorgaenge = strOffeneVorgaenge; Bruttopreise = strBruttopreise; OffenePosten = strOffenePosten; Transportweg = strTransportweg; Preis = strPreis; Versandanschrift = strVersandanschrift; Versicherung = strVersicherung; Benutzer = strBenutzer; Zeit = strZeit; } public string GetCSVSatz() { string s; s = KundenNummerPK + " / " + OffeneVorgaenge + " / " + Bruttopreise + " / " + OffenePosten + " / " + Transportweg + " / " + Preis + " / " + Versandanschrift + " / " + Versicherung + " / " + Benutzer + " / " + Zeit + "\n"; //s = KundenNummerPK + ";" + OffeneVorgaenge + ";" + Bruttopreise + ";" + OffenePosten + ";" + Transportweg + ";" + Preis + ";" + Versandanschrift + ";" + Versicherung + ";" + Benutzer + ";" + Zeit + ";"; return s; } } } Datenbank.cs:
    using System.Collections.Generic; using System.Data.SqlClient; using System.Windows.Controls; namespace ..._Kunden { class Datenbank { private readonly string sqlPath = "SERVER=...;DATABASE=...;UID=...;PASSWORD='...';"; private List<KundenDaten> listeKundenDaten = new List<KundenDaten>(); public Datenbank() { } public void KundenLesen(ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); listeKundenDaten.Clear(); listBox.Items.Clear(); using (SqlCommand command = new SqlCommand("SELECT * FROM KUNDEN ORDER BY KDNUMMER", sqlConnection)) { using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { listeKundenDaten.Add( new KundenDaten( reader["KDNUMMER"].ToString(), //KundenNummer PK reader["KDOPVA"].ToString(), //Offene Vorgaenge reader["KDBRUTTO"].ToString(), //Bruttopreise reader["KDOPRG"].ToString(), //Offene Posten reader["KDEMTRWEG"].ToString(), //Transportweg reader["KDPREISKZ"].ToString(), //Preis reader["KDVANUMMER"].ToString(), //Versandanschrift reader["KDVERSICH"].ToString(), //Versicherung reader["KDWSNAME"].ToString(), //Benutzer reader["KDWSZEIT"].ToString() //Zeit )); } } } } foreach (KundenDaten kundenDaten in listeKundenDaten) { listBox.Items.Add(kundenDaten.GetCSVSatz()); } } public void NeuenKundenSpeichern(KundenDaten kundenDaten, ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); string sqlAnweisung; SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlAnweisung = string.Format("INSERT INTO KUNDEN(KDNUMMER, KDOPVA, KDBRUTTO, KDOPRG, KDEMTRWEG, KDPREISKZ, KDVANUMMER, KDVERSICH, KDWSNAME, KDWSZEIT) VALUES ( '{0}', '{1}', '{2}','{3}', '{4}', '{5}', '{6}','{7}','{8}','{9}');", kundenDaten.KundenNummerPK, kundenDaten.OffeneVorgaenge.Replace(",", "."), kundenDaten.Bruttopreise, kundenDaten.OffenePosten.Replace(",", "."), kundenDaten.Transportweg, kundenDaten.Preis, kundenDaten.Versandanschrift, kundenDaten.Versicherung, kundenDaten.Benutzer, kundenDaten.Zeit); sqlCommand.CommandText = sqlAnweisung; sqlCommand.ExecuteNonQuery(); } } public void KundenDatenBearbeiten(KundenDaten kundenDaten, ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); string sqlAnweisung; SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlAnweisung = string.Format("UPDATE KUNDEN SET KDNUMMER = '{0}', KDOPVA = '{1}', KDBRUTTO = '{2}', KDOPRG = '{3}', " + "KDEMTRWEG = '{4}', KDPREISKZ = '{5}', KDVANUMMER = '{6}', KDVERSICH = '{7}', KDWSNAME = '{8}', KDWSZEIT = '{9}' ", kundenDaten.KundenNummerPK, kundenDaten.OffeneVorgaenge.Replace(",", "."), kundenDaten.Bruttopreise, kundenDaten.OffenePosten.Replace(",", "."), kundenDaten.Transportweg, kundenDaten.Preis, kundenDaten.Versandanschrift, kundenDaten.Versicherung, kundenDaten.Benutzer, kundenDaten.Zeit); sqlAnweisung += string.Format("WHERE KDNUMMER = '{0}';", kundenDaten.KundenNummerPK); sqlCommand.CommandText = sqlAnweisung; sqlCommand.ExecuteNonQuery(); sqlConnection.Close(); } } public void KundenDatenLoeschen(ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlCommand.CommandText = "DELETE FROM KUNDEN " + "WHERE KDNUMMER = " + listBox.SelectedIndex.ToString() + ";"; sqlCommand.ExecuteNonQuery(); sqlConnection.Close(); } } public void LadeDatenInTextboxen(TextBox textBoxKundenNummerPK, TextBox textBoxOffeneVorgaenge, TextBox textBoxBruttopreise, TextBox textBoxOffenePosten, TextBox textBoxTransportweg, TextBox textBoxPreis, TextBox textBoxVersandanschrift, TextBox textBoxVersicherung, TextBox textBoxBenutzer, TextBox textBoxZeit, int index, ListBox listBox) { textBoxKundenNummerPK.Text = listeKundenDaten[index].KundenNummerPK; textBoxOffeneVorgaenge.Text = listeKundenDaten[index].OffeneVorgaenge; textBoxBruttopreise.Text = listeKundenDaten[index].Bruttopreise; textBoxOffenePosten.Text = listeKundenDaten[index].OffenePosten; textBoxTransportweg.Text = listeKundenDaten[index].Transportweg; textBoxPreis.Text = listeKundenDaten[index].Preis; textBoxVersandanschrift.Text = listeKundenDaten[index].Versandanschrift; textBoxVersicherung.Text = listeKundenDaten[index].Versicherung; textBoxBenutzer.Text = listeKundenDaten[index].Benutzer; textBoxZeit.Text = listeKundenDaten[index].Zeit; } } } Logik.cs:
    using System.Windows.Controls; namespace ..._Kunden { class Logik { public Logik() { } public void ListBoxTextBoxenClear(ListBox listBox, TextBox textBoxKundenNummerPK, TextBox textBoxOffeneVorgaenge, TextBox textBoxBruttopreise, TextBox textBoxOffenePosten, TextBox textBoxTransportweg, TextBox textBoxPreis, TextBox textBoxVersandanschrift, TextBox textBoxVersicherung, TextBox textBoxBenutzer, TextBox textBoxZeit) { listBox.Items.Clear(); textBoxKundenNummerPK.Text = ""; textBoxOffeneVorgaenge.Text = ""; textBoxBruttopreise.Text = ""; textBoxOffenePosten.Text = ""; textBoxTransportweg.Text = ""; textBoxPreis.Text = ""; textBoxVersandanschrift.Text = ""; textBoxVersicherung.Text = ""; textBoxBenutzer.Text = ""; textBoxZeit.Text = ""; } public void NurTextBoxenClear(TextBox textBoxKundenNummerPK, TextBox textBoxOffeneVorgaenge, TextBox textBoxBruttopreise, TextBox textBoxOffenePosten, TextBox textBoxTransportweg, TextBox textBoxPreis, TextBox textBoxVersandanschrift, TextBox textBoxVersicherung, TextBox textBoxBenutzer, TextBox textBoxZeit) { textBoxKundenNummerPK.Text = ""; textBoxOffeneVorgaenge.Text = ""; textBoxBruttopreise.Text = ""; textBoxOffenePosten.Text = ""; textBoxTransportweg.Text = ""; textBoxPreis.Text = ""; textBoxVersandanschrift.Text = ""; textBoxVersicherung.Text = ""; textBoxBenutzer.Text = ""; textBoxZeit.Text = ""; } } } Das Programm funktioniert, aber jetzt habe ich folgende extra Aufgabe bekommen:
    Datenbindung Model -> ViewModel -> View
    Ziel: Es sollen sämtliche direkten Verweise auf die Controls (ListBox, TextBox, etc.) in den Klassen entfernt werden und die Zuweisung der einzelnen Kundendaten durch Datenbindung der Properties erreicht werden.
    Beispiel: statt textBoxName.Text = "Gerd" wird geschrieben kunde.Name = "Gerd". kunde ist hier das Objekt der Model-Klasse "Kunde" und besitzt die Property "Name". Diese Property wird an die Text-Property der TextBox in der View (XAML) gebunden.
    Der ListBox werden nicht einzeln die Items durch die hinzugefügt (listBox.Items.Add(...)), sondern an eine List von Kunden gebunden.
    Benötigt wird die Model-Klasse für einen bzw. die Kunden (hier schon vorhanden in KundenDaten.cs).
    Eine generische List zur Bindung der aller Kundendaten an die ListBox.
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Ich mache seit einem Monat eine Ausbildung zum Fachinformatiker für Anwendungsentwicklung. Mir fehlen noch viele Grundkenntnisse und die extra Aufgabe kriege ich bis jetzt nicht wirklich gelöst.
    Ich habe folgendes Beispiel als Hilfe bekommen: https://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_28_005.html
    Jetzt habe ich eine ViewModelKlasse erstellt und die anderen Klassen verändert bzw. erstmal sehr viel auskommentiert.
    Die Klassen sehen jetzt so aus:
    MainWindow.xaml (Ich habe erstmal aus Testzwecken Daten an die Textboxen gebunden. Richtig wäre es, sie an die Listbox zu binden)
    <Window x:Class="..._Kunden.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MLAN_Kunden" mc:Ignorable="d" Title="MainWindow" Height="679.747" Width="1001.764" WindowStartupLocation="CenterScreen"> <Window.DataContext> <local:KundenDaten/> </Window.DataContext> <Grid Background="#FF434751"> <ListBox x:Name="listBox" HorizontalAlignment="Left" Height="550" Margin="27,28,0,0" VerticalAlignment="Top" Width="434" Background="#FF354D93" SelectionChanged="ListBox_SelectionChanged" FontWeight="Bold" Foreground="White" ItemsSource="{Binding KundenNummerPK}"/> <Label x:Name="labelKundenNummerPK" Content="Kunden Nummer PK:" HorizontalAlignment="Left" Margin="498,28,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxKundenNummerPK" HorizontalAlignment="Left" Height="24" Margin="504,62,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" IsEnabled="False" Text="{Binding KundenNummerPK}"/> <Label x:Name="labelOffeneVorgaenge" Content="Offene Vorgänge:" HorizontalAlignment="Left" Margin="498,83,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffeneVorgaenge" HorizontalAlignment="Left" Height="24" Margin="504,118,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding OffeneVorgaenge}"/> <Label x:Name="labelKundenBruttopreise" Content="Bruttopreise:" HorizontalAlignment="Left" Margin="498,137,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxBruttopreise" HorizontalAlignment="Left" Height="24" Margin="504,171,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Bruttopreise}"/> <Label x:Name="labelOffenePosten" Content="Offene Posten:" HorizontalAlignment="Left" Margin="498,192,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffenePosten" HorizontalAlignment="Left" Height="24" Margin="504,227,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding OffenePosten}"/> <Label x:Name="labelTransportweg" Content="Transportweg:" HorizontalAlignment="Left" Margin="498,247,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxOffeneTransportweg" HorizontalAlignment="Left" Height="24" Margin="504,282,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Transportweg}"/> <Label x:Name="labelPreis" Content="Preis:" HorizontalAlignment="Left" Margin="498,302,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxPreis" HorizontalAlignment="Left" Height="24" Margin="504,338,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Preis}"/> <Label x:Name="labelVersandanschrift_" Content="Versandanschrift:" HorizontalAlignment="Left" Margin="498,358,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxVersandanschrift" HorizontalAlignment="Left" Height="24" Margin="504,392,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Versandanschrift}"/> <Label x:Name="labelVersicherung" Content="Versicherung:" HorizontalAlignment="Left" Margin="498,413,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxVersicherung" HorizontalAlignment="Left" Height="24" Margin="504,448,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Versicherung}"/> <Label x:Name="labelBenutzer" Content="Benutzer:" HorizontalAlignment="Left" Margin="498,464,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxBenutzer" HorizontalAlignment="Left" Height="24" Margin="504,498,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Benutzer}"/> <Label x:Name="labelZeit" Content="Zeit:" HorizontalAlignment="Left" Margin="498,519,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <TextBox x:Name="textBoxZeit" HorizontalAlignment="Left" Height="24" Margin="504,554,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="462" FontWeight="Bold" Text="{Binding Zeit}"/> <Button x:Name="buttonSpeichern" Content="Speichern" HorizontalAlignment="Left" Margin="260,588,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonSpeichern_Click" IsEnabled="False"/> <Button x:Name="buttonLoeschen" Content="Löschen" HorizontalAlignment="Left" Margin="891,583,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonLoeschen_Click"/> <Button x:Name="buttonBearbeiten" Content="Bearbeiten" HorizontalAlignment="Left" Margin="811,583,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonBearbeiten_Click"/> <Button x:Name="buttonClearListBoxUndTextBoxen" Content="Clear" HorizontalAlignment="Left" Margin="891,613,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonClearListBoxUndTextBoxen_Click"/> <Label x:Name="labelListBoxUndTextBoxenClear" Content="Listbox und Textboxen:" HorizontalAlignment="Left" Margin="605,607,0,0" VerticalAlignment="Top" Foreground="White" FontWeight="Bold" FontSize="18"/> <Button x:Name="buttonReload" Content="Reload" HorizontalAlignment="Left" Margin="811,613,0,0" VerticalAlignment="Top" Width="75" Height="25" Background="#FFCB4141" FontWeight="Bold" Foreground="White" Click="ButtonReload_Click"/> <RadioButton x:Name="radioButtonKundenNrPK" Content="Neuen Kunden erstellen" HorizontalAlignment="Left" Margin="27,588,0,0" VerticalAlignment="Top" FontSize="18" FontWeight="Bold" Checked="radioButtonKundenNrPK_Checked" Unchecked="radioButtonKundenNrPK_Unchecked" Foreground="White"/> </Grid> </Window> MainWindow.xaml.cs:(Eigentlich nur  fast alles auskommentiert. Das ist neu --> this.DataContext = new MainWindowViewModel(KundenDaten.CreateKundenDaten()); )
    using System.Windows; using System.Windows.Controls; namespace ..._Kunden { public partial class MainWindow : Window { private Datenbank datenbank = new Datenbank(); private Logik logik = new Logik(); public MainWindow() { InitializeComponent(); //datenbank.KundenLesen(listBox); this.DataContext = new MainWindowViewModel(KundenDaten.CreateKundenDaten()); } private void ButtonSpeichern_Click(object sender, RoutedEventArgs e) { /* KundenDaten kundenDaten = new KundenDaten(textBoxKundenNummerPK.Text, textBoxOffeneVorgaenge.Text, textBoxBruttopreise.Text, textBoxOffenePosten.Text, textBoxOffeneTransportweg.Text, textBoxPreis.Text, textBoxVersandanschrift.Text, textBoxVersicherung.Text, textBoxBenutzer.Text, textBoxZeit.Text); datenbank.NeuenKundenSpeichern(kundenDaten, listBox); datenbank.KundenLesen(listBox); */ } private void ButtonBearbeiten_Click(object sender, RoutedEventArgs e) { /* KundenDaten kundenDaten = new KundenDaten(textBoxKundenNummerPK.Text, textBoxOffeneVorgaenge.Text, textBoxBruttopreise.Text, textBoxOffenePosten.Text, textBoxOffeneTransportweg.Text, textBoxPreis.Text, textBoxVersandanschrift.Text, textBoxVersicherung.Text, textBoxBenutzer.Text, textBoxZeit.Text); datenbank.KundenDatenBearbeiten(kundenDaten, listBox); datenbank.KundenLesen(listBox); */ } private void ButtonLoeschen_Click(object sender, RoutedEventArgs e) { /* datenbank.KundenDatenLoeschen(listBox); datenbank.KundenLesen(listBox); */ } private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { /* if (listBox.SelectedIndex != -1) { datenbank.LadeDatenInTextboxen(textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit, listBox.SelectedIndex, listBox); } */ } private void ButtonClearListBoxUndTextBoxen_Click(object sender, RoutedEventArgs e) { /* logik.ListBoxTextBoxenClear(listBox, textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit); */ } private void ButtonReload_Click(object sender, RoutedEventArgs e) { /* logik.ListBoxTextBoxenClear(listBox, textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit); datenbank.KundenLesen(listBox); */ } private void radioButtonKundenNrPK_Checked(object sender, RoutedEventArgs e) { /* textBoxKundenNummerPK.IsEnabled = true; buttonSpeichern.IsEnabled = true; logik.NurTextBoxenClear(textBoxKundenNummerPK, textBoxOffeneVorgaenge, textBoxBruttopreise, textBoxOffenePosten, textBoxOffeneTransportweg, textBoxPreis, textBoxVersandanschrift, textBoxVersicherung, textBoxBenutzer, textBoxZeit); */ } private void radioButtonKundenNrPK_Unchecked(object sender, RoutedEventArgs e) { /* textBoxKundenNummerPK.IsEnabled = false; buttonSpeichern.IsEnabled = false; */ } } } KundenDaten.cs: (Hier habe ich nur den Konstrukter entfernt und die Mehtode CreateKundenDaten() erstellt.)
    using System.ComponentModel; namespace ..._Kunden { public class KundenDaten { public string KundenNummerPK { get; set; } public string OffeneVorgaenge { get; set; } public string Bruttopreise { get; set; } public string OffenePosten { get; set; } public string Transportweg { get; set; } public string Preis { get; set; } public string Versandanschrift { get; set; } public string Versicherung { get; set; } public string Benutzer { get; set; } public string Zeit { get; set; } /* public KundenDaten(string strKundenNummerPK, string strOffeneVorgaenge, string strBruttopreise, string strOffenePosten, string strTransportweg, string strPreis, string strVersandanschrift, string strVersicherung, string strBenutzer, string strZeit) { KundenNummerPK = strKundenNummerPK; OffeneVorgaenge = strOffeneVorgaenge; Bruttopreise = strBruttopreise; OffenePosten = strOffenePosten; Transportweg = strTransportweg; Preis = strPreis; Versandanschrift = strVersandanschrift; Versicherung = strVersicherung; Benutzer = strBenutzer; Zeit = strZeit; } */ public string GetCSVSatz() { string s; s = KundenNummerPK + " / " + OffeneVorgaenge + " / " + Bruttopreise + " / " + OffenePosten + " / " + Transportweg + " / " + Preis + " / " + Versandanschrift + " / " + Versicherung + " / " + Benutzer + " / " + Zeit + "\n"; //s = KundenNummerPK + ";" + OffeneVorgaenge + ";" + Bruttopreise + ";" + OffenePosten + ";" + Transportweg + ";" + Preis + ";" + Versandanschrift + ";" + Versicherung + ";" + Benutzer + ";" + Zeit + ";"; return s; } public static KundenDaten CreateKundenDaten() { return new KundenDaten { KundenNummerPK = "1", OffeneVorgaenge = "22", Bruttopreise = "23", OffenePosten = "24", Transportweg = "25", Preis = "26", Versandanschrift = "27", Versicherung = "28", Benutzer = "Marvin", Zeit = "29" }; } } } MainWindowViewModel.cs:
    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ..._Kunden { public class MainWindowViewModel : INotifyPropertyChanged { public KundenDaten _Model; // Konstruktor public MainWindowViewModel(KundenDaten model) { _Model = model; _KundenNummerPK = _Model.KundenNummerPK; _OffeneVorgaenge = _Model.OffeneVorgaenge; _Bruttopreise = _Model.Bruttopreise; _OffenePosten = _Model.OffenePosten; _Transportweg = _Model.Transportweg; _Preis = _Model.Preis; _Versandanschrift = _Model.Versandanschrift; _Versicherung = _Model.Versicherung; _Benutzer = _Model.Benutzer; _Zeit = _Model.Zeit; } // Schnittstellen-Ereignis public event PropertyChangedEventHandler PropertyChanged; protected internal void OnPropertyChanged(string propertyname) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); } // Eigenschaften private string _KundenNummerPK; public string KundenNummerPK { get { return _KundenNummerPK; } set { if (_KundenNummerPK == value) return; _KundenNummerPK = value; OnPropertyChanged("KundenNummerPK"); } } private string _OffeneVorgaenge; public string OffeneVorgaenge { get { return _OffeneVorgaenge; } set { if (_OffeneVorgaenge == value) return; _OffeneVorgaenge = value; OnPropertyChanged("OffeneVorgaenge"); } } private string _Bruttopreise; public string Bruttopreise { get { return _Bruttopreise; } set { if (_Bruttopreise == value) return; _Bruttopreise = value; OnPropertyChanged("Bruttopreise"); } } private string _OffenePosten; public string OffenePosten { get { return _OffenePosten; } set { if (_OffenePosten == value) return; _OffenePosten = value; OnPropertyChanged("OffenePosten"); } } private string _Transportweg; public string Transportweg { get { return _Transportweg; } set { if (_Transportweg == value) return; _Transportweg = value; OnPropertyChanged("Transportweg"); } } private string _Preis; public string Preis { get { return _Preis; } set { if (_Preis == value) return; _Preis = value; OnPropertyChanged("Preis"); } } private string _Versandanschrift; public string Versandanschrift { get { return _Versandanschrift; } set { if (_Versandanschrift == value) return; _Versandanschrift = value; OnPropertyChanged("Versandanschrift"); } } private string _Versicherung; public string Versicherung { get { return _Versicherung; } set { if (_Versicherung == value) return; _Versicherung = value; OnPropertyChanged("Versicherung"); } } private string _Benutzer; public string Benutzer { get { return _Benutzer; } set { if (_Benutzer == value) return; _Benutzer = value; OnPropertyChanged("Benutzer"); } } private string _Zeit; public string Zeit { get { return _Zeit; } set { if (_Zeit == value) return; _Zeit = value; OnPropertyChanged("Zeit"); } } } } Datenbank.cs:(Eigentlich fast alles auskommentiert)
    using System.Collections.Generic; using System.Data.SqlClient; using System.Windows.Controls; namespace ..._Kunden { class Datenbank { private readonly string sqlPath = "SERVER=...;DATABASE=...;UID=...;PASSWORD='...';"; private List<KundenDaten> listeKundenDaten = new List<KundenDaten>(); public Datenbank() { } /* public void KundenLesen(ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); listeKundenDaten.Clear(); listBox.Items.Clear(); using (SqlCommand command = new SqlCommand("SELECT * FROM KUNDEN ORDER BY KDNUMMER", sqlConnection)) { using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { listeKundenDaten.Add( new KundenDaten( reader["KDNUMMER"].ToString(), //KundenNummer PK reader["KDOPVA"].ToString(), //Offene Vorgaenge reader["KDBRUTTO"].ToString(), //Bruttopreise reader["KDOPRG"].ToString(), //Offene Posten reader["KDEMTRWEG"].ToString(), //Transportweg reader["KDPREISKZ"].ToString(), //Preis reader["KDVANUMMER"].ToString(), //Versandanschrift reader["KDVERSICH"].ToString(), //Versicherung reader["KDWSNAME"].ToString(), //Benutzer reader["KDWSZEIT"].ToString() //Zeit )); } } } } foreach (KundenDaten kundenDaten in listeKundenDaten) { listBox.Items.Add(kundenDaten.GetCSVSatz()); } } public void NeuenKundenSpeichern(KundenDaten kundenDaten, ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); string sqlAnweisung; SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlAnweisung = string.Format("INSERT INTO KUNDEN(KDNUMMER, KDOPVA, KDBRUTTO, KDOPRG, KDEMTRWEG, KDPREISKZ, KDVANUMMER, KDVERSICH, KDWSNAME, KDWSZEIT) VALUES ( '{0}', '{1}', '{2}','{3}', '{4}', '{5}', '{6}','{7}','{8}','{9}');", kundenDaten.KundenNummerPK, kundenDaten.OffeneVorgaenge.Replace(",", "."), kundenDaten.Bruttopreise, kundenDaten.OffenePosten.Replace(",", "."), kundenDaten.Transportweg, kundenDaten.Preis, kundenDaten.Versandanschrift, kundenDaten.Versicherung, kundenDaten.Benutzer, kundenDaten.Zeit); sqlCommand.CommandText = sqlAnweisung; sqlCommand.ExecuteNonQuery(); } } public void KundenDatenBearbeiten(KundenDaten kundenDaten, ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); string sqlAnweisung; SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlAnweisung = string.Format("UPDATE KUNDEN SET KDNUMMER = '{0}', KDOPVA = '{1}', KDBRUTTO = '{2}', KDOPRG = '{3}', " + "KDEMTRWEG = '{4}', KDPREISKZ = '{5}', KDVANUMMER = '{6}', KDVERSICH = '{7}', KDWSNAME = '{8}', KDWSZEIT = '{9}' ", kundenDaten.KundenNummerPK, kundenDaten.OffeneVorgaenge.Replace(",", "."), kundenDaten.Bruttopreise, kundenDaten.OffenePosten.Replace(",", "."), kundenDaten.Transportweg, kundenDaten.Preis, kundenDaten.Versandanschrift, kundenDaten.Versicherung, kundenDaten.Benutzer, kundenDaten.Zeit); sqlAnweisung += string.Format("WHERE KDNUMMER = '{0}';", kundenDaten.KundenNummerPK); sqlCommand.CommandText = sqlAnweisung; sqlCommand.ExecuteNonQuery(); sqlConnection.Close(); } } public void KundenDatenLoeschen(ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); SqlCommand sqlCommand = sqlConnection.CreateCommand(); sqlCommand.CommandText = "DELETE FROM KUNDEN " + "WHERE KDNUMMER = " + listBox.SelectedIndex.ToString() + ";"; sqlCommand.ExecuteNonQuery(); sqlConnection.Close(); } } public void LadeDatenInTextboxen(TextBox textBoxKundenNummerPK, TextBox textBoxOffeneVorgaenge, TextBox textBoxBruttopreise, TextBox textBoxOffenePosten, TextBox textBoxTransportweg, TextBox textBoxPreis, TextBox textBoxVersandanschrift, TextBox textBoxVersicherung, TextBox textBoxBenutzer, TextBox textBoxZeit, int index, ListBox listBox) { //Aufgabe: Parameter als objekt übergeben! Aber ich weiß nicht wie.. textBoxKundenNummerPK.Text = listeKundenDaten[index].KundenNummerPK; textBoxOffeneVorgaenge.Text = listeKundenDaten[index].OffeneVorgaenge; textBoxBruttopreise.Text = listeKundenDaten[index].Bruttopreise; textBoxOffenePosten.Text = listeKundenDaten[index].OffenePosten; textBoxTransportweg.Text = listeKundenDaten[index].Transportweg; textBoxPreis.Text = listeKundenDaten[index].Preis; textBoxVersandanschrift.Text = listeKundenDaten[index].Versandanschrift; textBoxVersicherung.Text = listeKundenDaten[index].Versicherung; textBoxBenutzer.Text = listeKundenDaten[index].Benutzer; textBoxZeit.Text = listeKundenDaten[index].Zeit; } */ /* public void KundenLesen(ListBox listBox) { using (SqlConnection sqlConnection = new SqlConnection(sqlPath)) { sqlConnection.Open(); listeKundenDaten.Clear(); listBox.Items.Clear(); using (SqlCommand command = new SqlCommand("SELECT * FROM KUNDEN ORDER BY KDNUMMER", sqlConnection)) { using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { listeKundenDaten.Add( new KundenDaten( reader["KDNUMMER"].ToString(), //KundenNummer PK reader["KDOPVA"].ToString(), //Offene Vorgaenge reader["KDBRUTTO"].ToString(), //Bruttopreise reader["KDOPRG"].ToString(), //Offene Posten reader["KDEMTRWEG"].ToString(), //Transportweg reader["KDPREISKZ"].ToString(), //Preis reader["KDVANUMMER"].ToString(), //Versandanschrift reader["KDVERSICH"].ToString(), //Versicherung reader["KDWSNAME"].ToString(), //Benutzer reader["KDWSZEIT"].ToString() //Zeit )); } } } } foreach (KundenDaten kundenDaten in listeKundenDaten) { listBox.Items.Add(kundenDaten.GetCSVSatz()); } } */ } } Das ist halt mein erstes Projekt, in dem ich mit einem Viewmodel arbeiten muss. Ich habe mir viele Tutorials angeguckt und durchgelesen, aber kriege mein Projekt nicht wirklich angepasst.
    Meine Frage: Seht ihr erste grundlegende Fehler in der erstellung des Viewmodels bzw. bei der Änderung der KundenDaten.cs? Wie soll ich am besten vorgehen als nächstes? Ich steh irgendwie total auf dem Schlauch.
     
    Liebe Grüße und eine gute Nacht
    Balboa44
  14. Like
    ihkaka hat eine Reaktion von FranziMüller erhalten in IPv6 in zwei Teilnetze aufteilen   
    /48 sagt, daß von links aus 48 bits der Netzanteil sind. Jetzt sollst du noch 2 weitere Subnetze erstellen und dafür brauchst du 1 Bit aus dem vierten Segment der Adresse.
    Das sind dann genau die 2 Subnetze: 
    0000(0 HEX)  => 2001:db8:affe:0000: /49 => 2001:db8:affe:: /49 1000 (8 HEX) => 2001:db8:affe:8000: /49  
     
     
  15. Like
    ihkaka hat eine Reaktion von Ts61 erhalten in JSON Newtonsoft   
    Nochn Tip: Wenn du schon Newtonsoft.Json als NuGet benutzst kannst du auch CsvHelper für die Umwandlung in CSV nutzen. Das reduziert die Eigenprogrammierung und Kopfschmerzen erheblich. 🙃
  16. Like
    ihkaka hat eine Reaktion von Ts61 erhalten in JSON Newtonsoft   
    Also erster Schritt wäre überhaupt eine Json-Datei Deserialisieren und wieder Serialisieren zu können. Ich hätte mich da an die Newtonsoft-Doku gehalten.
    Das erste Problem ist du gibst den Pfad falsch an. Ich denke du hast schon dort den Fehler System.IO.FileNotFoundException bekommen (Deswegen fragt Whiz welcher Fehler überhaupt).
    Dann weiterhin ist dein Daten-Model und selbst der Aufbau der JSON-Datei kacke. Hier ich hab das für dich gefixt:
     
    Damit sollte das Deserialisieren und Serialisieren deiner Json-Datei klappen.
    Um das Ganze noch ins CSV-Format zu serialisieren musst du eigene Funktionen schreiben. Aber bis dahin erstmal die basics richtig hinbekommen. Viel Spaß noch !
  17. Positiv
    ihkaka reagierte auf Estroya in IPv6 Subnetting   
    Gegeben ist das folgende Netz:
    2001:db8:AAAA:BB00:: /56
    Für 4 gleich große Subnetze verschiebt man den Präfix um 2 Bit (2²=4).
    56 + 2 = 58. Für jedes Subnetz erhält man also den /58.
    Schaut man sich jetzt den gegebenen Präfix in Binär an:
    0010 0000 0000 0001 : 0000 1110 1011 1000 : 1010 1010 1010 1010 : 1011 1011 0000 0000
    Hier zählt man jetzt die Bits ab und markiert die beiden Bits nach Bit Nummer 56.
    0010 0000 0000 0001 : 0000 1110 1011 1000 : 1010 1010 1010 1010 : 1011 1011 |00|00 0000
    Für 4 Subnetze bleiben praktischer weise nur diese 4 Optionen:
    0010 0000 0000 0001 : 0000 1110 1011 1000 : 1010 1010 1010 1010 : 1011 1011 |00|00 0000 => 2001:db8:AAAA:BB00:: /58
    0010 0000 0000 0001 : 0000 1110 1011 1000 : 1010 1010 1010 1010 : 1011 1011 |01|00 0000 => 2001:db8:AAAA:BB40:: /58
    0010 0000 0000 0001 : 0000 1110 1011 1000 : 1010 1010 1010 1010 : 1011 1011 |10|00 0000 => 2001:db8:AAAA:BB80:: /58
    0010 0000 0000 0001 : 0000 1110 1011 1000 : 1010 1010 1010 1010 : 1011 1011 |11|00 0000 => 2001:db8:AAAA:BBC0:: /58
    Ich hoffe das bringt Klarheit.
  18. Like
    ihkaka hat eine Reaktion von Tauwin erhalten in IPV6 Next Header   
  19. Danke
    ihkaka hat eine Reaktion von Bitschnipser erhalten in IPV6 Next Header   
  20. Like
    ihkaka reagierte auf mr_registry in FISI Sommer 2019 GA1 HS5 c) (Dauer von Download)   
    75 MiB = 78 643 200 Byte
    Anzahl der Byte geteilt durch MTU = 54236,6 = 54237 Pakete
    pro Paket 4mS Latenz = 21,7 Sek.
    Datenmenge geteilt durch Übertragung
    78 643 200 Byte geteilt durch 2 000 000 Byte/S = 39,32 Sek.
    Übertragung 39,32 Sek. plus Latenz 21,7 Sek. = 61.02 Sek.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...