Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Sascha87
Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Gut, dann anders.

Wenn ich die Methode von Th69 richtig verstehe, wird nur der Wert an die URL gehängt, der auch gefüllt ist, richtig?

Ich bekomme auf der anderen Seite dann Schwierigkeiten. Das Script auf dem Server erwartet genau die URL.
Woher soll das Script denn wissen, wenn die Werte in einer ganz anderen Reihenfolge versendet werden?

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Gibt es die Möglichkeit, wenn ich keinen Wert habe, dass dann "-" gesetzt wird?

Auch, wenn es nicht der Ansicht von Abt entspricht, finde ich den Weg ganz gut. So hätte ich keine leeren Felder in der DB und beim auslesen habe ich direkt ein Zeichen in der Liste, das zeigt, dass dort keine Werte vorhanden sind und ergänzt werden müssen.
Denn genau das Zeichen setze ich so oder so als


TargetNullValue=-

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Leider nein. Mir würde ein Default Value wie "-" reichen.

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Du hast recht, die Methode wird immer aufgerufen.

Mein RestAPI Link wird nur nicht korrekt gefüllt. Daher gibt es auch keine Einträge in der Datenbank.

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Vielen lieben Dank Th69!
Soweit klappt alles.
Das Einzige, das mir aufgefallen ist, der Speichert die Daten erst in der Datenbank, wenn man alle Zellen einmal angeklickt hat.
Manche Zellen sollen zwischendurch leer bleiben. Wäre das in der Umsetzung noch möglich? Oder muss ich eher auf CellEditEnding gehen?

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Das hatte ich ursprünglich. Leider bekomme ich beim JSon Objekten Probleme:


var arr = JsonConvert.DeserializeObject<JArray>(restResponse.Content);
                    foreach (JObject obj in arr)
                    {
                        var KompetenzID = (string)obj["id"];
                        var Kompetenz = (string)obj["Kompetenz"];
                        var SHDID = (string)obj["SHDID"];
                        var Ergebnis = (string)obj["Ergebnis"];
                        var Stufe = (string)obj["Stufe"];
                        var Niveau = (string)obj["Niveau"];
                        var Note = (string)obj["Note"];
                        DateTime Datum = (DateTime)obj["Datum"];
                        var Kuerzel = (string)obj["Kuerzel"];
                        var background = (string)obj["background"];

                        _kompetenzen.Add(new LDKompetenz(KompetenzID, Kompetenz, SHDID, Ergebnis, Stufe, Niveau, Note, Datum, Kuerzel, background, name, ViewFingerPrint));
                    }

Ich habe Tabelle 1 mit 20 Daten. In Tabelle 2 habe ich die Nutzerinformationen dazu. Nicht zu jeder Zeile aus Tabelle 1 gibt es Nutzerdaten. Daher kann es passieren, dass DateTime Datum = null ist.
Dann bekomme ich eine Fehlermeldung (siehe Bild).

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Vielen vielen Dank! Mein Verständnis erweitert sich und es funktioniert fast.

Ein einziges Problem habe ich noch. Das Datum gebe ich als String weiter.

Den string ändere ich ab, damit es kein Backslash im string ist


var newdate = Datum.Replace(@"/", "-");

Allerdings lässt er die Uhrzeit. Wie bekomme ich die wohl weg?

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Zitat von T-Virus
Nachträglich noch der Tipp:
Wenn du Strings hardcoden musst, dann macht das über Konstanten.
Literale im Code sind eine sehr unschöne Sache und gehen auch bei einigen Umsetzungen auch in Richtung Magic Strings.

Auch wäre es besser wenn du anstelle von "" als Wert String.Empty verwendest.
Durch "" im Code erzeugst du zusätzliche Literale, was die Laufzeitumgebung zwar abfängt aber durch String.Empty wird eine statische Instanz verwendet und der Code ist auch klarer ausgedrückt.

Auch würde ich empfehlen die Deserialierung des Json umzubauen.
Was du im Grund hast, ist eine Liste von Objekten.
Du kannst hier einfach List<T> als Container verwenden und eine entsprechende Klasse anlegen, die ein einzelnes Objekt der Api abbildet.
Dadurch sparst du dir den Aufwand die Eigenschaften einzeln auslesen und die Liste selbst aufbauen zu müssen.
Kann an der Stelle der Deseralisierer übernehmen.
Spart dir unnötigen Aufwand und Zeit bei der Umsetzung

