Laden...

Forenbeiträge von sacoma Ingesamt 23 Beiträge

30.04.2023 - 14:30 Uhr

Hallo Palladin007,

ja, ich bin Anfänger - ich beschäftigte mich erst seit ca. 4 Monaten mit C# und WPF und mir ist klar, dass ich noch viel lernen muss... 😉

@all:
Danke an alle für Ihre hilfreichen Beiträge - mein Problem konnte ich mit eurer Hilfe lösen. 😄

LG,

sacoma

29.04.2023 - 18:34 Uhr

Hallo Palladin007,

Habe ich das richtig verstanden? Die ViewModel wird nicht instanziiert?
Aber was bedeutet dann die Zeile:

viewModel.Password = pwBox.Password;

im Code:

<PasswordBox PasswordChanged="PasswordBox_PasswordChanged"/>

private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
if (sender is not PasswordBox pwBox)
return;

if (DataContext is not MyViewModel viewModel)
return;

viewModel.Password = pwBox.Password;
}

"viewModel" scheint mir der Objekt-Variablen-Namen zu sein, der z.B. im Konstruktor mit "ViewModel viewModel = new ViewModel();" instanziiert wurde.

Ok, ich bin Anfänger, es kann sein, dass ich die Zeile falsch interpretiert habe.

LG,

sacoma

27.04.2023 - 21:51 Uhr

Hallo Leute,

danke für eure Meingung.

Mir fällt erst jetzt auf, dass ich vergessen hatte zuschreiben, dass in der ViewModel noch ein EventAggregator (vom Nuget-Paket "Prism") implementiert ist - das heißt, eine Instanzierung der ViewModel ist so nicht möglich...

LG,

sacoma

26.04.2023 - 19:17 Uhr

Hallo Leute,

nochmals danke für eure Beiträge.

Ich habe einen Freunde, der sich hobbymäßig auch mit C# und WPF beschäftigt. Er hatte mir folgendes vorgeschlagen:

Die in den WPF-PasswordBoxen eingegebene Passwörter im Code-Behind auslesen, auf Übereinstimmung prüfen und wenn alles richtig ist, Passwort verschlüsseln. Danach das verschlüsselte Passwort in einen unsichtbaren TextBlock auf der WPF-View übergeben.

Der unsichtbare TextBlock ist an einer Property aus dem ViewModel gebindet (Mode: TwoWay), so kann der verschlüsselte Passwort-String der ViewModel übergeben werden.

Was haltet ihr von dieser Lösung?

Bin auf eure Meinungen gespannt. 😉

LG,

sacoma

24.04.2023 - 21:14 Uhr

Hallo Leute,

danke für eure Beiträge - ich werde mir alles in ruhig ansehen und ausprobieren.

LG,

sacoma 😉

23.04.2023 - 19:00 Uhr

Hallo,

ich habe Palladin007's Idee umgesetzt.

Hier das Ergebnis:
Bei Textboxen funktioniert es gut. 
Aber bei PasswordBox funktioniert es nicht; der Grund: man kann die PasswordBox nicht auf eine Property in der ViewModel binden.

LG,

sacoma 😉

23.04.2023 - 11:49 Uhr

Hallo Palladin007,

man kann das alles nicht allein im WPF codieren, sondern braucht diese Properties im ViewModel...

OK, ich werde es mal umsetzen.

Danke für deine Antwort. 😉

LG,

sacoma

22.04.2023 - 20:52 Uhr

Hallo Leute,

ich will ein User-Login mit Registrierungs-Dialog programmieren.
Im Registrierungs-Dialog gibt es eine Textbox für den Usernamen und zwei Passwort-Textboxen für die Eingabe eines Passworts und für die Wiederholung des Passwortes.

Die Passwortbox für die Passwort-Wiederholung soll roten Hintergrund bekommmen, wenn das Passwort nicht mit dem aus dem 1. Passwortbox übereinstimmt und einen grünen Hintergrund, wenn wenn die Passwörter übereinstimmen.

Ich habe eine Lösung mittels Code-Behind-Programmierung gefunden, wollte aber wissen, ob das auch mit puren WPF-Xaml möglich ist.

