Laden...
Avatar #kSCfyuTL1TM0cpx0ApeH.jpg
echdeneth myCSharp.de - Member
Anwendungsentwickler Sachsen, Herrnhut/Zittau Dabei seit 05.06.2019 161 Beiträge

Forenbeiträge von echdeneth Ingesamt 161 Beiträge

27.08.2020 - 08:35 Uhr

... Jeder Datentyp kann nullbar gemacht werden...
...Fraglich ist, ob das notwendig ist, aber das ist von Fall zu Fall zu entscheiden...

Ich nahm an dies sei erst mit C# 8 möglich, so wurde es kommuniziert. ich gabe zu, ich hätte es ausprobieren müssen - mea culpa.

Es ist(wäre) notwendig bei SQL Anfragen, wenn ein sie NULL-Werte enthält oder (über JOIN) bestimmte Einträge in der verbnundenen Tabelle keine Übereinstimmung haben (dann stehen da NULL- Werte).
Da bräuchte ich diese Felder nicht umständlich "UnNULLen". Fragt sich ob die verwendeten Klassen (DataTable etwa) auch NULL verwenden können. Mal testen...

26.08.2020 - 14:06 Uhr

C# 8 mit Visual Studio 2019: Das umfassende Handbuch

Das klitzekleine Problem: da ich mit .NET Framework arbeite (.NET CORE gibts nicht mit Views oder?)
kann ich nur C# 7.3.

Ich weiss nicht ob mir das Buch da weiterhilft. Aber ein Nullbarer DateTime Datentyp fänd ich reizvoll.

26.08.2020 - 11:00 Uhr

Wie ich schon mehrmals erwähnt habe, sind UserControls in WPF meist nicht notwendig

Bin mir nicht ganz sicher wie du das meinst.
Mein Verständnis eines Programmaufbaus mit Unterseiten! ist:

Hauptseite -> Unterseite1
-> Unterseite2
...

Wobei Haupt- und Unterseite entweder Window/Page/UserControl sein können.

Zuerst (am Anfang) habe ich für alles ein neues Fenster geöffnet, dann habe ich Pages "entdeckt"
und nun UserControls.

Wenn es nun eine andere Art gäbe genau DASSELBE! zu tun wäre ich höchst interessiert.

Und "Show-Effekte"? Keine Ahnung, was du damit meinst.

Flapsig ausgedrückt: Es wird ein Element (z.B. DataGrid) angezeigt -> Button wird gedrückt
-> 1. Element wird ausgeblendet / 2. Element (z.B. Grid mit Formularfeldern) wird eingeblendet
Daher "Show-Effekt", da beide Elemente bereits vorhanden sind und nur der Eindruck eines Wechsels erzeugt wird.

Ist vielleicht auch nicht die richtige Einstellung

Wenn ich lernen will wie MVVM funktioniert, muss ich etwas haben woran/womit ich es lernen kann.
Bücher gibts keine gescheiten, YouTube?, Foren evtl. und! funktionierender Code den ich analysieren kann.
z.B. https://www.technical-recipes.com/2016/switching-between-wpf-xaml-views-using-mvvm-datatemplate/
Mir bleibt also kaum eine Wahl...

21.08.2020 - 11:57 Uhr

Danke, ich meld mich wenn ich fertig bin. So oder so fertig.

21.08.2020 - 11:01 Uhr

Mach ich so wie im "technical-recipes" Link gezeigt.

Wie verfahre ich bei "Untermenüs"?
Also wenn ein UserControl wiederum ein ContentPresenter hätte wie im MainViewModel.
Oder ist das ebenfalls Murks?
Und besser die Unterseiten in's MainViewModel incl. ein paar Show-Effekte mit einbauen?

21.08.2020 - 09:53 Uhr

Ich habe das Gefühl, dir fehlt der Grundgedanke bei MVVM (sowie einige grundlegende Programmierthemen, wie eben Interfaces).

Möglicherweise
Und ich dachte, ich hätt's langsam raus...

21.08.2020 - 09:18 Uhr

... ein eigenständiges, neues RechnungViewModel erzeugt, das nichts mit deinem in deiner MainViewModel erzeugten Instanz rechnungViewModel gemein hat -> so kannst du auch keine Events von dieser VM-Instanz empfangen.

What the... 8o
Ich nahm an das damit die ++**Datenbindung ** ++zum ViewModel hergestellt wird....
Weshalb wird da ein neues Objekt erzeugt? Das ist widersinnig, grotesk gar!

... Du bindest hier aber bisher kein ViewModel, sondern ein UserControl!

ja, ist mir auch kürzlich aufgefallen. Stammt so in etwa aus einem Tutorial.
Die Property wird auch peu a peu in CurrentView (um)benannt.

... du instanziierst also UI-Elemente (UserControls) aus dem ViewModel heraus

Ja, auch hier sei bemerkt, dass ich als Vorlage Tutorials verwendete in denen das GENAU SO gemacht wurde.
Nach diesem Style:


        public ICommand Blabla { get; set; }

        public MainViewModel()
        {            
            Blabla = new RelayCommand(Blabla _OnClick);

            CurrentViewModel = new Bla();
        }


        private object _currentView;
        public object CurrentView
        {
            get => _currentView;
            set
            {
                if (_currentView != value)
                {

                    _currentView = value;
                    NotifyPropertyChanged();
                }
            }
        }


        void Blabla _OnClick(object obj)
        {
           CurrentViewModel = new Blabla();
        }

Es sei mal noch erwähnt, dass ich des MVVM noch nicht lange mächtig bin (bzw: Dachte zu sein). Nur CodeBehind bisher...