T-Virus

Ok, danke für die Tipps! Dann werde ich mir mal anschauen wie es mit den Listen funktioniert.

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Ok, das teste ich mal.

Ich benötige noch die Variabel "Name" aus der ViewModel. Das ist eine TextBox aus der View.

Dazu habe ich folgendes in der ViewModel:


        private string _name = "1";
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                if (value == "" && value == null)
                    return;
                _name = value;
                LDKompetenzen = LDKompetenzen.Load(LDCurrentFach.FachID, LDCurrentThema.ThemaID, ViewFingerPrint, Name);
                OnPropertyChanged(ref _name, value);
            }
        }

Kann ich es ganz normal mit Name {get set} in der LDKompetenz laden?

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Das ist hier meine Klasse:



class LDKompetenzen : ObservableCollection<LDKompetenz>
    {
        private static readonly LDKompetenzen _kompetenzen = new LDKompetenzen();

        private LDKompetenzen() { }

        public static LDKompetenzen Load(string fachID, string themenID, string ViewFingerPrint, string name)
        {
            _kompetenzen.Clear();
            try
            {
                var client = new RestClient("MEINEDOMAIN");

                var request = new RestRequest("ld/kompetenzen/{fachid}/{themenid}/{SHDID}", Method.GET)
                .AddHeader("Authorization", "Bearer " + ViewFingerPrint)
                .AddUrlSegment("fachid", fachID)
                .AddUrlSegment("SHDID", name)
                .AddUrlSegment("themenid", themenID);

                IRestResponse restResponse = client.Execute(request);
                HttpStatusCode statusCode = restResponse.StatusCode;
                if ((int)statusCode != 401)
                {
                    var arr = JsonConvert.DeserializeObject<JArray>(restResponse.Content);
                    foreach (JObject obj in arr)
                    {
                        var KompetenzID = (string)obj["id"];
                        var Kompetenz = (string)obj["Kompetenz"];
                        var SHDID = (string)obj["SHDID"];
                        var Ergebnis = (string)obj["Ergebnis"];
                        var Stufe = (string)obj["Stufe"];
                        var Niveau = (string)obj["Niveau"];
                        var Note = (string)obj["Note"];
                        var Datum = (string)obj["Datum"];
                        var Kuerzel = (string)obj["Kuerzel"];
                        var background = (string)obj["background"];

                            _kompetenzen.Add(new LDKompetenz(KompetenzID, Kompetenz, SHDID, Ergebnis, Stufe, Niveau, Note, Datum, Kuerzel, background));
                    }
                }
                else
                {
                    var KompetenzID = "0";
                    var Kompetenz = "";
                    var SHDID = "";
                    var Ergebnis = "";
                    var Stufe = "";
                    var Niveau = "";
                    var Note = "";
                    var Datum = "";
                    var Kuerzel = "";
                    var background = "white";

                    _kompetenzen.Add(new LDKompetenz(KompetenzID, Kompetenz, SHDID, Ergebnis, Stufe, Niveau, Note, Datum, Kuerzel, background));
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
            return _kompetenzen;
        }
    }

Und die greift auf folgende zu:



        public LDKompetenz(string kompetenzID, string kompetenz, string shdID, string ergebnis, string stufe, string niveau, string note, string datum, string kuerzel, string background)
        {
            KompetenzID = kompetenzID;
            Kompetenz = kompetenz;
            SHDID = shdID;
            Ergebnis = ergebnis;
            Stufe = stufe;
            Niveau = niveau;
            Note = note;
            Datum = datum;
            Kuerzel = kuerzel;
            Background = background;
        }

        //Anzeige Fördermaßnahmen
        public string KompetenzID { get; set; }
        public string Kompetenz { get; set; }
        public string SHDID { get; set; }
        public string Ergebnis { get; set; }
        public string Stufe { get; set; }
        public string Niveau { get; set; }
        public string Note { get; set; }
        public string Datum { get; set; }
        public string Kuerzel { get; set; }
        public string Name { get; set; }
        public string Background { get; set; }

        public bool IsSelected { get; set; }

        public override string ToString()
        {
            return $"{Kompetenz}";
        }
    }

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Ok, dann habe ich das falsch verstanden.

Die LDKompetenzen hole ich so in das ViewModel:


public LDKompetenzen LDKompetenzen { get; set; }

So lade ich die "Current" Version:


LDKompetenz _ldcurrentKompetenz = null;
        public LDKompetenz LDCurrentKompetenz
        {
            get { return _ldcurrentKompetenz; }
            set
            {
                if (value == null)
                    return;
                OnPropertyChanged(ref _ldcurrentKompetenz, value);
            }
        }

So lade ich die Daten in die View:


LDKompetenzen = LDKompetenzen.Load(LDCurrentFach.FachID, value.ThemaID, ViewFingerPrint, Name);

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Das ist meine ViewModel.
In deinem Beispiel sowie unzählige andere wurde es dort implementiert.

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Also, folgendes habe ich gemacht:

ViewModel:
Die Klasse erweitert:


class LDViewModel : NotifyPropertyBase, IEditableObject

Anschließend folgendes gefüllt:


    public void EndEdit()
        {
            var client = new RestClient("https://xxxxxxxxde/");
            var request = new RestRequest("ld/LDUpdate/{name}/{kompetenzID/{ergebnis}/{stufe}/{niveau}/{note}/{datum}/{kuerzel}", Method.POST)
                .AddUrlSegment("name", Name)
                .AddUrlSegment("kompetenzID", LDCurrentKompetenz.KompetenzID)
                .AddUrlSegment("ergebnis", LDCurrentKompetenz.Ergebnis)
                .AddUrlSegment("stufe", LDCurrentKompetenz.Stufe)
                .AddUrlSegment("niveau", LDCurrentKompetenz.Niveau)
                .AddUrlSegment("note", LDCurrentKompetenz.Note)
                .AddUrlSegment("datum", LDCurrentKompetenz.Datum)
                .AddUrlSegment("kuerzel", LDCurrentKompetenz.Kuerzel)
                .AddHeader("Authorization", "Bearer " + ViewFingerPrint);

            IRestResponse restResponse = client.Execute(request);

            if (restResponse.StatusCode == HttpStatusCode.BadRequest)
            {
                MessageBox.Show("Irgendetwas stimmt mit der Verbindung nicht.");
            }
            else
            {
                MessageBox.Show("Die Leistungsdokumentation wurde erfolgreich aktualisiert.");
            }
        }

Allerdings reagiert er nicht. Woher weiß er, welches DataGrid gemeint ist?

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Genau, die Klasse ist als ObservableCollection deklariert. In diese Klasse kann ich dann eine weitere Methode mit IEditableObject einfügen?
Es tut mir Leid, es ist Neuland für mich

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Ich weiß nicht was mich da geritten hat.....4.7.2 meine ich.

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Vielen Dank für die Links.
Beim ersten Link: Ich nutze .NET 4,75 (Galasoft geht nur bis 4.5). Daher kann ich keine "Galasoft WPF" hinzufügen.

Link 2: Ich nutze in meiner ViewModel INotifyPropertyChanged.

Funktioniert es, wenn ich eine entsprechende Funktion in die Viewmodel schreibe mit IEditableObject?

Thema: Daten aus DataGrid per RestAPI speichern
Am im Forum: GUI: WPF und XAML

Verwendetes Datenbanksystem: MariaDB
Verwendete API: RestSharp

Hallo zusammen,
erneut habe ich eine Frage.
Aktuell lade ich einige Daten per RestApi in ein DataGrid. Die Anzeige, der darin enthaltenen Daten funktioniert soweit ganz gut.
Jetzt möchte ich die einzelnen Zeilen abändern und automatisch in der Datenbank speichern können.
Das speichern sollte ebenfalls mittels RestSharp funktionieren.

Nur, wie gehe ich da am besten vor? Wie bekomme ich die Inhalt der einzelnen Zeilen eines DataGrid.
Wie speichere ich den geänderten Wert automatisch? Oder geht es nur per Button?

Hier mein Code:


<DataGrid ItemsSource="{Binding LDKompetenzen}" AutoGenerateColumns="False" CanUserDeleteRows="False" CanUserAddRows="False" CanUserSortColumns="True" FontSize="12" Height="Auto" BorderThickness="0">
                <DataGrid.Resources>
                    <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}" >
                        <Setter Property="Background" Value="LightGray" />
                        <Setter Property="Foreground" Value="Black" />
                        <Setter Property="BorderBrush" Value="Black"/>
                        <Setter Property="BorderThickness" Value="1 1 1 1"/>
                        <Setter Property="Margin" Value="-1,-1,0,0" />
                        <Setter Property="Height" Value="28" />
                        <Setter Property="Width" Value="auto"/>
                        <Setter Property="HorizontalContentAlignment" Value="Center"/>
                        <Setter Property="FontWeight" Value="SemiBold"/>
                        <Setter Property="FontStyle" Value="Italic"/>
                        <Setter Property="FontSize" Value="15"/>
                        <Setter Property="Padding" Value="15,0,15,0"/>
                    </Style>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Kompetenz" Binding="{Binding Kompetenz}" IsReadOnly="True">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="TextBlock.Background" Value="{Binding Background}" />
                                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                <Setter Property="VerticalAlignment" Value="Stretch"/>
                                <Setter Property="TextAlignment" Value="Center"/>
                                <Setter Property="Padding" Value="0,20,0,0"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTemplateColumn Header="Farben" IsReadOnly="True">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
                                    <Button Content="" Background="White" Margin="2" Padding="5,3,5,3"></Button>
                                    <Button Content="" Background="Yellow" Margin="2" Padding="5,3,5,3"></Button>
                                    <Button Content="" Background="LightGreen" Margin="2" Padding="5,3,5,3"></Button>
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="Stufe" Binding="{Binding Stufe, UpdateSourceTrigger=LostFocus, Mode=TwoWay}" >
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Niveau" Binding="{Binding Niveau, UpdateSourceTrigger=LostFocus, Mode=TwoWay}">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Ergebnis" Binding="{Binding Ergebnis, UpdateSourceTrigger=LostFocus, Mode=TwoWay}">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Note" Binding="{Binding Note, UpdateSourceTrigger=LostFocus, Mode=TwoWay}">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTemplateColumn Header="Datum">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <DatePicker SelectedDate="{Binding Datum, UpdateSourceTrigger=LostFocus, Mode=TwoWay}" BorderThickness="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="Kürzel" Binding="{Binding Kuerzel, UpdateSourceTrigger=LostFocus, Mode=TwoWay}">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>


