Laden...
N
Nexmo myCSharp.de - Member
Umschüler Fachinformatiker Anwendungsentwicklung Eggenstein-Leopoldshafen Dabei seit 19.06.2021 36 Beiträge

Forenbeiträge von Nexmo Ingesamt 36 Beiträge

21.10.2021 - 19:33 Uhr

Hallo,

Ich habe über Google übrigens
>
gefunden. Dort wird der Unterschied zwischen SelectedItem, SelectedValue und SelectedValuePath erklärt. Grob gesagt gibt SelectedItem das ausgewählte Object aus deiner Collection zurück, die an deine Comboxbox gebunden ist. Während SelectedValue und SelectedValuePath angeben auf welchen Wert z.B. die ID, des ausgewählten Objects, gebunden werden soll. Kurz gesagt du sollest deine Bindings hier nochmal überdenken:

  
<ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddData.AdressTyp}" SelectedValue="{Binding AddTyp.Adresstyp}"  SelectedValuePath="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >  
                                            <ComboBox.ItemTemplate>  
                                                <DataTemplate>  
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />  
  

Grüße

Ich hab ja oben beschrieben, was ich machen möchte, bzw. muss.

da ich allerdings ja i-wie da grad nicht weiterkomme hab ich ja extra um ein entsprechendes Beispiel gebeten.

Ich hoffe es ist überhaupt klar, was ich machen möchte, oder?

21.10.2021 - 11:55 Uhr

Habe i-wie einen kleinen teilErfolg gehabt:


<ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddData.AdressTyp}" SelectedValue="{Binding AddTyp.Adresstyp}"  SelectedValuePath="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />

wenn ich en SelectedValuePath nur auf AddData binde, dann schreibt er mir immer als Typ "Private" rein, und nicht der, der tatsächlich mitgegeben wird.

in der Collection Adresstypenliste habe ich die ID_Adress_Typ und den AdressTyp.
bei Auswahl aus der Liste Adressdatenliste werden diese Daten an AddData übergeben.

diese übergabe an AddData wird dann direkt an Textboxen gebunden um dort eine weitere Bearbeitung zuzulassen.

Jetzt muss aber der Teil aus dem Textblock AdressTyp an die Combobox(siehe oben) weitergegeben werden, und dort aus der vorliegenden collection das richtige Objekt selektiert werden.
wenn dann über die Collection der Wert geändert wird( z.b. von Privat auf geschäftlich) dann soll das auch direkt in der Listbox wieder angezeigt werden, sodass die änderungen nur noch gespeichert werden müssen.

wie setze ich das um?? steh ich grad nur auf der Leitung, oder denke ich falsch??

bitte um aussagekräftige Hilfen, ggf. solcher, dass mir das einer mal an einem Beispiel vorzeigt.


<ListBox ItemsSource="{Binding Adressdatenliste}" SelectedItem="{Binding AddData}">
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Straße}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Hausnummer}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Plz}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Ort}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Land}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding AdressTyp}" Margin="5,0,5,0"/>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>

21.10.2021 - 08:38 Uhr

Warum lagerst du das nicht in ein Command aus?

Hab da tatsächlich keine Ahnung, wie ich das entsprechend umsetzen soll.

hättest du mir da einen Ansatz?

20.10.2021 - 23:01 Uhr

Ich würde dein "Funktioniert nicht" in ein separates Command setzen und beim entsprechenden Event im XAML (nicht Code-Behind sondern über die Behaviors) setzen.
So könnte man es machen.

Ich könnte mir auch vorstellen, dass es einfacher über ReactiveUI geht - aber da fuchse ich mich gerade selbst noch ein. Warum änderst du denn die Collections direkt in den Properties? Ist meines Erachtens nach keine gute Idee und sollte getrennt geschehen.

Wo ändere ich denn die Collection in den Properties?

Meine Collection ist hier ja noch gar nicht dabei.

zudem geht bei mir absolut gar nichts über den Code-Behind.

alles via Databinding über eine MainWindowViewModel klasse.

20.10.2021 - 08:53 Uhr

Guten Morgen Zusammen.

Folgendes Problem habe ich aktuell.

ich habe eine Observable Collection<Adresse> welche ich an eine Listbox binde.
Durch anklicken eines eintrages (SelecetedItem) wird dieser Inhalt an ein Property Übergeben ( AddData von Adressdaten).
Dieser Inhalt von AddData wird dann an verschiedene Textboxen gebunden. Soweit klappt auch alles.

jetzt soll aber für Addresstyp anstelle einer Textbox eine vorgefüllte Combobox verwendet werden.
an diese ist der Inhalt von AddTyp gebunden.
(Addtyp.Adresstyp sowie AddTyp.ID_Adresstyp).

Wie bekomme ich das hin, dass er mir beim auswählen aus der Liste automatisch den Richtigen wert in der Combobox zuweist?
Bin da etwas verzweifelt.


<DockPanel Grid.Row="5" Grid.Column="1" Margin="5,5,5,5"  Visibility="{Binding Anzeigeändern, Converter={StaticResource bool2vis}, Mode=OneWay}">
                                        <ComboBox ItemsSource="{Binding Adresstypenliste}" SelectedItem="{Binding AddTyp.Adresstyp}" SelectedValue="{Binding AddData.AdressTyp}" HorizontalAlignment="Left" Height="25" Width="250" >
                                            <ComboBox.ItemTemplate>
                                                <DataTemplate>
                                                    <TextBlock Text="{Binding Adresstyp}" VerticalAlignment="Center" HorizontalAlignment="Left" />
                                                </DataTemplate>
                                            </ComboBox.ItemTemplate>
                                        </ComboBox>
                                    </DockPanel>