20.08.2020 - 13:49 Uhr

RechnungenView/RechnungView sind UserControl
(Ja, ich hab's nicht so mit der Namensgebung... mea culpa)

Was Interface angeht habe ich noch nicht viel mit geübt, nun eigentlich fast gar nicht.
Kann sie somit nicht unterbringen. habe es mir aber vorgemerkt.

Zur Letzten Frage:

Binding des Views (RechnungenView(UserControl) z.B.) an das ViewModel:

<Window.DataContext>
   <local:MainViewModel/>
</Window.DataContext>
  
<!--</Zeugs>-->

<ContentPresenter Content="{Binding CurrentViewModel}"/>

... und zuweisen des ChildView's an CurrentViewModel


<UserControl x:Class="...Views.RechnungView">
    <UserControl.DataContext>
        <vm:RechnungViewModel/>
    </UserControl.DataContext>
    <Grid Background="White">
        <StackPanel>
            <Label Content="Rechnung"/>
            <Button Command="{Binding Command}" 
                    Content="Rechnungen" Width="100"/>
        </StackPanel>
    </Grid>
</UserControl>

Oder meintest du was anderes?

20.08.2020 - 11:39 Uhr

Bin den Artikel mit den Events durchgegangen und den Code nach bestem Wissen und Gewissen eingebaut.

Leider funzt es nicht X( Events feuern nicht oder werden nicht an MainViewModel weitergegeben.

Kann ich feststellen ob das Event gefeuert wurde?

MyEvent?.Invoke(this, e);

Das MainViewModel sieht dann so aus:

    
public class MainViewModel : BaseViewModel
    {
        private RechnungenViewModel rechnungenViewModel = new RechnungenViewModel();
        private RechnungViewModel rechnungViewModel = new RechnungViewModel();

        public MainViewModel()
        {

            rechnungViewModel.MyEvent += rechnungen_MyEvent;
            rechnungenViewModel.MyEvent += rechnung_MyEvent;

            CurrentViewModel = new RechnungView();
            Message = "MainViewModel";
        }


        public void rechnungen_MyEvent(object objSender, EventArgs e)
        {
            CurrentViewModel = new RechnungView();
            Message = "rechnungen_MyEvent";
        }

        public void rechnung_MyEvent(object objSender, EventArgs e)
        {
            CurrentViewModel = new RechnungenView();
            Message = "rechnung_MyEvent";
        }

        private object _currentViewModel;
        public object CurrentViewModel
        {
            get { return _currentViewModel; }
            set
            {
                if (_currentViewModel != value)
                {
                    _currentViewModel = value;
                    OnPropertyChanged();
                }
            }
        }

        private string _message;
        public string Message
        {
            get => _message;
            set
            {
                if (_message != value)
                {
                    _message = value;
                    OnPropertyChanged();
                }
            }
        }
    }

Das Ding mit Message habe ich nur als Extra Kontrolle gemacht.

Auch habe ich versucht CurrentViewModel im BaseViewModel unterzubringen.
Aus dem MainViewModel heraus wurde der Content vom ContentPresenter
korrekt gesetzt.
Im "ChildViewModel" konnte CurrentViewModel sowohl angesprochen als auch gesetzt werden.
Es hat jedoch am Content des ContentPresenter nichts geändert. 🤔

19.08.2020 - 14:44 Uhr

... bekommt ein Objekt vom Typ INavigationService.
Die Implementierung ist dann z.B. das MainViewModel...

INavigationService Ist das nicht MVVMlight?

19.08.2020 - 14:13 Uhr

...benutze in diesen VMs ein Ereignis, das von dem MainViewModel abonniert wird und den Austausch des CurrentViewModel durchführt.

Hier muss ich passen da ich in MVVM noch keine Erfahrung im Event-Handling habe.

Statt object solltest du eine Basisklasse (oder zumindestens ein interface) für deine VMs verwenden (und dort definierst du dann obiges Ereignis).

Ist dieser Link so was in der Richtung?
MVVM – Hierarchies & Navigation
Etwa mittig auf der Seite, der Teil mit der BindableBase
Ich mühe mich das peu a peu nachzubauen, und hoffe es zu verstehen...

19.08.2020 - 12:16 Uhr

In meinem MVVM-Projekt, habe ich ein "kleines" Problem.

Ich habe ein MainViewModel mit einem solchen Aufbau:


public class MainViewModel : BaseViewModel
    {
        public ICommand CommandClose { get; set; }
        public ICommand CommandMax { get; set; }
        public ICommand CommandMin { get; set; }

        public MainViewModel()
        {
            CommandClose = new RelayCommand(CommandClose_OnClick);
            CommandMax = new RelayCommand(CommandMax_OnClick);
            CommandMin = new RelayCommand(CommandMin_OnClick);

            CurrentViewModel = new RechnungenView();
        }

        private object _currentViewModel;
        public object CurrentViewModel
        {
            get { return _currentViewModel; }
            set
            {
                if (_currentViewModel != value)
                {
                    _currentViewModel = value;
                    NotifyPropertyChanged();
                }
            }
        }

CurrentViewModel hängt an einem ContentPresenter der verschiedene Views darstellt.

Nun kann ich aus den zuugehörigen ViewModels der Views nicht auf CurrentViewModel zugreifen
um ein anderes ViewModel anzeigen zu lassen.

Die Views sind in obigen Beispiel UserControl.

Und egal wie ich es Drehe und Wende, ob ich Pages verwende - ich bekomme keine Navigation zustande.
D.h. ich möchte aus einem Usercontrol oder einer Page den Content des ContentPresenters oder einer Frame ändern.

Diverse Codes im Netz sind mit noch viel zu hoch. Gibt es verständliche Lösungen?

Danke

05.08.2020 - 08:41 Uhr

Hier eine Version die ich mir mal erdacht hab.
Hinzu gekommen ist die Tabelle Liefermengen in der pro Eintrag sowohl ein Lieferartikel,
als auch ein Sonder-/ Artikel referenziert werden.
Aber dieses Modell empfuinde ich auch nicht als sehr stabil.

Ich bin mit dem Design auch sehr frei, lediglich die Grundstruktur mit Lieferungen/Artikel/Sonderartikel - Artikelliste/PrioListe/Reklamationen muss bleiben.

Mit Stored Procedures habe ich mich auch beschäftigt, aber das was ich bräuchte (Link) liegt noch außerhalb meiner Befähigung.
JTL-Wawi Datenbank - Stored Procedures
Wäre eine Berechnung mit damit möglich?

04.08.2020 - 15:46 Uhr

... ich hab Dein Projekt nicht vor mir.

Moment...

Poste das EER Diagramm mal dazu.
(Ja, ich habs nicht so mit der Namensvergabe, ich gelobe Besserung...)
Es kommen nach Bedarf noch Felder hinzu. Entscheidend ist wie ich die Zuordnung herstellen kann ohne das von die genannte Probleme auftreten.

04.08.2020 - 14:14 Uhr

Oder über Stored Procedures vielleicht:
MySQL Stored Procedures als Tutorial z.B. bei jedem angelegtem "Lieferartikel" den zugehörigen "Artikel" abzufragen zu verrechnen und in eine weitere Tabelle zu speichern?

04.08.2020 - 13:50 Uhr

verwendetes Datenbanksystem: <MySQL>

Moin, ich habe ein kleines Problem.
In meiner Datenbank habe ich mehrere Tabellen.

Einträge in "Bestellungen" haben eine 1-n Beziehung zu "Artikel"
(jeder Eintrag in "Bestellung" verweist auf mehrere in "Artikel")
und diesselbe bei Sonderbestellungen

Einträge in "Lieferungen" haben eine 1-n Beziehung nach "Lieferartikel"

Eine "Artikelliste" die eine 1-n Beziehung zu "Artikel" und "Lieferartikel" hat.

Vorher habe ich bei jeder Lieferung die gelieferten Artikel in "Artikel" verrechnet
(in CodeBehind und dann eingetragen) dies führte aber oft zu Fehlern.

Diese "Liefermengenkorrektur" ist die Verrechnung der gelieferten Artikel mit den Bestellten.

Gibt es eine Möglichkeit, die "Liefermengenkorrektur" dynamisch ablaufen zu lassen,
entweder über eine 5. Tabelle die die Liefermenge zu jedem Artikel in "Artikel" erfasst mit Verweis 1-n
zu einem "Lieferartikel" oder gibt es andere Möglichkeiten/DesignPattern dafür?

Ich hoffe mein Anliegen unmissverständlich kommuniziert zu haben, wenn nicht bitte nachfragen.

Danke

31.07.2020 - 13:58 Uhr

Mir scheint, es fehlt die Logik-Schicht. Du wurdest ja schon mehrfach auf
>
hingewiesen, nun kannst du es praktisch einsetzen...

Genau hier liegt der Hund begraben.

ich habe kein praktischen Ansatz um Code in die 3 Schichten zu trennen. Vielleicht wird dies im
3. Lj. noch dran genommen, viel Hoffnung hege ich hierbei nicht.

Oftmals ist es auch so dass, wenn ich angenommen habe ich hätte es gefressen - ich hatte hier
mal ein Codebeispiel präsentiert - is hieß: "Nein so wird es nicht gemacht"

Kumulativ lässt sich sagen: Ich weiss nicht wie!

31.07.2020 - 08:45 Uhr

Moin, ich habe 2 Tabellen, in einer stehen Lieferungen/Bestellungen und in der anderen
die dazugehörigen Einträge. (ListView/GridView)

Die 1. Tabelle hat ein SelectedItem="{Binding SelectedUnbeliefert}" mit dessen Hilfe für die
Fremdschlüsselbeziehung und SQL Abfrage notwendige ID ausgelesen wird.

SQL Abfrage - von dem Aufruf: public IEnumerable... gäbe es mehrere in der Klasse

    
public class MySQL 
    {
        private readonly string login = Globals.Login;
        private MySqlDataReader reader;

        public IEnumerable<ArtikelViewModel> GetArtikel()
        {
            List<ArtikelViewModel> artikels = new List<ArtikelViewModel>();

            using (MySqlConnection conn = new MySqlConnection(login))
            {
                conn.Open();

                //StringBuilder sb = new StringBuilder();
                //sb.AppendLine("SELECT *");
                string query = "CALL `NormalArtikelliste`();";
                using (MySqlCommand cmd = new MySqlCommand(query, conn))
                {
                    using (reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            artikels.Add(new ArtikelViewModel()
                            {
                                ArtikellisteIndex = reader.GetInt32(0),
                                ArtikelNummer = reader.GetString(1),
                                ArtikelName = reader.GetString(2),
                                BestellMenge = reader.GetInt32(3),
                                Geliefert = reader.GetInt32(4),
                                PrioID = reader.GetInt32(5),
                                PrioMenge = reader.GetInt32(6),
                                Datum = reader.GetDateTime(7),
                            });
                        }
                    }
                }
                ...
                }
            }

            return artikels;
        }
...

Dann eine:


        private ObservableCollection<LieferungenViewModel> unbeliefert;
        public ObservableCollection<LieferungenViewModel> Unbeliefert
        {
            get { return unbeliefert; }
            set
            {
                if (unbeliefert == value)
                    return;
                unbeliefert = value;
                NotifyPropertyChanged("Unbeliefert");
            }
        }

und


        private MySQL _sql = new MySQL();
        public BestellungenVM()
        {

            IEnumerable<LieferungenViewModel> __unbeliefert = _sql.GetUnbeliefert();
            Unbeliefert = new ObservableCollection<LieferungenViewModel>(__unbeliefert); // 1. Tabelle statisch(Lieferuingen...)

            IEnumerable<LieferungenViewModel> __ausgeliefert = _sql.GetAusgeliefert();
            Ausgeliefert = new ObservableCollection<LieferungenViewModel>(__ausgeliefert); // Unwichtig

        }
        void getArticle_OnSelect(int index)
        {
            IEnumerable<ArtikelViewModel> _selectUnbeliefert = _sql.GetBestellung(index);
            Artikelliste = new ObservableCollection<ArtikelViewModel>(_selectUnbeliefert); // 2. Tabelle dynamisch (Artikel)
        }

Ich weiss leider nicht wie ich die Collection nur aktualisiere ohne sie jedes mal neu zu instanzieren was so auch passiert wie ich annehme
getArticle_OnSelect(int index) wird über eine Eigenschaft ausgelöst, was mir auch nicht sehr gefällt - siehe Oben, das Bi´nding


        private LieferungenViewModel selectedUnbeliefert;
        public LieferungenViewModel SelectedUnbeliefert
        {
            get => selectedUnbeliefert;
            set
            {
                selectedUnbeliefert = value;
                getArticle_OnSelect(selectedUnbeliefert.NormalBestellungenIndex);
                NotifyPropertyChanged();
                NotifyPropertyChanged("LCheck");
            }
        }

Hawbe garantiert irgendwas Vergessen zu Erwähnen, also meine Bitte um Milde

Danke

10.07.2020 - 16:10 Uhr

Dann sollte definitiv eine HTTP API dazwischen!

??? - habe ich mich noch nicht mit befasst... 🤔

Die Datenbank sollte nicht über das Internet erreichbar sein!

Muss sie doch wenn mit der App auf verschiedenen Rechnern auf dieselbe DB
zugegriffen werden muss, ich wüsste nicht wie das anders gehen sollte...?!?!? 8o ?(

10.07.2020 - 13:45 Uhr

Danke, das war hilfreich.

Unsere Datenbank liegt auf einem Server eines WebHosters und an "klassischen" MySQL-Snfragen al la:


using (MySqlConnection connection = new MySqlConnection(ConnString))
                    {
                        string query= "SELECT * FROM BLABLA;";
                        connection.Open();
                        using (MySqlCommand cmd = new MySqlCommand(query, connection))
                        {
                            using (reader = cmd.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    // Zeugs
                                 }
                             }
                         }
                     }

daran geht kaum ein Weg vorbei da mehrere Nutzer und eine DB, ich könnte höchstens die Abfrage optimieren...

09.07.2020 - 10:30 Uhr

... Ein Interface z.B. IDataService ...

Von Interfaces habe ich gehört, aber noch keine praktischen Erfahrungen damit machen können.
Könnte aber genau das sein was ich suche...

bei o.g. C# Code kommt folgendes:> Fehlermeldung:

Fehlermeldung: Das Objekt des Typs "WhereEnumerableIterator1[...Model]&quot; kann nicht in Typ &quot;System.Collections.ObjectModel.ObservableCollection1[...Model]" umgewandelt werden.

🙁

09.07.2020 - 09:22 Uhr

Sorry, aber ich habe meine Fragestellung offenkundig nicht nur geringfügig verkackt.

... direkten Datenbank Zugang haben, sondern die Daten von einem Webservice konsumieren. Da informiere ich mich mal in der Thematik, im aktuellen Projekt wahrscheinlich nicht umsetzbar.

Und bei der Trennung der Schichten brauche ich einfach viel mehr Übung, Praxis und leicht verständliche Beispiele, bin ja nicht nehr der Jüngste...

Die Fragen nach Filter, Labda-Expressions und SQL-Anweisungen verstehe ich nicht. Wir wissen weder, wie deine Datenbank aufgebaut ist, noch kennen wir deine deine Modelle. Wo genau liegt dein Problem? Ich weiss dass ich ein Problem mit Fragestellungen habe 😁

Habe die Lösung (oder ein Teil davon) selbst gefunden


_liste_a = (ObservableCollection<Model>)_list.Where(x => x.CheckBoxChecked == true);
_liste_b = (ObservableCollection<Model>)_list.Where(x => x.CheckBoxChecked == false);

Wenn ihr immer noch nicht wisst worauf ich hinaus wollte, weiss ich auch nicht mehr weiter...
Das ganze wird dann später noch in ein ModelView verpackt

08.07.2020 - 16:03 Uhr

Moin, ich verwende wie gesagt MySQL und möchte 2 DataGrids aus der selben Quelle bedienen.

Beide DGs haben eine Checkbox über die die Einträge in die jeweil andere DG verfrachtet werden sollen.
(Das Setzen einer Checkbox endigt wahrscheinlich in einer SQL Anweisung, die diesselbe in der DB abbildet) Grundlage für die DG ist eine (oder 2, oder 3) ObservableCollection.
Und über eine CollectionViewSource wird gefiltert (Suche).

Sollte ich jeweils einen weiteren Filter einbauen (Checkbox Ja/Nein)?
Oder per Lambda Expression trennen? Oder 2 separate SQL Anfragen bei der beide DGs getrennt bedient werden?

Wie würdet Ihr das machen?

30.06.2020 - 09:22 Uhr

Zur Not würde ich als "Datenbank" noch eine XML-Datei erwägen

30.06.2020 - 08:48 Uhr

Repository Pattern? Das am ehesten

Das ""Werte" in einem Repository ablegen?" habe ich geschrieben, da mir die passenden Brgriffe fehlen um
meine Frage korrekt zu formulieren oder danach zu suchen.
Ich hätte auch schreiben können:
"Daten (nicht Programmcode) im Programm selbst, nicht in einer externen Datei/Quelle speichern"

Das Programm soll in einer List/ObservableCollection/Enumerable und dergleichen, abrufbare Daten enthalten,
z.B. eine Auflistung von Farben die sowohl in weiteren Listen oder UI-Elementen verwendet werden können.

Auch auf die Gefahr hin, dass ich mir wieder umständlich ausgedrückt habe... 😁

29.06.2020 - 16:07 Uhr

Moin,

für ein Projekt (UWP) möchte ich verschiedene Werte in einem Repository ablegen.

letztendlich soll es eine Oberklasse als Auflistung geben in welcher pro Element eine
Bezeichnung und Werte anderer Auflistungen verwendet werden können.

z.B.


public List<Element> Elemente()
        {
            return new List<Element>()
            {
                new Element() {Name = "Bla", Image = Path.P1, Menge = 12, Color = CColors.Bla, Modell =  Element.Modell},
                ...
            };
        }

Wie kann ich das realisieren, gibt es Beispiele dafür?

Ich weiss nicht recht wie ich das in Google z.B. suchen soll und hoffe ich bekomme auch Hinweise darauf.

Danke

04.06.2020 - 09:28 Uhr

..., hast du das Konzept ganz grundlegend nicht verstanden.

🙁 nach den anderen beiträgen zufolge habe ich das anscheinend nicht.
Und ich dachte, ich hätte. Zumindest Grundlegend.

04.06.2020 - 09:19 Uhr

Oh ja, ich vergaß.
Mir ging es weniger um die Anwendung laut (scholastischer) Definition sondern eher um ein vereinfachtes Prinzip. (Mönch hin oder her...) Viele Profi-Entwickler mühen sich in Erklärungen, Sachverhalte in nur aus Ihrer Sicht einfacher Weise darzulegen. Leider trifft dies Nur Aus Ihrer Sicht zu. Für mich ohne jenen langjährigen, professionellen Kontext jedoch ist es dann alles andere als Einfach. Oft finden sich dann Klassen/Methoden/whatever darin, die ich in ihrer Funktion nicht nachvollziehen kann und somit nicht zur Erleuchtung beitragen. Daher so simpel wir möglich und so Komplex wie nötig.

Wenn also 2 oder mehrere mögliche Erklärungen vorhanden sind. ist die Einfache der/den Komplexeren vorzuziehen. Finde ich jedenfalls.

03.06.2020 - 09:30 Uhr

Die Theorie der 3-Schichten Trennung ist mir klar.
Es hapert bei der praktischen Umsetzung und an Beispielen die ich kontextuell nachvollziehen kann.
Falls Fragen auftauchen, für was für eine Art Projekt das gelte, Stichwort: Ockhams Rasiermesser

So habe ich es Verstanden:
3. Schicht
3.1 Datenbankzugriff in einer Methode, Einlesen in eine Liste (Lokale? Variable z.B. List<>, ObservableCollection(OC) oder DataTable)
3.2 Übergabe an Aufrufer (Frage: wie übergebe ich eine OC, eine DataTable - habe ich immer gemieden da ich das Konzept nicht 100%ig durchschaue)


public DataTable DataT()
   {
       DataTable dt = new DataTable(); //oder ObservableCollection
       using(SQL)
        {
          dt = DataReader
        }
       return dt;
   }

Wäre das korrekt, auch bei einer OC?

  1. Schicht
    2.1 Bearbeitung der DataTable, OC - Berechnung, etc.
    2.2 evtl. Aufruf einer weiteren Methode mit Rückgabe einer OC, DT

private void Bla()
{
   DataTable dt = DataT();
   dt = Irgendwas;
}

So?

  1. Schicht
    1.1 Bedienung und Behandlung der UI und Aufruf der Methoden der 2. Schicht
    1.2 ???

private void Blabla(irgendein KeyDownBlaBlaEventHandler)
{
 if (Textbox.Content != "" || AntwortAufFrageNachDemUniversumUndDemGanzenRest == 42)
   Bla(); 
}

Für sowas und zum Verstehen braucht man nicht fragen: Für was für ein Projekt?
Für das einfachste Projekt das gerade zum Verstehen nötig ist!

Wer es nicht kennt, Ockhams Rasiemesser:

  1. Von mehreren hinreichenden möglichen Erklärungen für ein und denselben Sachverhalt ist die einfachste Theorie allen anderen vorzuziehen.
  2. Eine Theorie ist einfach, wenn sie möglichst wenige Variablen und Hypothesen enthält und wenn diese in klaren logischen Beziehungen zueinander stehen, aus denen der zu erklärende Sachverhalt logisch folgt - Quelle: Wikipedia
02.06.2020 - 15:15 Uhr

Du musst es verstehen.

Das Problem...

Ich benötige leider kein abstraktes Theorem sondern ein Beispiel mit Kontext zu etwas
was ich im Code verwende um es zu verstehen.

Das Prinzip verstehe ich schon, ich weiss eben nicht wie ich es realisieren soll.

Google liefert hier leider nur ungenügendes... X(

02.06.2020 - 15:10 Uhr

Kann mir jemand des besseren Verständnisses Halber beschreiben wie ich diesen Code in die
3 Schichten zerlege? Oder nen neuen Thread aufmachen?



private ObservableCollection<PositionModel> _listArtikel = new ObservableCollection<PositionModel>();

...

private void Prio()
        {
            _listArtikel.Clear();
            try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnString))
                {
                    connection.Open();

                    queery = "d02d0075.MPrioSK();";

                    using (MySqlCommand command = new MySqlCommand(queery, connection))
                    {
                        using (reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                _listArtikel.Add(new PositionModel()
                                {
                                    ArtikellisteIndex = reader.GetInt32(0),
                                    ArtikelNummer = reader.GetString(1),
                                    ArtikelName = reader.GetString(2),
                                    BestellMenge = reader.GetInt32(3),
                                    Geliefert = reader.GetInt32(4),
                                    PrioMenge = reader.GetInt32(5),
                                    Datum = reader.GetDateTime(6),
                                });
                            }
                        }
                    }
                }

            }
            catch (Exception)
            { }
}