Ich bin für einige Gedankenansetze von euch sehr Dankbar!

Grüße
Sascha

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Es ging mir nur im meinen letzten Post und nicht um den kompletten Thread. Ich hatte ursprünglich eine Frage gestellt die sich erledigt hat.

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien


Es hat sich erledigt. Post bitte löschen.

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Vielen Dank für die vielen Tipps! Ich werde mir das ganze anschauen und mein Script entsprechend anpassen.

Ich bin aktuell bei der Authentifizierung und Autorisierung.

In C# nutze ich RestSharp.

Mit:


var client = new RestClient("http://example.com");
client.Authenticator = new SimpleAuthenticator("username", "foo", "password", "bar");

var request = new RestRequest("resource", Method.GET);
client.Execute(request);

schicke ich die Anfrage an den Server und bekommen die Info, ob die Anmeldedaten passen, zurück. Soweit verständlich.

Auf der anderen Seite nutze ich Lumen (Laravel). Dort muss ich die Daten annehmen und prüfen. Es gibt grundsätzlich bei mir keine Useraccounts. Soll ich extra eine Tabelle anlegen und mit dieser vergleichen? Macht das Sinn?

Wenn ich in RestSharp den Benutzername und das Passwort einfüge, kann das Programm nicht dennoch "ausgelesen" werden und die Zugangsdaten sind offen?