<ListBox ItemsSource="{Binding Adressdatenliste}" SelectedItem="{Binding AddData}">
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Straße}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Hausnummer}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Plz}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Ort}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding Land}" Margin="5,0,5,0"/>
                                                    <TextBlock Text="{Binding AdressTyp}" Margin="5,0,5,0"/>
                                                </StackPanel>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                    </ListBox>


 private Adressdaten addData = new Adressdaten();
        public Adressdaten AddData
        {
            get => addData;
            set
            {
                if (value != addData)
                {
                    addData = value;

                    AddTyp.Adresstyp = Adressdatenliste.FirstOrDefault(x => x.AdressTyp == AddTyp.Adresstyp).ToString(); // Funktioniert nicht
                    RaisePropertyChanged();
                    ChangeAdressData = true;

                    

                }
            }
        }

 private Adresstypen addtyp = new Adresstypen();
        public Adresstypen AddTyp
        {
            get => addtyp;
            set
            {
                if (value != addtyp)
                {
                    addtyp = value;
                    RaisePropertyChanged();
                }
            }
        }


class Adresstypen : NotifyableBaseObject
    {
        private string adresstyp, id_Adresstyp;
        public string Adresstyp
        {
            get => adresstyp;
            set
            {
                if(value!= adresstyp)
                {
                    adresstyp = value;
                    RaisePropertyChanged();
                }
            }
        }

        public string ID_Adresstyp
        {
            get => id_Adresstyp;
            set
            {
                if(value != id_Adresstyp)
                {
                    id_Adresstyp = value;
                    RaisePropertyChanged();
                }
            }
        }



    }

20.10.2021 - 08:44 Uhr

Ich habe das Problem hinbekommen:

im Konstruktor kommt folgendes rein:


 Searchable = Personendatenliste;
            Listable = new CollectionViewSource();
            Listable.Source = this.Searchable;
            Listable.Filter += ApplyFilter;


 public ObservableCollection<PersonenDaten> Searchable { get; set; }
        internal CollectionViewSource Listable { get; set; }
        public ICollectionView GetListable { get => Listable.View; }

        private void ApplyFilter(object sender, FilterEventArgs e)
        {
            PersonenDaten search = (PersonenDaten)e.Item;
            if (string.IsNullOrEmpty(this.Filter) || this.Filter.Length == 0)
            { e.Accepted = true; }
            else
            {
                e.Accepted = search.Fullname.Contains(Filter);
                RaisePropertyChanged();
            }


        }

        private string filter;
        public string Filter
        {
            get => this.filter;
            set
            {
                if (value != filter)
                {
                    this.filter = value;
                    //RaisePropertyChanged();
                    Listable.View.Refresh();
                    RaisePropertyChanged(nameof(Filter));
                }
            }
        }

Danke an alle, die mir geholfen haben.

11.10.2021 - 15:42 Uhr

Leg für ICollectionView phrasesView eine Eigenschaft an und binde daran.

Und bei Filter ist RaisePropertyChanged(nameof(AnagramViewModel)) zurzeit sinnlos, da dies keine Eigenschaft (sondern eine Methode) darstellt. Hier mußt du dann den Namen der obigen Eigenschaft setzen.

PS: Ich meinte den Klassennamen PersonenDaten sowie die Eigenschaften PersData und Personendaten. Es ist aus den Namen nicht ersichtlich, was sich auf eine Person oder auf mehrere bezieht (analog für KontaktDaten).
Edit: Dazu habe ich den englischen Artikel
>
gefunden.

ah, ok.

also die Liste Personendaten bezieht sich auf eine Sammlung von Personen => PersData, welche durch die Klasse PersonenDaten bestimmt werden.

hab eben mal etwas umgestellt, da ich gemerkt habe, das AnagramViewModel der konstruktor war von dem Beispiel 😉


 public MainWindowViewModel()
        {
            this.Abfrage = new DelegateCommand((o) =>
            { Personendaten.Clear(); Datenabfrage(); });
            this.weitereAbfrage = new((o) => { Kontaktdaten.Clear(); KontaktDatenabfrage(PersData.ID); AdressDatenabfrage(PersData.ID); });
            this.Speichern = new DelegateCommand((o) => { Datenänderungspeichern(); });
            this.AdresseSpeichern = new((o) => { Adressänderungspeichern(); });
            Newlist = Personendaten;
            phrasesView = CollectionViewSource.GetDefaultView(Newlist);
            phrasesView.Filter = o => string.IsNullOrEmpty(Filter) || ((string)o).Contains(Filter);
        }

......

  public ObservableCollection<PersonenDaten> Newlist
        {
            get ; set;
        }
    

    private ICollectionView phrasesView;

    string filter;
    public string Filter
    {
        get => filter;
        set
        {
            if (value != filter)
            {
                filter = value;
                phrasesView.Refresh();
                RaisePropertyChanged(nameof(Filter));
            }
        }
    }

leider hab ich da jetzt halt das problem, dass er mir den Fehler bringt, dass er den string bei ((string)o.)contains(Filter) nicht auflösen kann, da er keinen string hat, sondern nur die Objekte aus der Collection personendaten.

glaub muss mir da einen eigenen filter schreiben, kann das sein?

11.10.2021 - 12:20 Uhr