Ich habe folgendes in der Xaml-Datei codiert:

             <StackPanel Width="200">
                   <Label Content="Passwort eingeben: " Margin="5,0"/>
                   <PasswordBox x:Name="pbxPwEingabe"  Margin="5,0"/>
                   <Label Content="Passwort wiederholen: " Margin="5,0"/>
                   <PasswordBox  x:Name="pbxPwWiederholen" Margin="5,0">
                       <PasswordBox.Style>
                           <Style TargetType="PasswordBox">
                               <Style.Triggers>
                                   <DataTrigger Binding="{Binding ElementName=pbxPwWiederholen, Path=Text}" 
                                   Value="{Binding ElementName=pbxPwEingabe, Path=Text}">
                                       <Setter Property="Background" Value="LightGreen"/>
                                   </DataTrigger>
                               </Style.Triggers>
                           </Style>
                       </PasswordBox.Style>
                   </PasswordBox>
                   <Button x:Name="btnRegistrieren" Content="Registrieren" Margin="5"/>
               </StackPanel>

Mein Problem: im Tag des "DataTrigger" wird das Attribut "Value" unterkringelt und es wird folgender Fehler in der Error-List angezeigt:

Error XDG0010 "Binding" ist keine gültige Auslöserbedingung... - ich habe die Fehlermeldung gegoogelt, aber nichts gefunden.

Ich weiß nur, dass ich in "Value" etwas anderes einfügen muss. Die Frage ist was?

Kann mir jemand helfen? - Danke für die Hilfe im Voraus. 😉

LG,

sacoma

14.04.2023 - 17:15 Uhr

Hallo Leute,

ich möchte mich nochmal für eure Hilfe bedanken.
Ich habe es geschafft die View wie gewünscht zu erstellen - ohne Code-Behind.

Danke an alle, die geholfen haben. 😃

LG,

sacoam 😉

06.04.2023 - 21:55 Uhr

Hallo Alf Ator,

danke auch für deinen Beitrag - ich werde mich auch mit deinem Ansatz befassen - teilweise habe ich schon eine Lösung für mein Problem erstellt - nur mit der Darstellung der Lagerplätze am richtigen Platz auf GUI hagte es noch, aber mit deiner Lösung, weiß ich wie ich auch das hinkriegen kann.

Vielen Dank nochmal für deine Mühe. 😄

LG,

sacoma 😉

05.04.2023 - 20:29 Uhr

Hallo Caveman,

danke für die konstruktive Antwort. 😃

Ich werde mich dann mal mit dem ItemsControl befassen... 😉

LG,

sacoma

05.04.2023 - 18:03 Uhr

Hallo FZelle,

dein Beitrag ist keine Antwort auf meine Frage - dass dies nicht so in WPF gedacht ist, ist mir selbst klar. Ich habe auch deshalb nach einer besseren Lösung gefragt.

Vielleicht sollte ich es anders formulieren:

Im DataGrid können Daten aus der Datenbank in einer Tabelle zeilenweise dargestellt werden.

Ich benötige eine andere, grafische Darstellung der Daten wie im Screenshot gezeigt.

LG,

sacoma

04.04.2023 - 20:49 Uhr

Hallo Leute,

ich bin, wie schon in meinen letzten Beitrag erwähnt, Anfänger in C# + WPF.

Ich arbeite seit ca. 3 Monaten in einer Firma, die mit C# und WPF Benutzer-Oberflächen (GUI) für Maschinen-Anlagen programmiert.

Momentan arbeite ich an der Ansicht (View) eines Programms für ein automatisch betriebenes Hochregallager.

Die View soll die Lagerplätze des Hochregallagers abbilden. Es sind über 400 Lagerplätze…

Es gibt eine Datenbank-Tabelle wo alle Lagerplätze (mit Infos, ob sie belegt sind oder nicht etc.) aufgelistet sind.

Jeder Lagerplatz ist in der View mittels einer Viewbox in einer bestimmten Reihenfolge/Anordnung dargestellt, die dem realen Hochregallager entspricht.