Über hilfreiche Tipps wäre ich sehr Dankbar!
Liebe Grüße und einen schönen Sonntag noch!
Sascha

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Das war der passende Tipp, vielen lieben Dank!

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Vielen Dank für deine Tipp!
Die Authentifizierung kommt später. Als Anfänger baue ich eins nach dem anderen aus. Es muss für mich erst die Grundfunktion klappen bevor ich es "zubaue".
Ich weiß, eine seltsame Herangehensweise, aber so lerne ich am besten.

Ich habe jetzt, mittels json_encode die Daten umgewandelt.


[url]https://api.heinrich-luebke-schule.de/api/faecher[/url]

Leider kommt der gleiche Fehler.

Wie genau prüfst du, ob die Daten als json zurück geliefert werden?

Liebe Grüße
Sascha

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Hallo zusammen,
vielen Dank für eure Hilfestellungen, die haben mich schon etwas voran gebracht.

Aktuell habe ich es hinbekommen, dass Daten per URL angezeigt werden. Allerdings als array object und nicht als JSON.

Hat jemand von euch die Daten aus einem Array weiter verarbeitet?

Ich habe es mit JObject versucht, da ich zuerst dachte die Daten würden als JSON weitergegeben werden.


var client = new RestClient("https://daustausch.heinrich-luebke-schule.de/ReadAPI/faecher");
                var request = new RestRequest(Method.GET);
                

                IRestResponse restResponse = client.Execute(request);

                string response = restResponse.Content;
                var jObject = JObject.Parse(restResponse.Content);

                string fachID = jObject.GetValue("id").ToString();
                string fach = jObject.GetValue("fach").ToString();

                _faecher.Add(new Fach(fachID, fach));