Du mußt dann für die ICollectionView eine eigene Eigenschaft erzeugen und diese dann an die ListBox binden (statt Personendaten). Und diese muß dann entweder die komplette Liste oder aber die gefilterten Daten liefern, je nach Filter.

PS: Der Name Personendaten ist ungünstig gewählt, da du ihn sowohl in der Einzahl als auch Mehrzahl (ObservableCollection<>) benutzt.

Wo verwende ich denn den Namen in der Einzahl??

Personendaten ist nur der name der ObservableCollection, welche von der klasse PersonenDaten befüllt wird.( Groß/Kleinschreibung bitte beachten)

Sollte dass dann so aussehen??


public ObservableCollection<PersonenDaten> Newlist { get; private set; }

        public ICollectionView phrasesView; 
        public void AnagramViewModel()
        {
            Newlist = Personendaten;
            phrasesView = CollectionViewSource.GetDefaultView(Newlist);
            phrasesView.Filter = o => string.IsNullOrEmpty(Filter) || ((string)o).Contains(Filter);
        }

11.10.2021 - 10:25 Uhr

Guten Morgen zusammen.
Ich hänge nun seit ein paar Tagen vor folgendem Problem:

ich habe eine ObservableCollection<Klasse> name welche ich als ItemSource an eine ListBox gebunden habe.

nun möchte ich über eine TextBox diese Liste Filtern.

Im Netz habe ich da verschiedene Ansätze schon gefunden, leider jedoch alle nur als CodeBehind, oder als Win-Form-style.
beides bringt mich jedoch nicht weiter.

Die ObservableCollection wird aus einer Datenbank heraus gefüllt.

mein Ansatz war jetzt mit ICollectionView zu arbeiten, jedoch funktioniert das leider nicht wie gewünscht.

Könnte mir da bitte jemand weiterhelfen?

Auszug aus dem XAML


 <GroupBox Header="Suchen" Grid.Row="0" Margin="5,5,5,5" Background="AliceBlue">
                <TextBox TextWrapping="Wrap" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" Width="200" Text="{Binding Path=Filter, UpdateSourceTrigger=PropertyChanged}"/>
            </GroupBox>
            <GroupBox Header="Gefundene Personen" Grid.Row="1" Margin="5,5,5,5">
                <ListBox Margin="5,5,5,5" ItemsSource="{Binding Personendaten}" SelectedItem="{Binding PersData}"  >

Auszug aus dem MainWindowViewModel