02.06.2020 - 13:37 Uhr

Ich muss in dieser Thematik (3-Schichten-Modell) in einem etwas überschaubarem Projekt anfangen

02.06.2020 - 12:36 Uhr

Habe zurückgerudert


try
            {
                using (MySqlConnection connection = new MySqlConnection(ConnString))
                {
                    connection.Open();

                    queery = "d02d0075.MPrioSK();";

                    using (MySqlCommand command = new MySqlCommand(queery, connection))
                    {
                        using (reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                    _listArtikel.Add(new PositionModel()
                                    {
                                        ArtikellisteIndex = reader.GetInt32(0),
                                        ArtikelNummer = reader.GetString(1),
                                        ArtikelName = reader.GetString(2),
                                        BestellMenge = reader.GetInt32(3),
                                        Geliefert = reader.GetInt32(4),
                                        PrioMenge = reader.GetInt32(5),
                                        Datum = reader.GetDateTime(6),
                                    });
                            }
                        }
                    }
                }

            }
            catch (Exception)
            { }

Nur wie ich hier die 3-Schichten-Architektur umsetze weiss ich noch nicht genau...
problem mit async ist gelöst da wie T-Virus schrieb, ist MySQL syncron, ergo...

02.06.2020 - 12:10 Uhr
  1. Ich verzichte bei SQL auf async
  2. Ja, ich werde mich eingehend mit der 3 Schichten Architektur befassen