Die Daten werden bis hier hin erfolgreich geladen:
string response = restResponse.Content;

Nachdem er es Parsen soll, sagt er das es nicht das richtige Format sei (logisch).

Ich nutze das "Slim Framework" zum Auslesen der Datenbank und Bereitstellung.
Eventuell gibt es noch eine Alternative, dass Array weiter zu verarbeiten?

Liebe Grüße und vielen Dank!
Sascha

Thema: RestAPI oder vergleichbares
Am im Forum: Datentechnologien

Verwendetes Datenbanksystem: MySQL (MariaDB)

Hallo zusammen,
aktuell greife ich auf eine entfernte Datenbank zu. Ich würde gerne davon weg kommen und suche aufgrund dessen eine Alternative.
Jetzt habe ich öfters gelesen, dass eine RestAPI dafür gut sein soll. Auf der Suche via Google bin ich auf RestSharp gestoßen.

Kann jemand RestSharp empfehlen oder empfiehlt generell etwas anderes als eine RestAPI?

Liebe Grüße
Sascha

Thema: MySQL Where mit Wert aus WPF übergeben
Am im Forum: Datentechnologien

Super, vielen lieben Dank an euch! Ich bin zumindest ein Schritt weiter. Auch was das Verständnis angeht. Aber leider gibt es direkte das nächste Problem.

Aktuell gebe ich alle Werte aus und werden angezeigt. Ich habe an den ListBoxen/ComboBoxen SelectedIndex="0". Dadurch werden die ersten Werte angezeigt. Sobald ich das Fach wechsel, bekomme ich die Meldung

Fehler
System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

"value" war "null".

Zum Verständnis habe ich ein Bild angehängt. Die Frage ist, wie bekomme ich es hin, dass er die Nachfolgenden ComboBoxen/ListBoxen aktualisiert bzw. den Index auf 0 setzt?


meine ViewModel.cs:


class ViewModel : NotifyPropertyBase
    {

        public Faecher Faecher { get; set; }
        public Jahrgaenge Jahrgaenge { get; set; }
        public UVorhabens UVorhabens { get; set; }
        public Kompetenzen Kompetenzen { get; set; }
        public Foerdermaßnahmen Foerdermaßnahmen { get; set; }
        public ICommand RefreshCommand { get; set; }
        public Fach SelectedFachID { get; set; }


        Fach _currentFach = null;
        public Fach CurrentFach
        {
            get { return _currentFach; }
            set
            {
                Jahrgaenge = Jahrgaenge.Load(value.FachID);
                OnPropertyChanged(ref _currentFach, value);
            }
        }

        Jahrgang _currentJahrgang = null;
        public Jahrgang CurrentJahrgang
        {
            get { return _currentJahrgang; }
            set
            {
                UVorhabens = UVorhabens.Load(CurrentFach.FachID, value.JahrgangID);
                OnPropertyChanged(ref _currentJahrgang, value);
            }
        }

        Unterrichtsvorhaben _currentUVorhaben = null;
        public Unterrichtsvorhaben CurrentUVorhaben
        {
            get { return _currentUVorhaben; }
            set
            {
                Kompetenzen = Kompetenzen.Load(CurrentJahrgang.JahrgangID, value.UvID);
                OnPropertyChanged(ref _currentUVorhaben, value);
            }
        }

        Foerdermaßnahme _currentFoerdermaßnahme = null;
        public Foerdermaßnahme CurrentFoerdermaßnahme
        {
            get { return _currentFoerdermaßnahme; }
            set
            {
                Foerdermaßnahmen = Foerdermaßnahmen.Load(CurrentJahrgang.JahrgangID, CurrentUVorhaben.UvID);
                OnPropertyChanged(ref _currentFoerdermaßnahme, value);
            }
        }

        public ViewModel()
        {
            Faecher = Faecher.Load();
            RefreshCommand = new DelegateCommand(OnRefresh, OnCanRefresh);
        }

        private bool OnCanRefresh(object parameter)
        {
            return NetworkInterface.GetIsNetworkAvailable();
        }

        private void OnRefresh(object parameter)
        {
            Faecher = Faecher.Load();
            Jahrgaenge = Jahrgaenge.Load(CurrentFach.FachID);
            UVorhabens = UVorhabens.Load(CurrentFach.FachID, CurrentJahrgang.JahrgangID);
            Kompetenzen = Kompetenzen.Load(CurrentUVorhaben.UvID, CurrentJahrgang.JahrgangID);
            Foerdermaßnahmen = Foerdermaßnahmen.Load(CurrentUVorhaben.UvID, CurrentJahrgang.JahrgangID);
        }
    }

Es tut mir Leid, dass ich euch öfters Frage. Ich google auch vorher, wenn ich einen Ansatz habe. Aber irgendwie funktioniert kein Beispiel, dass ich gefunden habe.

Thema: MySQL Where mit Wert aus WPF übergeben
Am im Forum: Datentechnologien

@TH69

Zitat
Dann mußt du auch die Auswahl der ComboBox (SelectedValue) als ViewModel-Eigenschaft erstellen (und per XAML binden) und diese dann in den weiteren ViewModel-Methoden verwenden.

Hättest du ein Beispiel- Code für mich?

Zitat
Außerdem solltest du dir auch mal [Artikel] Drei-Schichten-Architektur durchlesen: Datenbankabfragen sollten nicht im ViewModel (Logik) durchgeführt werden, sondern in einer eigenen Datenzugriffsklasse (-schicht).
Die Datenbankabfrage findet nicht in der ViewModel statt.

Zitat
Und sowohl MySqlCommand als auch MySqlDataReader sollten per using-Anweisung umschlossen sein - dann benötigst du auch kein manuelles Close() mehr.

Wird gemacht.

@Chilic
Zitat
Lösung: Gib den zu suchenden Wert als Parameter in die Methode Load() hinein.

Ich frage nur ungern, aber kannst du mir ein Beispiel geben?

Ich bin euch unendlich Dankbar für eure Hilfe!

Thema: MySQL Where mit Wert aus WPF übergeben
Am im Forum: Datentechnologien

Ok, einmal von vorn.

Ich habe folgende Klassen:

Fach.cs


public class Fach
    {
        public Fach(string fachID, string fach)
        {
            FachID = fachID;
            FachName = fach;
        }

        //Anzeige Fächer
        public string FachID { get; set; }
        public string FachName { get; set; }

        public override string ToString()
        {
            return $"FachID:{FachID},Fach:{FachName}";
        }

        internal void Add(Fach fach)
        {
            throw new NotImplementedException();
        }
    }

Faecher.cs


public class Faecher : ObservableCollection <Fach>
    {
        private static Faecher _faecher = new Faecher();
        private Faecher() { }
        public static Faecher Load()
        {
            _faecher.Clear();
                 using (var sqlConnection = new MySqlConnection(Properties.Settings.Default.DBConnectionString))
                {
                    sqlConnection.Open();
                    //Daten aus der Tabelle lesen
                    string query = "select * from faecher order by fach asc";
                    MySqlCommand cmd = new MySqlCommand(query, sqlConnection);
                    
                    MySqlDataReader reader = cmd.ExecuteReader();

                    //Daten in fachtable füllen
                    while (reader.Read())
                    {
                        string fachID = reader.GetString("id");
                        string fach = reader.GetString("fach");

                        _faecher.Add(new Fach(fachID, fach));
                    }
                    reader.Close();
                    sqlConnection.Close();
            }
            return _faecher;
        }
    }