using Microsoft.Data.Sqlite;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace MVVM_Adressdatenbank
{
    class MainWindowViewModel : NotifyableBaseObject
    {

        public MainWindowViewModel()
        {
            this.Abfrage = new DelegateCommand((o) => { Personendaten.Clear(); Datenabfrage(); });
            this.weitereAbfrage = new(

                (o) => { Kontaktdaten.Clear(); KontaktDatenabfrage(PersData.ID); AdressDatenabfrage(PersData.ID); });
            this.Speichern = new DelegateCommand((o) => { Datenänderungspeichern(); });
            this.AdresseSpeichern = new((o) => { Adressänderungspeichern(); });

        }

        public bool HasNonZeroValue => PersData.Vorname != null;
        

        private ObservableCollection<PersonenDaten> personendaten = new ObservableCollection<PersonenDaten>();

        public ObservableCollection<PersonenDaten> Personendaten
        {
            get => personendaten;
            set
            {
                if (personendaten != value)
                {
                    personendaten = value;
                    RaisePropertyChanged();
                    
                }
            }
        }

        public ICollectionView phrasesView; 
        public void AnagramViewModel()
        {         
            phrasesView = CollectionViewSource.GetDefaultView(Personendaten);
            phrasesView.Filter = o => string.IsNullOrEmpty(Filter) || ((string)o).Contains(Filter);
        }
        string filter;
        public string Filter
        {
            get => filter;
            set
            {
                if (value!=filter)
                {
                    filter = value;
                    //RaisePropertyChanged();
                    RaisePropertyChanged(nameof(AnagramViewModel));
                }
            }
        }
       
       
        private ObservableCollection<KontaktDaten> kontaktdaten = new ObservableCollection<KontaktDaten>();
        public ObservableCollection<KontaktDaten> Kontaktdaten
        {
            get => kontaktdaten;
            set
            {
                if (kontaktdaten != value)
                {
                    kontaktdaten = value;
                    RaisePropertyChanged();
                   
                }
            }
        }

       

        KontaktDaten kontData = new KontaktDaten();
        public KontaktDaten KontData
        {
            get => kontData;
            set
            {
                if (kontData != value)
                {
                    kontData = value;
                    RaisePropertyChanged();
                }
            }
        }
        PersonenDaten persData = new PersonenDaten();
        public PersonenDaten PersData
        {
            get => persData;
            set
            {
                if (persData != value)
                {
                    persData = value;
                    RaisePropertyChanged();
                    RaisePropertyChanged(nameof(HasNonZeroValue));
                    
                    
                }
            }
        }

        public DelegateCommand Abfrage
        {
            get; set;
        }

        public DelegateCommand weitereAbfrage { get; set; }

        public DelegateCommand Speichern { get; set; }
        public DelegateCommand AdresseSpeichern { get; set; }

        public event EventHandler Safesucces;

        Datenbankzugriff zugriff = Datenbankzugriff.GetDBZugriff();

        private void Datenabfrage()
        {
            
            SqliteConnection connect = zugriff.connect();
            //string datenabfrage = "Select ID_Person, Vorname, Nachname, Geburtsdatum, Geburtsname FROM Person";
            string datenabfrage = "Select p.ID_Person, a.ID_Adresse, Vorname, Nachname, Geburtsname, Geburtsdatum, Straße, Hausnummer, Postleitzahl, Ort, Land, Typ_Name From Person p JOIN Person_Adresse pa ON " +
                "p.ID_Person = pa.ID_Person " +
                "JOIN Adresse a ON pa.ID_Adresse = a.ID_Adresse " +
                "JOIN Adress_Typ at ON pa.ID_Adress_Typ = at.ID_Adress_Typ ";
                
            SqliteCommand com = new(datenabfrage, connect);

            connect.Open();
            SqliteDataReader reader = com.ExecuteReader();
            if (reader.HasRows)
                while (reader.Read())
                {
                    Personendaten.Add(new PersonenDaten
                    {
                        ID = reader.GetString(reader.GetOrdinal("ID_Person")),
                        Vorname = reader.GetString(reader.GetOrdinal("Vorname")),
                        Nachname = reader.GetString(reader.GetOrdinal("Nachname")),
                        Geburtsdatum = reader.GetString(reader.GetOrdinal("Geburtsdatum")),
                        Geburtsname = reader.GetString(reader.GetOrdinal("Geburtsname")),
                        Straße = reader.GetString(reader.GetOrdinal("Straße")),
                        Hausnummer = reader.GetString(reader.GetOrdinal("Hausnummer")),
                        Plz = reader.GetString(reader.GetOrdinal("Postleitzahl")),
                        Ort = reader.GetString(reader.GetOrdinal("Ort")),
                        Land = reader.GetString(reader.GetOrdinal("Land")),
                        AdressTyp = reader.GetString(reader.GetOrdinal("Typ_Name")),
                        ID_Adresse=reader.GetString(reader.GetOrdinal("ID_Adresse"))
                    });


                
                }


            connect.Close();
        }

}


20.09.2021 - 11:07 Uhr

Ok, super. dann werde ich das mal ausprobieren.

20.09.2021 - 10:57 Uhr

bei einem Group by, kann ich ja nur nach einer Spalte gehen.

möchte aber gerne Zeitgleich alle Spalten, wo ich mehrere ergebnisse zu 1 Person habe, in einer Combobox anzeigen lassen.

ist das überhaupt möglich?

20.09.2021 - 10:51 Uhr

muss mich tatsächlich bei allen Entschuldigen.
über eine klasse mit meinen Ergebnissen, und daraus dann eine Liste ziehen hat es funktioniert.

bitte seht es mir nach, ich stehe noch recht am Anfang und versuche manches komplizierter anzugehen, als es tatsächlich ist.

vllt hat ja noch einer eine Idee, wie ich nun mehrfach ergebnisse rausbekomme.

ich hab z.b. pro Person mehrere Email-adressen und/oder mehrere Telefonnummern. oder aber auch mehrere adressen / person( zweitwohnsitz innland/ zweitwohnsitz ausland, rechnungsadresse, ect.

gibt es da eine möglichkeit nur diese Columns in eine Combobox anzeigen zu lassen??

20.09.2021 - 09:30 Uhr

Nein musst du nicht, und deine Recherchen waren wohl auch von falschen Angaben gekrönt.
Wenn du per Nuget entweder System.Data.SQLite oder Microsoft.Data.SQLite installierst hast du im Namespace auch einen SQLiteDataAdapter

Ganz abgesehen davon, nein, wenn du Klassen und einen ORM benutzt erstellst du eine Liste mit allen Daten der Abfrage, nicht mehrere listen

leider habe ich in WPF unter Core 5.0 keine SqliteDataAdapter.

ich habe nur einen SqliteDataReader.

20.09.2021 - 09:26 Uhr

ich vermute du hast mein Problem nicht ganz verstanden.

ich habe bereits eine fertige Datenbank im Databasename.db style.

diese wird nicht nochmal im Programm selbst erzeugt, sondern wird fertig eingebunden.

Nun habe ich dort mehrere Tabellen drin, die über PK und FK miteinander verbunden sind.

Der von mir gegeben Abfragestring holt jetzt aus diesen Tabellen alle Daten, die zusammenhängen.
und das für jeden Datensatz, der in der Tabelle "Person" aufgelistet ist.

nur wie kann ich jetzt diese Daten mir auch wieder anzeigen lassen?

Da Sqlite ja nicht mehr über den Dataadapter verfügt, welchen ich dann als DataSource an ein Datagrid binden kann( ähnlich wie bei SQL-Server oder MySQL).

20.09.2021 - 08:42 Uhr

Also benötige ich sozusagen eine Referenzklasse mit meinen Angaben, die ich gerne haben möchte.
Erstelle dann also eine neue Liste, von der Klasse in der while(reader.Read()) schleife und befülle diesen dann mit den Ergebnissen aus der Abfrage.
Sehe ich das so Richtig?

Weil das stelle ich mir schwierig vor. ich habe ja nicht nur einen Datensatz in der Datenbank.
das sind ja X-Datensätze.
wenn ich jetzt für jede Abfrage eine Liste erzeuge, dann habe ich ja dann X-Listen = X der Menge an Datensätzen.

20.09.2021 - 08:31 Uhr

Guten Morgen zusammen.

leider bin ich etwas am verzweifeln. Folgendes liegt vor:
ich habe eine embedded Sqlite DB. In dieser DB sind mehrere Tabellen.
Über einen Abfrage String hole ich mir nun die entsprechenden zusammenhängenden Daten aus dieser Tabelle.


string Abfrage = "Select p.Vorname, p.Nachname, p.Geburtsdatum, a.Straße, a.Hausnummer, a.Postleitzahl, a.Ort, a.Land, at.Typ_Name, t.Nummer, tt.Typ_Art, e.Mailadresse, et.Typ_Art " +  
                             "From Person p JOIN Person_Adresse pa ON p.ID_Person = pa.ID_Person " +
                             "Join Adresse a ON pa.ID_Adresse = a.ID_Adresse " +
                             "Join Adress_Typ at ON pa.ID_Adress_Typ = at.ID_Adress_Typ " +
                             "JOIN EMail e ON p.ID_Person = e.ID_Person " +
                             "JOIN EMail_Typ et ON e.ID_Email_Typ = et.ID_Email_Typ " +
                             "JOIN Telefon t ON p.ID_Person = t.ID_Person " +
                             "JOIN Telefon_Typ tt ON t.ID_Telefon_Typ = tt.ID_Telefon_Typ ";

Jetzt ist nur meine Frage, wie bekomme ich die erhaltenen Daten in meinem GridView angezeigt??

bei SQL-Server und MySQL würde ich jetzt mit einem SqlDataAdapter arbeiten und das dann in eine DataTable setzen.
und damit dann mein Datagrid füllen.

leider bietet mir das Sqlite diese option nicht. (aus Recherchen sollte dies aber wohl in früheren zeiten(bis 2015 etwa) noch möglich gewesen sein.

dann hat mir jemand gesagt, ich müsste mir Bindings arbeiten.

da steh ich aber gerade etwas auf dem schlauch wie das denn aussehen soll, und wie ich da was an wen binden muss.

klar ist mir, dass ich diese Property-Bindings im Xaml setzen muss, nur fehlt mir da grad der Ansatz zum Umsetzen dazu, und wie ich das im Code-Behind dann lösen kann.

danke schonmal für eure Tipps und Anregungen.

10.09.2021 - 15:07 Uhr

hm, ok..
also laut meinem Chef soll es da wohl etwas geben. nur er sagt mir nicht was das für eine ist.
er meinte nur, ich soll da mal suchen, mit welcher embedded DB das möglich ist.

10.09.2021 - 15:01 Uhr

Also habe ich tatsächlich in C# keine andere Möglichkeit als mit SQLite zu arbeiten.

was ist denn dieser .net Provider?

10.09.2021 - 13:24 Uhr

Verwendetes Datenbanksystem: aktuell SQlite

Hallo,

ich verzweifle gerade etwas.

ich benötige eine embedded DB welche FK und PK unterstützt und sich automatisch löschen bzw. updaten lässt.
also autoupdate und autodelete der FK-abhängigen Tabelle bei Änderungen.

SQlite funktioniert nur mit triggern. diese sollen aber nicht verwendet werden. Leider unterstützt SQlite keine FK in diesem Sinne.

Zitat:" SQLite unterstützt standartmäßig keine FOREIGN KEYS (Fremdschlüssel). Man kann diese zwar bei erstellen von Tabellen definieren, jedoch werden diese, wie gesagt, ignoriert."

Quelle: SQLite Foreign Keys erzwingen – GlossarWiki

Kann mir hier jemand helfen??

Die DB soll in ein C# WPF programm eingebettet werden, also teil von dem Programm sein und nicht zusätzlich installiert werden müssen, wie MySQL oder SQL-Server, ect.

02.07.2021 - 18:38 Uhr

also ich geb euch mal den kompletten Code

das hier kommt in Form1, die als aller erstes aufgerufen wird.


 public partial class Formen_auswahl : Form
    {
        public Formen_auswahl()
        {
            InitializeComponent();
        }

        public bool Rechteck_Auswahl = false;
        public bool Kreis_Auswahl = false;
               
        public int Anzahl_Formen()
        { 
            return int.Parse(Eingabe_Anzahl.Text);  
        }
        public int Breite_Rechteck()
        {
           return int.Parse(Eingabe_Breite.Text);
                   }

        public int Länge_Rechteck()
        {
            return int.Parse(Eingabe_Länge.Text);
        }

        public int Radius()
        {
            return int.Parse(Eingabe_Radius.Text);
        }

        private void Show_Graphic_Click(object sender, EventArgs e)
        {
            try
            {
                if (Rechteck_Auswahl == true)
                {
                    Form n = new Graphic_Rechteck(Breite_Rechteck(), Länge_Rechteck(), Anzahl_Formen());
                    n.Show();
                }
                if (Kreis_Auswahl == true)
                {
                    Form k = new Graphic_Kreis(Radius(), Anzahl_Formen());
                    k.Show();
                }
            }
            catch (Exception) { MessageBox.Show("Bitte geben Sie gültige Werte ein!"); }
        }

        private void Rechteck(object sender, EventArgs e)
        {
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            Eingabe_Anzahl.Visible = true;
            Eingabe_Breite.Visible = true;
            Eingabe_Länge.Visible = true;
            Rechteck_Auswahl = true;
            Show_Graphic.Visible = true;
            label5.Visible = false;
            Eingabe_Radius.Visible = false;
            Kreis_Auswahl = false;
            Eingabe_Radius.Clear();

        }

        private void Kreis(object sender, EventArgs e)
        {
            label2.Visible = true;
            Eingabe_Anzahl.Visible = true;
            label5.Visible = true;
            Eingabe_Radius.Visible = true;
            Kreis_Auswahl = true;
            Show_Graphic.Visible = true;

            label3.Visible = false;
            label4.Visible = false;
            Eingabe_Breite.Visible = false;
            Eingabe_Länge.Visible = false;
            Rechteck_Auswahl = false;
            Eingabe_Breite.Clear();
            Eingabe_Länge.Clear();
        }

        private void Cancel_Click(object sender, EventArgs e)
        {
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = false;
            Eingabe_Anzahl.Visible = false;
            Eingabe_Breite.Visible = false;
            Eingabe_Länge.Visible = false;
            Rechteck_Auswahl = false;
            label5.Visible = false;
            Eingabe_Radius.Visible = false;
            Kreis_Auswahl = false;

            Eingabe_Anzahl.Clear();
            Eingabe_Breite.Clear();
            Eingabe_Länge.Clear();
            Eingabe_Radius.Clear();

        }
    }
}


folgendes kommt dann in die Graphic_Kreis, die aufgerufen wird

[csharp]
public partial class Graphic_Kreis : Form
    {

        public Graphic_Kreis(int a, int b)
        {
            InitializeComponent();

            anzahl = b;
            radius = a;

            this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.UserPaint, true);
            this.UpdateStyles();

            for (int i = 0; i < anzahl; i++)
            {
                Point p = new Point();
                p.X = Zufallswert();
                Thread.Sleep(40);
                p.Y = Zufallswert();
                Startbereich.Add(p);
            }


        }
        #region Instanzieren von variablen
        public List<Point> Startbereich = new List<Point>();
        public List<Point> Änderungswerte = new List<Point>();
        private int kreisPosY;
        private int kreisPosX;
        private  int moveStepY = 4;
        private  int moveStepX = 4;

        private int anzahl, radius, positionx, positiony ;
        #endregion

        #region get_und_set_Methoden
        public int Positionx
        {
            set {positionx = value; }
            get {return positionx; }
        }
        public int PositionY
        {
            set { positiony = value; }
            get { return positiony; }
        }
        
        public int KreisPosX
        {
            set { kreisPosX = value; }
            get { return kreisPosX; }
        }
        public int KreisPosY
        {
            set { kreisPosY = value; }
            get { return kreisPosY; }
        }
           
        public int Anzahl
        {
            set { anzahl = value; }
            get { return anzahl; }
        }
        public int Radius
        {
            set { radius = value; }
            get { return radius; }
        }

        public int MoveStepY
        {
            set { moveStepY = 4; }
            get { return moveStepY; }
        }

        #endregion

        
        private int Zufallswert()
        {
            Random r = new Random();
            int a = r.Next(50, 200);
            return a;
        }

        private PictureBox pictureBox1 = new PictureBox();
        private Font fnt = new Font("Arial", 15);

        private void start_Click(object sender, EventArgs e)
        {
            Starter_Kreis.Enabled = true;
        }

        private void Graphic_Kreis_Load(object sender, EventArgs e)
        {

        }

        private void stop_Click(object sender, EventArgs e)
        {
            Starter_Kreis.Enabled = false;
        }

        private void Painting(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawString("Hier werden die Kreise angezeigt", fnt, Brushes.Blue, new Point(30, 30));
            e.Graphics.Clear(this.BackColor);
            foreach (Point p in Startbereich)
            {

                kreisPosY = p.Y; ;
                kreisPosX = p.X; ;
                e.Graphics.FillEllipse(Brushes.Red, kreisPosX, kreisPosY, radius, radius);
                e.Graphics.DrawEllipse(Pens.Red, kreisPosX, kreisPosY, radius, radius);
                Point c = new Point();
                c.Y = kreisPosY;
                c.X = kreisPosX;
                Änderungswerte.Add(c);
            }
        }

/* ------------------------------------ab hier ist der Fehler----------------------------*/    

        private void MoveCircle(object sender, EventArgs e)             //Grafiken bewegen
        {
 
            foreach (Point p in Änderungswerte)
            {
                int i = 0;
                kreisPosY = p.Y;
                do
                {
                    kreisPosY += moveStepY;
                    if (kreisPosY < 0 || kreisPosY + radius > this.ClientSize.Height)
                        kreisPosY = -moveStepY;
                    i++;
                } while (i<50);this.Refresh();
            }

            

        }

       
    }
}