Die Viewbox beinhaltet ein Textblock mit der Lagerplatz-Nr.

Die Viewbox ist von einem Rahmen (Border) umgeben, das seine Farbe ändern soll, wenn der Lagerplatz, frei (grün), reserviert (gelb), belegt (rot) oder gesperrt (dunkelrot) ist.

Die über 400 Lagerplätze wollte ich (aus verständlichen Gründen) nicht von Hand in die WPF-Xaml-Datei eintragen, sondern habe sie im Code-Behind generieren lassen:

Zuerst wird eine Grid erstellt mit einer bestimmten Anzahl von Spalten und Zeilen, dann wird in eine Schleife mit Daten aus der Datenbank durchlaufen, in dem die Viewboxes mit den Textblock und Border erstellt werden. Die Lagerplatz-Nr. wird mittels Binding dem Textblock übergeben, das gleiche geschieht auch mit Farbe des Borders…

Allerdings gibt es nun Schwierigkeiten beim Data-Binding… Der Border ändert nicht wie gewünscht die Farbe… und ich frage mich, ob ich da auf den richtigen Weg bin oder als Anfänger das Pferd von hinten aufzäune…

Meine erste Frage lautet daher, ob es vielleicht eine bessere, schlauere Lösung in WPF gibt, die View zu erstellen… z.B.: irgendwie mit einem Data-Template in einem Xaml-Container, das in der Darstellung flexibler ist als DataGrid etc. von der ich als Anfänger nichts weiß.

Ich hänge ein Screenshot mit der hart gecodeten Darstellung der betreffenden View an, damit ihr eine Vorstellung habt wie das View aussehen soll...

Ich bin für alle Anregungen und Ideen dankbar.

LG,

sacoam

31.01.2023 - 21:50 Uhr

Hallo Leute,

danke nochmal für eure Hilfe am Wochenende.

Ich konnte das Problem endlich verstehen und einigermaßen gut lösen. 🙂

++Zum Verständnis: ++
Es gab tatsächlich zwei Klassen-Objekte (mit unterschiedlichen Datentypen; also von verschiedenen Klassen) je für Tab 1 und für Tab 2, die die betreffenden Daten bei sich abspeicherten. Zwar wurden die Sachen vom 1. Tab auch gleich in die DB abgespeichert, aber weil das Klasse-Objekt von Tab 2, die Daten nur beim Starten des Programms aus der DB einmalig abruft und speichert, gab es keine Aktualisierung.

Ich habe also im CodeBehind (in der xaml.cs-Datei) dafür gesorgt, dass auch während der Laufzeit, die beiden Klassen-Objekt ihre Daten abgleichen und ggf. austauschen.

Das klappt prima und ohne euch hätte ich das nicht so schnell geschafft.

Danke noch mal. 😉

LG,

sacoma

29.01.2023 - 19:32 Uhr

Hallo Leute,

ich wollte euch nur mitteilen, dass ich jetzt den Bogen raus habe mit dem Befüllen der ListBox.
Ich danke für eure Hilfe und Hinweise.😘

LG,

sacoma🙂

29.01.2023 - 19:08 Uhr

Hallo Leute,

ich danke euch für eure hilfreichen Posts.

Ich werde diesen Montag versuchen eure Ideen und Anregungen umzusetzen.😉

Ich denke aber, dass ihr mir den richtigen Weg gezeigt habt... danke nochmal. 😉

LG,

sacoma🙂

28.01.2023 - 17:17 Uhr

Hallo Abt,

danke für deine Antwort... aber... das "Observable Sammlung" (wie ich es hier im Bsp. genannt habe) wird nur einmal im Konstruktor der Klasse "IrgendeineViewModelKlasse" erstellt.
Wenn im ersten Tab ein neuer Ort eingetragen (sagen wir durch Eingabe in eine Textbox und Klicken eines Save-Buttons), wird eine Methode aufgerufen, die mit "Sammlung.Add(neuer Ort(...));" den neuen Ort der Eigenschaft hinzufügt (und in die Datenbank den neuen Datensatz abspeichert).