ViewModel.cs


class ViewModel : NotifyPropertyBase
    {
        public Faecher Faecher { get; set; }
        public Jahrgaenge Jahrgaenge { get; set; }

        public ICommand RefreshCommand { get; set; }

        public ViewModel()
        {
            Faecher = Faecher.Load();
            Jahrgaenge = Jahrgaenge.Load();
            RefreshCommand = new DelegateCommand(OnRefresh, OnCanRefresh);
        }

        private bool OnCanRefresh(object parameter)
        {
            return NetworkInterface.GetIsNetworkAvailable();
        }

        private void OnRefresh(object parameter)
        {
            Faecher = Faecher.Load();
            Jahrgaenge = Jahrgaenge.Load();
        }
    }


Die Übergabe an das WPF damit funktioniert super. Die Fächer (Fächer-Name) und die Fach ID wird übergeben und angezeigt. Jetzt möchte ich, dass die ID, nach der Auswahl der ComboBox an die
Jahrgaenge.cs übergeben wird mit folgendem Inhalt:


class Jahrgaenge : ObservableCollection <Jahrgang>
    {
        private static Jahrgaenge _jahrgaenge = new Jahrgaenge();

        private Jahrgaenge() { }

          public static Jahrgaenge Load()
        {
            _jahrgaenge.Clear();
            using (var sqlConnection = new MySqlConnection(Properties.Settings.Default.DBConnectionString))
            {
                sqlConnection.Open();
                //Daten aus der Tabelle lesen
                

                string query = "select * from jahrgang a inner join faecherJahrgang fj on a.id = fj.jahrgangID where fj.faecherID = @fachID";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

                cmd.Parameters.AddWithValue("@fachID", listFach.SelectedValuePath);

                MySqlDataReader reader = cmd.ExecuteReader();

                //Daten in fachtable füllen
                while (reader.Read())
                {
                    string jahrgangID = reader.GetString("id");
                    string jahrgang = reader.GetString("jahrgang");

                    _jahrgaenge.Add(new Jahrgang(jahrgangID, jahrgang));
                }
                reader.Close();
                sqlConnection.Close();
            }
            return _jahrgaenge;
        }
    }

Ich hoffe, es bringt ein bischen mehr Licht ins dunkle. Ich bin "leider" noch Anfänger und probiere mich am MVVM Pattern.

Thema: MySQL Where mit Wert aus WPF übergeben
Am im Forum: Datentechnologien

Das hier übergebe ich an das WPF Formular. Die fachID kommt vor.


public static Faecher Load()
        {
            _faecher.Clear();
                 using (var sqlConnection = new MySqlConnection(Properties.Settings.Default.DBConnectionString))
                {
                    sqlConnection.Open();
                    //Daten aus der Tabelle lesen
                    string query = "select * from faecher order by fach asc";
                    MySqlCommand cmd = new MySqlCommand(query, sqlConnection);
                    
                    MySqlDataReader reader = cmd.ExecuteReader();

                    //Daten in fachtable füllen
                    while (reader.Read())
                    {
                        string fachID = reader.GetString("id");
                        string fach = reader.GetString("fach");

                        _faecher.Add(new Fach(fachID, fach));
                    }
                    reader.Close();
                    sqlConnection.Close();
            }
            return _faecher;
        }

Thema: MySQL Where mit Wert aus WPF übergeben
Am im Forum: Datentechnologien

Verwendetes Datenbanksystem: MySQL / MariaDB

Hallo zusammen,
ich bin aktuell dabei mein komplettes Script auf das MVVM Pattern umzuschreiben.
Es geht um dieses Projekt: Link

Die erste ComboBox fülle ich erfolgreich mit Werten aus der Datenbank per Databinding.


<ComboBox Name ="listFach" ItemsSource="{Binding Faecher}" SelectedIndex="0">
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock x:Name="FachID" Text="{Binding Path=FachID}" />
                                <TextBlock Text=" - " />
                                <TextBlock Text="{Binding Path=FachName}" />
                            </StackPanel>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>