02.07.2021 - 17:40 Uhr

doch. die funktioniert.
es geht alles bis auf die Bewegung der Objekte. im eigentlichen Code.

der code oben, welcher komplett ist, geht. Der läuft.

02.07.2021 - 16:44 Uhr

Meine Liste Änderungswerte enthält ja Punkte(Objekte von Point).
diese rufe ich mit der foreach-schleife ab.
Davon nehme ich mir dann die Y Koordinate, da ich nur möchte, dass der Kreis sich auf und ab bewegt.

bei nur einem Kreis geht das mit diesem Code:


 public partial class New_Jumpingball : Form
    {
        private int ballwidth = 50;
        private int ballhight = 50;
        private int ballPosX = 0;
        private int ballPosY = 0;
        private int moveStepX = 4;
        private int moveStepY = 4;

        private int ballPosX_Start = 0;
        private int ballPosY_Start = 0;

        public New_Jumpingball()
        {
            InitializeComponent();
            Startfestlegung();
            ballPosX_Start = ballPosX;
            ballPosY_Start = ballPosY;
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.UserPaint, true);
            this.UpdateStyles();

        }

        private void Startfestlegung()
        {
            ballPosY = Zufallspunkt();
            Thread.Sleep(25);
            ballPosX = Zufallspunkt();
        }

        private void PainCircle(object sender, PaintEventArgs e)
        {
            
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

            e.Graphics.Clear(this.BackColor);
            e.Graphics.FillEllipse(Brushes.Blue,ballPosX, ballPosY, ballwidth, ballhight);
            e.Graphics.DrawEllipse(Pens.Red, ballPosX, ballPosY, ballwidth, ballhight);

        }

        private void MoveBall(object sender, EventArgs e)
        {
            //update Koordinaten
            
            ballPosY += moveStepY;
            if(ballPosY <ballPosY_Start || ballPosY + ballhight> this.ClientSize.Height)
            {
                moveStepY = -moveStepY;
            }
            //update painting
            this.Refresh();
        }

        private int Zufallspunkt()
        {
            Random s = new Random();
            return s.Next(45, 80);
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }
    }
}