Das kann also nicht der Fehler sein. 😠


Mir fällt gerade auf, dass ich vergessen habe zu erwähnen, dass die "IrgendeineViewModelKlasse" das Interface "INotifyPropertyChanged" hat, das doch eigentlich dafür sorgen sollte, dass die View über Änderungen der Eigenschaft informiert wird.

Hier der korrigierte Code:



class IrgendeineViewModelKlasse  : INotifyPropertyChanged 
{
   private ObservableCollection<irgendeineKlasseAusDB> _sammlung;
   public ObservableCollection<irgendeineKlasseAusDB> Sammlung
  {
       get { return _sammlung;; }
       set
      {
          _sammlung = value;
          RaisePropertyChanged(nameof(Sammlung));
      }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  
  protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
  {
            if (PropertyChanged != null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
  }
[…]
} // Ende der Klasse

28.01.2023 - 14:38 Uhr

Hallo Leute,

ich arbeite seit ca. 4 Wochen bei einer Firma, die C# verwendet und muss ein Problem lösen.

Ich kann euch nicht den firmeninternen Code zeigen, aber das Problem in einem neutralen Beispiel beschreiben.

In dem neutralen Beispiel stellen wir uns vor, es gehe um eine Spedition bzw. Planung der zu fahrenden (Teil-)Strecken eines LKWs.
Auf einer Oberfläche gibt es 2 Tabs. In einem Tab werden die Stationen, die der Speditions-LKW anfahren soll, eingegeben (z.B.: Ort A, Ort B, Ort C etc.)
Im zweiten Tab werden die Teil-Strecken des LKWs eingegeben; das muss man sich so vorstellen:

  1. Datensatz: LWK fährt von Punkt A nach Punkt B
  2. Datensatz: LKW fährt von Punkt B nach Punkt D
  3. Datensatz: LKW fährt von Punkt D nach Punkt C

Die „von“- und „nach“-Angaben werden in Combo-Boxen ausgewählt.

Das Problem:
Wenn im 1. Tab ein neuer Ort hinzugefügt wird, dann erscheint dieser nicht in den Comboboxen des 2. Tab.
Erst beim Neustart des Programms erscheinen alle Orte in den Comboboxen.

Das Data-Binding erfolgt in der XAML (nicht im Code-Behind (xaml.cs-Datei)).

Hier ist ein beispielhafter Code-Ausschnitt der XAML-Datei (es wird ein „UserControl“ genutzt):


<ResourceDictionary>
<vm IrgendeineViewModelKlasse x:Key="Schluessel"/>
</ResourceDictionary>
[…]
<ComboBox ItemsSource="{Binding Source={StaticResource Schluessel}, Path=Sammlung}" 
SelectedValuePath="Id"
 DisplayMemberPath="Ortsname"
 SelectedValue="{Binding fromPos, Converter={StaticResource int32toInt16Converter}}" 
 Grid.Column="1" Grid.Row="2" Margin="0,0,10,0" />
[…]

Hier ist ein beispielhafter Code-Ausschnitt der betreffenden ViewModel-Datei ():


class IrgendeineViewModelKlasse {
private ObservableCollection<irgendeineKlasseAusDB> _sammlung;
 public ObservableCollection<irgendeineKlasseAusDB> Sammlung
 {
 get { return _sammlung;; }
 set
 {
 _sammlung = value;
 RaisePropertyChanged(nameof(Sammlung));
 }
 }
[…]
} // Ende der Klasse

Durch das Debuging habe ich herausgefunden, dass ein neuer Ort in der Datenbank und im Objekt von „IrgendeineViewModelKlasse“ bzw. in der Eigenschaft „Sammlung“ richtig abgespeichert werden. Aber der neue Ort wird trotzdem nicht in der betreffenden Combo-Box angezeigt - trotz des Data-Bindings!
Kann mir jemand vielleicht erklären, warum die Combo-Box nicht aktualisiert wird?

Danke für jede Hilfe im Voraus. 😉

LG,

sacoma🙂

23.01.2023 - 20:52 Uhr

Hallo Leute!

Vielen Danke für eure Antworten - ich werde mich dann mehr ins MVVM-Patter vertiefen...

Ich weiß, dasss ich noch viel lernen muss.😉

LG,

sacoma

22.01.2023 - 21:53 Uhr

Hallo Abt,

danke für die schnelle Antwort.

Ich muss wohl noch eine Menge lernen, denn leider verstehe ich nur die Hälfte von was du da geschrieben hast... 🙁
Wie schon geschrieben: ich bin Anfänger und das sind nur Übungen, um mich mit C# + WPF + DataBinding vertraut zu machen (das man die "ToString"-Methode so in der Praxis nicht nutzt ist mir klar 😉 ).

Wie wäre nun der richtige Weg um das Binding der Liste hinzubekommen?

Ich habe schon im Internet recherchiert, aber noch nichts gefunden... 😠

LG,

sacoma

22.01.2023 - 17:38 Uhr

Hallo Leute,

ich bin Anfänger in C# und mache gerade ein paar Übungen in DataBinding.
Textboxen im Konstruktor mit DataContext zu füllen, beherrsche ich schon gut...

Ich versuche gerade eine ListBox über DataContext mit Daten von Autos (Datentyp ObservableCollection) zu füllen. Leider wird nichts in der Vorschau oder beim Ausführen des Programms angezeigt. 😠
Bei 'ItemsSource="{Binding AutoListe}"' wird der Wert 'AutoListe' mit drei Punkten markiert und wenn ich mit der Maus drübergehen, erscheint die Quick-Info:

Fehlermeldung:
Für Binding "AutoListe" wurde kein DataContext gefunden.

Beim Ausführen des Programm kommt die Binding-Fehlermeldung:

Fehlermeldung:
Die Eigenschaft "AutoListe" wurde im Objekt vom Typ "ObservableCollection`1" nicht gefunden.

Ich habe keine Ahnung was ich falsch mache - bei den Textboxen lief alles einwandfrei...

Hat jemand eine Idee?
Danke für jede Hilfe im Voraus. 🙂

LG,

sacoma

PS:

Hier ist mein Code von der UI 'SubTemplates3.xaml':


<Window x:Class="NeuesFensterWPF.SubTemplates3"
        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:NeuesFensterWPF"
        mc:Ignorable="d"
        Title="DataTemplates" Height="400" Width="400">
    <Grid>
        <ListBox Name="MyListBox"  Margin="10" ItemsSource="{Binding AutoListe}">

        </ListBox>
    </Grid>
</Window>

Hier ist mein Code von der Code-Behind 'SubTemplates3.xaml.cs':


namespace NeuesFensterWPF
{
    /// <summary>
    /// Interaktionslogik für SubTemplates3.xaml
    /// </summary>
    public partial class SubTemplates3 : Window
    {
        public SubTemplates3()
        {
            InitializeComponent();
            ObservableCollection<Auto> AutoListe = new ObservableCollection<Auto>
            {
                new Auto() { Marke = "Audi", Modell = "R8", PS = 610, Logo = "Images/logo_audi.jpg" },
                new Auto() { Marke = "Bentley", Modell = "CS", PS = 630, Logo = "Images/logo_bentley.jpg" },
                new Auto() { Marke = "Lambo", Modell = "LP 700", PS = 700, Logo = "Images/logo_lambo.jpg" },
                new Auto() { Marke = "SEAT", Modell = "DSG", PS = 300, Logo = "Images/logo_seat.jpg" },
                new Auto() { Marke = "Skoda", Modell = "RS", PS = 230, Logo = "Images/logo_skoda.jpg" },
                new Auto() { Marke = "VW", Modell = "TDI 8", PS = 240, Logo = "Images/logo_vw.jpg" }
            };

            DataContext = AutoListe; 
        }
    }
}

Hier wäre noch der Code aus der Klasse 'Auto' falls es von Bedeutung ist:


namespace NeuesFensterWPF
{
    public class Auto
    {
        public string Marke { get; set; }
        public string Modell { get; set;}
        public int PS { get; set; }
        public string Logo { get; set; }

        public override string ToString()
        {
            //base.ToString();
            return $"Marke: {Marke} | Modell: {Modell} | Leistung: {PS} | Logo: {Logo}"; 
        }
    }
}


11.12.2022 - 19:47 Uhr

Danke, BerndFfm! 😘

Es funktioniert! 👍

Ich hoffe, dass ich mal bald Hilfestellung geben kann. 😉

LG,

sacoma

11.12.2022 - 17:58 Uhr

Hallo Leute, 🙂

ich bin erst seit diesen Jahr mit der Umschulung zur Fachinformatikerin für Anwendungsentwicklung fertig geworden und totale Anfänger mit C# und Visual Studio IDE.

Wegen Jobwechsel muss ich aber fit darin werden...

Deshalb habe ich mir Visual Studio 2022 installiert und angefangen die Grundlagen zu lernen.

Leider scheitere ich gerade daran ein Programm mit einer Datenbankverbindung zu coden.

Es kommt folgende Fehlermeldung bei der Zeile mit dem Code-Befehl "verbindung.Open();", wenn ich das Programm ausführe:

Fehlermeldung:
System.IO.FileNotFoundException
HResult=0x80070002
Nachricht = Could not load file or assembly 'System.Security.Permissions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Das System kann die angegebene Datei nicht finden.
Quelle = MySql.Data
Stapelüberwachung:
bei MySql.Data.MySqlClient.MySqlConnection.AssertPermissions()
bei MySql.Data.MySqlClient.MySqlConnection.Open()
bei datenbank.Program.Main(String[] args) in C:\Users\HP\source\repos\datenbank\datenbank\Program.cs: Zeile30

Ich verstehe nicht, warum Visual Studio die Datei nicht findet, ich habe den Verweis unter Menü "Projekt -> Projektverweis hinzufügen..." folgenden Pfad hinzugefügt: "C:\Program Files (x86)\MySQL\Connector NET 8.0\Assemblies\v4.8\MySql.Data.dll"

Hier ist mein Code:



using MySql.Data.MySqlClient;

namespace datenbank
{
    internal class Program
    {
        static void Main(string[] args)
        {

            string verbindungsdaten = "SERVER=localhost;" + "DATABASE=db;" + "UID=admin;" + "PASSWORD=4d1nP4??w0rt;";
            
            MySqlConnection verbindung = new MySqlConnection(verbindungsdaten);
             
            Console.Write("Geben Sie bitte die Artikelnr. ein: ");
            int artikelnummer = int.Parse(Console.ReadLine());
            Console.WriteLine("Geben Sie bitte den Fahrradtyp ein: ");
            string typ = Console.ReadLine();
            Console.WriteLine("Geben Sie bitte die Farbe ein: ");
            string farbe = Console.ReadLine();
            Console.WriteLine("Geben Sie bitte den Preis ein: ");
            double preis = double.Parse(Console.ReadLine());

            string befehl = "INSERT INTO fahrraeder VALUES (" + artikelnummer + " , '" + typ + "', '" + farbe + "', " + preis +");";

            MySqlCommand befehlsobjekt = new MySqlCommand(befehl);
            befehlsobjekt.Connection = verbindung;

            verbindung.Open();
            befehlsobjekt.ExecuteNonQuery();
            verbindung.Close();

            string befehl2 = "SELECT * FROM fahrraeder;";
            MySqlCommand befehlsobjekt2 = new MySqlCommand(befehl2);
            
            befehlsobjekt2.Connection = verbindung;

            MySqlDataReader Reader;
            
            verbindung.Open();
            Reader = befehlsobjekt2.ExecuteReader();

            while (Reader.Read())
            {
                string zeile = "";
                for (int i =0; i < Reader.FieldCount; i++)
                {
                    zeile += Reader.GetValue(i).ToString() + " ";
                    Console.WriteLine(zeile);
                }
             }
            verbindung.Close();
        }
    }
}


Ich hoffe, dass mir hier jemand helfen kann, denn im Internet habe ich nichts zu meinem Problem gefunden.
Vielen Dank im Voraus. 😉

LG,

sacoma