Die FachID lasse ich mir aktuell anzeigen, soll später, wenn möglich, nicht Sichtbar sein.

Diese genannte FachID möchte ich wieder zurück übergeben, da ich den Wert für eine Select Abfrage benötige.


class Jahrgaenge : ObservableCollection <Jahrgang>
    {
        private static Jahrgaenge _jahrgaenge = new Jahrgaenge();

        private Jahrgaenge() { }

        public static Jahrgaenge Load()
        {
            _jahrgaenge.Clear();
            using (var sqlConnection = new MySqlConnection(Properties.Settings.Default.DBConnectionString))
            {
                sqlConnection.Open();
                //Daten aus der Tabelle lesen
                

                string query = "select * from jahrgang a inner join faecherJahrgang fj on a.id = fj.jahrgangID where fj.faecherID = fachID";

                MySqlCommand cmd = new MySqlCommand(query, sqlConnection);
                cmd.Parameters.AddWithValue("@fachID", FachID.Text);

                MySqlDataReader reader = cmd.ExecuteReader();

                //Daten in fachtable füllen
                while (reader.Read())
                {
                    string jahrgangID = reader.GetString("id");
                    string jahrgang = reader.GetString("jahrgang");

                    _jahrgaenge.Add(new Jahrgang(jahrgangID, jahrgang));
                }
                reader.Close();
                sqlConnection.Close();
            }
            return _jahrgaenge;
        }
    }

Der erkennt nicht den Verweis auf die Textbox "FachID" aus der XAML Datei. Daher sagt er mir:
Fehler
Der name "FachID" ist im aktuellen Kontext nicht vorhanden.


Ich wollte nicht zu viel Code posten. Sollte etwas fehlen, reiche ich es gerne nach.

Vielen lieben Dank und einen schönen Sonntag noch!
Grüße
Sascha

Thema: MySQL Select mit einem Insert innerhalb einer if -Anweisung gepaart.
Am im Forum: Datentechnologien

Ich hoffe, ich gehe euch nicht all zu sehr auf den Sack. Nach und nach verstehe ich es so langsam.

Die if Anweisung ist eine Möglichkeit, ich habe mir jetzt das "gegen Null" prüfen angeschaut.

Dazu habe ich folgende Methode erstellt:


public bool IsNullOrEmptyWertAusWPF(string wertAusWPF)
        {
            bool isempty;

            isempty =  wertAusWPF == null || wertAusWPF == string.Empty;
            
            return isempty;
        }
Wenn ich jetzt 2 verschiedene Typen habe, einmal int und einmal string, müsste ich die Methode genau danach ausrichten? Sprich 2 Methoden anlegen?


Das ganze im Event mit eingefügt:


private void BtnUvEintrag_Click(object sender, RoutedEventArgs e)
        {
            using (MySqlConnection connection = GetConnection())
            {
                
                    bool IsNullOrEmptyFach = IsNullOrEmptyWertAusWPF((string)listFach.SelectedValue);
                    bool IsNullOrEmptyJahrgang = IsNullOrEmptyWertAusWPF((string)listJahrgang.SelectedValue);
                    bool isValidPassword = IsValidPassword(connection, listFach.SelectedValue, Passwort.Text);

                    if (isValidPassword && IsNullOrEmptyFach && IsNullOrEmptyJahrgang)
                    {
                        MessageBox.Show("Das Unterrichtsvorhaben wurde erfolgreich angelegt.");
                    }
                    else
                    {
                        MessageBox.Show("Folgende Angaben müssen vorher gemacht werden:\n- Fach\n- Jahrgang\n- Passwort");
                    }
            }
        }

Zitat
Der Fehler kommt, da du mit "(int)listFach.SelectedValue" eine Umwandlung des ausgewählten Wert zu int forcierst.

Auch, wenn es doof klingt, hat mir Studio gesagt, ich soll (int) eintragen da ein Objekt nicht in int konvertiert werden kann.
Als alternativ Vorschlag kam folgendes:


throw new NotImplementedException();

Wenn ich richtig verstehe, wird die Meldung damit nur unterdrückt?