da ich jetzt aber nicht eine einzige Koordinate habe, sondern eine ganze Liste mit Koordinaten ist da nun die Frage, wie kann ich durch die Liste gehen, und jedesmal die Y-Koordinate ändern, sodass sich der Kreis dann bewegt.

also obigen Code so abändern, dass er auf eine Liste von Koordinaten angewendet werden kann. oder ist dies gar nicht möglich?

02.07.2021 - 14:36 Uhr

das bringt mich leider auch nicht weiter.
hier geht es ja immer nur um ein einzelnes Objekt.

ich hab jetzt aber z.b 2-x Kreise die sich bewegen sollen. und nicht nur 1 Kreis.

02.07.2021 - 13:15 Uhr

Hallo zusammen.

Alles in Win-Form-App(.NET Framework)

ich hab folgendes Problem:
Ich soll aktuell ein Programm erstellen, indem der User eine Form wählt(Rechteck oder Kreis), dann die Anzahl der Formen eingibt und dann die entsprechenden Informationen:
Breite + Länge, oder eben Radius.

dies soll dann auf einer weiteren Form grafisch dargestellt werden. Bis hier her kein Problem.

Jetzt sollen diese aber von der Position, wo sie entstehen(derzeit und in Zukunft auch Zufallsposition) auf den Bodenfallen und wieder zur Ausgangsposition zurückkehren.