Leider weiss ich nicht genau was mit:
"Sieht auch aus als würdest du in der UI deine Datenbank Verarbeitung einrühren."
gemeint ist im Bezug auf den Code (auch ohne async) X(
Ich nahm an GENAU SO wird's gemacht 🙁

02.06.2020 - 11:51 Uhr

Auch die Verarbeitung mit dem Dispatcher sieht sehr abenteuerlich aus.

Das habe ich so recherchiert und manches waren Korrekturen von VS2019, Asche auf mein Haupt...

Trennen deine UI und deine Datenbank Code durch eine saubere Schichten Trennung nach dem Drei-Schichten Modell. Dann hast du auch solche Konstrukte nicht.

Das kam in der Umschulung (2.Lj) nicht vor, auch habe ich damit keine praktischen Erfahrungen.
Wenn das die Verwendung von MVVM impliziert, da bin ich auch noch rel. am Anfang.

02.06.2020 - 11:38 Uhr

Die Ausgabe ist auf 3 begrenzt (... LIMIT 3;)

Async bei MySQL ist vorhanden:
"using (reader = (MySqlDataReader)await command.ExecuteReaderAsync())
{
while (await reader.ReadAsync())..."

nach dem was ich gelesen habe ist dies jedoch nicht async...
Does MySql Connection methods support async programming?

02.06.2020 - 11:29 Uhr

Läuft das SQL-Statement auch in der Konsole nicht?

SQL Anfrage läuft im syncronen Modus/PHPMyAdmin fehlerfrei.

gibt es auch ein command.ExecuteReaderAsync() und reader.ReadAsync()? Dann könntest du diese verwenden mit await und würdest das Task.Run nicht benötigen.

Ich teste mal "ExecuteReaderAsync()"...

Update: funzt auch nicht...
Stehe wie gesagt in dieser Thematik am Anfang

02.06.2020 - 11:19 Uhr

Moin, ich wollte mal besagtes Einlesen asyncron machen da bekomme ich die Exception:
"You have specified an invalid column ordinal."
Quelle:
bei MySql.Data.MySqlClient.MySqlDataReader.Throw(Exception ex)
bei MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue(Int32 index, Boolean checkNull)
bei MySql.Data.MySqlClient.MySqlDataReader.GetInt32(Int32 i) ...
(funzt im syncronen Modus tadellos)


try
            {
                await Task.Run(() =>
                {
                    using (MySqlConnection connection = new MySqlConnection(ConnString))
                    {
                        connection.Open();

                        queery = "d02d0075.MPrioSK();";

                        using (MySqlCommand command = new MySqlCommand(queery, connection))
                        {
                            using (reader = command.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    Application.Current.Dispatcher.Invoke(delegate
                                    {
                                        _listArtikel.Add(new PositionModel()
                                        {
                                            ArtikellisteIndex = reader.GetInt32(0),
                                            ArtikelNummer = reader.GetString(1),
                                            ArtikelName = reader.GetString(2),
                                            BestellMenge = reader.GetInt32(3),
                                            Geliefert = reader.GetInt32(4),
                                            PrioMenge = reader.GetInt32(5),
                                            Datum = reader.GetDateTime(6),
                                        });
                                    });
                                }
                            }
                        }
                    }
                });
            }
            catch (Exception)
            { }

Ich möchte etwas Erfahrung sammeln mit Multitasking, bin da noch recht grün hinter den Ohren und kann mir leider nicht vorstellen wo der Fehler liegt.

27.05.2020 - 10:04 Uhr

Ich habe deine Anwendung "MVVMTestProject" genommen, analysiert und als Vorlage für ein Projekt verwendet. Ich kann daran schon recht gut die Zusammenhänge verstehen. Zumindest besser als vorher.

26.05.2020 - 08:49 Uhr

Es ist eigentlich aber gar nicht so kompliziert.

Nun, das ist das (Gras) Hauen mit der Sense (Schnittern) auch nicht, es ist sehr einfach - wenn man es kann - und ich sehe Familienmitglieder die es versuchen (Hacken, Gras verprügeln) und ... naja... und sage dann auch manchmal "Das ist eigentlich ganz einfach". 😉

Mit Löten ist es dasselbe. Und Autofahren vermutlich auch.

25.05.2020 - 15:30 Uhr

Das mit den Command funzt soweit (hab es aber noch nicht 100%ig durchschaut)...

Die UserControl konnte ich auch laden.

Nun habe ich Probleme sowohl das ListView als auch das EintragViewModel simultan anzeigen zu lassen... X(
Auch werden Namen entweder nicht in die Collection eingetragen oder diese ist nicht richtig eingebunden

Kannst du mir evtl. einen guten Kurs empfehlen oder ein gutes Buch (deutsch)?

19.05.2020 - 15:24 Uhr

Ist das mit der Auflistung so gemeint?


    public class ViewModel : ModelBase
    {
        private ObservableCollection<Eintrag> _eintrag = new ObservableCollection<Eintrag>();

        public ObservableCollection<Eintrag> EintragCollection
        {
            get { return _eintrag; }
            set
            {
                if (value != _eintrag)
                {
                    _eintrag = value;
                    NotifyPropertyChanged("EintragCollection");
                }
            }
        }

        private ObservableCollection<Status> _status = new ObservableCollection<Status>();

        public ObservableCollection<Status> Status
        {
            get { return _status; }
            set
            {
                if (value != _status)
                {
                    _status = value;
                    NotifyPropertyChanged("Status");
                }
            }
        }
    }

[Eintrag] ist eine Auflistung von Properties als Datensatz für DataGrids
[Status] soll dazu dienen Visiblity, IsEnabled und derartiges für Buttons und so bereitzuhalten die Kontextabhängig geschaltet werden können. Ich muss aber leider noch mit CodeBehind arbeiten, da ich mein dazugehöriges Programm nicht einfach komplett auf MVVM umstellen kann. Ich weiss daher nicht ob ich im CodeBehind so einfach Zugriff darauf bekomme.

15.05.2020 - 11:26 Uhr

Moin, ich habe nun begonnen mich intensiv mit MVVM zu beschäftigen.

Hierzu habe ich ein Projekt erstellt wobei sich im MainWindow 3 Button befinden und ein Grid.
Darin (Grid) sollen 3 UserControls(UC1-3) angezeigt werden.
Dazu in den UCs jeweils ein Formular mit Eingabefeldern (Name, Vorname) und in einem anderen UC ein ListView an eine ObservableCollection gebunden.
Nach u.a. diesem Vorbild [Artikel] MVVM und DataBinding

Hier meine Version der Klasse mit der die UCs geladen werden sollen:

    public class MainViewModel
    {
        public ICommand CommandUC1 { get; set; }
        public ICommand CommandUC2 { get; set; }
        public ICommand CommandUC3 { get; set; }

        public MainViewModel()
        {
            CommandUC1 = new RelayCommand(CommandUC1_OnClick);
            CommandUC2 = new RelayCommand(CommandUC2_OnClick);
            CommandUC3 = new RelayCommand(CommandUC3_OnClick);
        }

        void CommandUC1_OnClick(object obj)
        {

            UC.UC1 _uc1 = new UC.UC1();
            _uc1.???
        }
        void CommandUC2_OnClick(object obj)
        {
        }
        void CommandUC3_OnClick(object obj)
        {
        }
    }

Und ein paar Fragen:

  • Erstelle ich für das BaseViewModel, RelayCommand oder Klassen in den ich später SQL-Abfragen behandel ,eigene Klassen
    in der Projektmappe? Dieses und ähnliches prinzipielle Prozedere sind mir nicht transparent.

  • Wenn ich den Datakontext auf ein ViewModel gelegt habe (Mit demn Commands für die Buttons z.B.)
    aber noch eine weiteres ViewModel (eine Liste mit Daten) benötige, was dann?

-In der Anleitung (MVVM und DataBinding) ist der DataContext auf: <local:MainViewModel/> darauf wird aber im weiteren nicht Bezug genommen?

-Kann jemand mit MVVM-Kenntnissen ein gutes Buch empfehlen?

Danke

LG Marko

13.05.2020 - 09:18 Uhr

Ehrliche Frage: hast Du einfach mal drauf losgelegt, ... In Ermangelung des Wissens um das konkrete Vorgehen, ja... (wir hatten noch keine Datenbanken in der Umschulung)

Bedenke hier bitte auch Ockhams Rasiermesser (Sie Sachlage ist viel simpler als du annimmst...)

Die Anforderungen sind folgende:
Es wird eine CSV geladen und in die DB übertragen.
Diese enthält die Auftragsnummer und die Artikel der Bestellung (und Menge etc).
Die Struktur der DB selbst hatte zunächst keine konkreten Anforderungen,
sie entstand erst nach und nach und ich musste sie mir selbst ausdenken.

Ich brauchte eine Artikelliste (als Referenz) und die Artikel sollten eine Priorität zugewiesen werden (Priority, es müsste eig. eine 1:1 Beziehuing sein) können. Ich wählte eine Relationale Datenbankstruktur.

Zuerst waren die Normalen Artikel (Be_Artikel, Bestellungen), der Rest kam später hinzu.
Jeder Eintrag in Be_Bestellungen stellt ein Artikel samt Bestellmenge dar, wieviel geliefert (Geliefert) wurde, und einen Flag um schnell zu Ermitteln ob ausgeliefert (istAusgeliefert) wurde.
Jeder Artikel in Be_Bestellungen ist einer Auftragsnummer (Bestellungen.Be_Bestellnummer) zugeordnet.
Jeder Auftrag enthält einen Flag ob dieser angesehen (Visit) oder komplett Ausgeliefert wurde.
Ebenso einem Artikel in der Referenz. Somit kann jeder Bestellung die Artikel und deren Priorität zugeordnet werden.

PDF_FTP_Exist - damit über eine Abfrage ersichtlich ist ob eine PDF auf einem FTP-Server dazu existiert, wie es der Name sagt. In der Anwendung kann ich dann ohne FTP-Anfrage checken ob eine zugehörige PDF existiert.

Der Bool zu Geliefert ist ausreichend - Datum war aus Sicht des Auftraggebers nicht notwendig. Das mit dem Nullable-Date würde ich aber so in einer neuen DB übernehmen. Ich hatte jedoch in der Vergangenheit das Problem diese Null-Werte auszulesen (Exceptions...).

Dem Rat mit MariaDB werde ich wahrscheinlich nachkommen. je nach dem wie sich ein Umstieg gestaltet.

12.05.2020 - 11:59 Uhr

Was ist die Frage? Wirkt bisschen wie "reingeworfen und macht ihr mal bitte"....

Nein, im Grunde wollte ich Meinungen und Kritik dazu, eben was du unter Kritik geschrieben hast.
Deutsch, weil ich das im Code leichter zuordnen kann
Bools, ich verwende diese Einträge als Flags um die im code behind auszuwerten
Präfixe, wegen der Zuordnung

(Diese Tabellen werden teilweise über mehrere JOINs zusammemgefasst - es gibt eine Klasse in die diese Einträge gelesen werden)

Aber ich lasse mich auch gerne belehren wie man es richtig macht.

In einer zukünfigen Version des Programmes wird auch die DB erneuert, dort Plane ich dann auch die Kritik hier einfließen zu lassen.

12.05.2020 - 09:47 Uhr

verwendetes Datenbanksystem: <MySQL>

Moin, wie im Titel angemerkt habe ich ein EER Diagramm der von mir erstellten Datenbank,
mit dessen Hilfe ich eure Meinung zu Datenbankstruktur und Bezeichnung der Spalten erbete.

24.04.2020 - 15:34 Uhr

Moin und Gesundheit,

gibt es eine (relativ einfache) Möglichkeit die Version einer MSI abzufragen?
Ich weiss das ich diese auch im Dateinamen hinterlegen kann, ist aber a weng schwammig.

Ich möchte das Uploaden von MSIs auf FTP vereinfachen. Versionsvergleich und Upload, bei höherer Version.

Danke

22.04.2020 - 09:41 Uhr

Fragliches Gedöns befindet sich nicht in der UI sondern im CodeBehind
also in der "gedoens.xaml.cs", und fortgeschrittene Programmiertechniken
beherrsche ich noch nicht und waren auch noch kein Bestandteil der Umschulung (2.Lj.)

Was genau meinst du damit?

Man merkt ja wenn ein wiederholtes Laden (zwischendurch nat. einen andere UC) einer UserControl
etwas schwammiger wird oft kaum wahrnehmbar aber dennoch... ergo...

22.04.2020 - 09:37 Uhr

Im Endeffekt sind das alles Folgefehler weil Du kein ordentliches MVVM machst.
...
Es ist quasi alles in MVVM abdeckbar...

Das Problem ist, ich kapiere MVVM nicht richtig, einige Aspekte sind mir unklar.
Die Anleitungen und Tutorials (In der Berufsschule gibt es kein MVVM X(, und die Lehrer haben auch nicht wirklich Ahnung) sind zu spezifisch,
nicht nachvollziebar für mich.
Ich habe Probleme beim ModelView und alles so zu gestalten das die View das ModelView findet (Wonach sucht es? (Datacontext))
Weswegen ich MVVM auch nicht nutzen kann. Ich weiss das MVVM DIE!eins!elf! Lösung für mich wäre,
kann ich sie jedoch nicht nutzen.

Wenn man static bei Datenbankzeugs sieht, dann sieht das auch nach nem richtig groben Schnitzer aus 😉

DAS werde ich mal checken

20.04.2020 - 11:10 Uhr

Da wäre dann die Frage warum du sie explizit im Codebehind erstellen musst?

z.B.


public static MySqlCommand cmd;
public static MySqlDataReader reader;
DataTable dt = new DataTable(); // unter Umständen...
private ObservableCollection<LiefModel> _lieferant = new ObservableCollection<LiefModel>();
List<zusammListe> ZusammListe = new List<zusammListe>();
u.s.w....

solche Dinge....

...DataTemplates und DataTemplateSelector im Zusammenhang mit ContentControl und ItemsControl vermutlich von Interesse.

Jo, guck ich mal...