Mit einem einfachen "Ball" oder auch Kreis habe ich das schon hinbekommen.
Timer + folgenden Code:


 private void MoveBall(object sender, EventArgs e)
        {
            //update Koordinaten
            
            ballPosY += moveStepY;
            if(ballPosY <ballPosY_Start || ballPosY + ballhight> this.ClientSize.Height)
            {
                moveStepY = -moveStepY;
            }
            //update painting
            this.Refresh();
        }

Nun ist es aber so, dass ich ja mehr als nur ein Objekt habe, welches sich bewegen soll, und diese Anzahl zur Laufzeit erst festgelegt wird.
Meine Idee war mit einer Liste zu arbeiten. Klappt bis zum anzeigen auch wunderbar.
nur das bewegen will nicht so.

Hat da einer eine Idee dazu.

hier mein Code-ansatz


 private void MoveCircle(object sender, EventArgs e)             //Grafiken bewegen
        {

           
            foreach (Point p in Änderungswerte)
            {
                
                kreisPosY = p.Y;
                kreisPosY += MoveStepY;
                if (kreisPosY < 0 || kreisPosY + radius > this.ClientSize.Height)
                    kreisPosY = -MoveStepY;
   
            }

           this.Refresh();

        }

30.06.2021 - 09:55 Uhr

Hy,

es ist der Standard-Rechner.

Es ging nur darum, dass wenn ich einen Operator gedrückt habe und dann feststelle, dass es doch der falsche ist, dann den neuen drücken kann und er diesen übernimmt.
(sorry für Bandwurmsatz)

30.06.2021 - 09:20 Uhr

Ok, hab es hinbekommen.

mit einer If-else verzweigung direkt am anfang auf den Boolean-wert von opperation pressed.

30.06.2021 - 08:57 Uhr

Hallo zusammen,

ich habe folgendes Problem ( Nachbau eines Win-10 Taschanrechners mit Win-Form-App (.NET Framework)):
wenn ich jetzt eine zahl eingeben und dann die Opperator taste drücke, dann verlangt er nach einer weiteren Zahl.
Wenn ich nun aber feststelle, dass ich den Falschen Opperator geklickt habe, so möchte ich diesen durch drücken des richtigen Opperators ändern(so wie im Win-10 rechner auch).
Folgende Lösungsansätze habe ich schon versucht:
try-catch um die double a Variabel, wo diese Geparst wird. ---> Programm hängt sich auf und reagiert gar nicht mehr. Keine Fehlermeldung.
Versucht im Anschluss mit einer Sprungmarke zu arbeiten --> selbiges Problem.

Jetzt ist meine Frage, wo ist mein Denkfehler.
Hab ich das Abfangen der falschen Eingabe zu früh/zu spät angesetzt?
Gibt es eine alternative Möglichkeit?

Unten ist der Auszug aus dem Code, den es betrifft.


private void opperator_click(object sender, EventArgs e)        //Rechenopperationen ausführen
        {
        
            Button b = (Button)sender;
           
                
            opperation_pressed = true;
            opperatoren = b.Text;
            double a = Parsewert(Anzeigefeld.Text);

                if (value == 0)
                {
                    value = a;
                    zwischenanzeige.Text = value + " " + opperatoren;
                    o = b.Text;
                    opperation_pressed = false;
                }
                else
                {
            
                    switch (o)
                    {
                        case "+":
                            Verarbeitung(value, addieren(value, a), b);
                            break;

28.06.2021 - 15:13 Uhr

alles klar. Vielen dank für die Ausführung.

28.06.2021 - 14:39 Uhr

entschuldigung, aber diese antwort ist doch arg unnütz.
ich möchte nicht wissen, wie ich das im System umstelle,

sondern wie ich diese Option in eine Anwendung programmiere, mit Win Form APP(.Net Framework) 4.8

in Win Form Apps (.NET) kann ich da leider nur die entsprechenden Voreingestellten Farben wählen.

Es sollte aber doch i-wie möglich sein, dass sich das Programm zur Laufzeit an die jeweilige Benutzerfarbe anpasst.

28.06.2021 - 14:13 Uhr

Hallo zusammen,

kann mir einer sagen, wie ich in einem Programm das ganze so einstellen kann, dass sich die Tastenfarben ändern, je nach design?
also wenn z.b. ein Win-user bei sich das helle oder dunkle Design voreingestellt hat, dass dann auch das Programm entsprechend darauf reagiert.

Wäre super, wenn mir da einer helfen könnte.

Versucht hab ich das mal mit den Control-Farben. aber das bringt mich ja nicht wirklich weiter.
Zudem stimmen die auch nicht mit den tatsächlichen System-Farben.

Verwendet wird Windows Forms App (.NET Framework)

24.06.2021 - 11:33 Uhr

Ich weiß jetzt nicht, ob es noch hier mit reinpasst,
aber bei dem Win10 Taschenrechner habe ich ja diese History, die erst ab einer bestimmten Fenstergröße erscheint.
Hat jemand eine Ahnung, wie ich das entsprechend umsetzen kann?
Wird das rein über Einstellungen getätigt?
nach was müsste ich da suchen?

23.06.2021 - 17:06 Uhr

das mit dem TableLayout hat super geklappt.

mit Anchor und Dock habe ich leider nicht diese Dynamische Vergrößerung, wenn ich das Fenster groß, bzw. kleinziehe.

23.06.2021 - 13:54 Uhr

Hallo, ich mal wieder 😁

ich suche aktuell verzweifelt, wie ich es schaffe, dass sich die Elemente in meiner Forms bei Veränderung der Fenstergröße prozentual mit anpassen.
Hab das schon mit Anchor versucht. Das Problem ist nur, dass ich ja diesen Taschenrechner von Win10 nachbauen soll.
nun zieht der mir zwar die Tasten mit, aber i-wann überschneiden die sich.
Des weiteren soll der ab einer bestimmten Größe das Verlaufsfenster (eine Textbox) ausblenden und nicht mehr anzeigen.
Habe dann noch 1 Textbox für meine Eingabe-zeile sowie ein Label, für diese zwischenanzeige, welche ebenfalls mit wachsen/schrumpfen sollen.

Hat da jemand eine Idee, nach was ich da genau suchen müsste?
Ist das rein in den Einstellungsmöglichkeiten der GUI Form möglich?

Bitte um Hilfe.

ein verzweifelter Umschüler

23.06.2021 - 13:47 Uhr

Hallo,

sorry dass ich mich erst so spät zurückmelde.

Also ich hab das Problem jetzt mit einer Liste und einer normalen Text-Box gelöst.

Die Anzeige dann entsprechend mit folgendem Aufruf:

string.Join(Environment.NewLine,Verlauf.ToArray());

damit klappt das wunderbar.

20.06.2021 - 11:13 Uhr

ähm, ja klar.
Also der erste anlauf scheiterte daran, dass ich versucht habe eine List<string> Verlauf zu erstellen.
Hat ja soweit auch geklappt.
Dann ein verlauf.Add(zwischenanzeige) // das ist das Label, wo ich den zwischenstand anzeigen lasse, also eingegebene Zahlen + Operator.

dann hab ich ein DataGridView: Anzeiger.Datasource = verlauf

leider gibt der mir da nur i-welche komischen lenght werte aus. also nicht das, was ich eigentlich gern hätte.

hab ich da i-wie einen Denkfehler drin?
Benötige ich da noch eine DataTable dazwischen, so wie wenn ich daten aus einer DB abrufe?

19.06.2021 - 18:01 Uhr

Hallo zusammen.
Ich bin neu hier im Forum.
Kurz zu mir: ich bin 35 Jahre jung und mache derzeit eine Umschulung zum FiAE(06/20 - 06/22).
Seit Freitag, 18.06.2021 bin ich nun im Pflichtpraktikum.
In meinem Praktikumsbetrieb habe ich nun als Einstiegsaufgabe folgendes bekommen:
Ich soll den Win-10 Taschenrechner 1:1 nachbauen.
Ok. Soweit so gut.
Funktionieren tut auch alles, nur jetzt kommt die Crux: der Win-10 Taschenrechner hat doch diese Verlaufsanzeige.
Meine Überlegung war nun, dass ich diese ganzen Zwischenschritte, welche gemacht werden, in einer List speichere, diese dann wieder auslese und über ein Data-Grid-View anzeigen lassen.
Leider funktioniert das überhaupt nicht.
Mein Ausbilder meint, ich solle mich mal über ein Dynamic-Array und einer formatierbaren Textbox nachdenken.
Nun meine Frage an euch: Kann das so klappen? und wenn ja, wie sollte ich das umsetzen?

Vielen Dank im Voraus.