Laden...

Forenbeiträge von mezzo80 Ingesamt 28 Beiträge

19.08.2024 - 18:33 Uhr

Hallo

Ich versuche gerade eine DataGrid in einer SQLite Datenbank zu Speichern, Das auslesen habe ich schon

Hier mal mein Code.

XAML:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="0.5*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="36,35,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="150" Height="37"/>
        <Button x:Name="button_AddColumn" Click="button_AddColumn_Click" Content="Button" HorizontalAlignment="Left" Margin="219,39,0,0" VerticalAlignment="Top" Height="33" Width="120"/>

        <DataGrid x:Name="myDataGrid" Grid.Row="1" />

    </Grid>

xaml.cs zum Testen habe ich jetzt mal kein MVVM gemacht, erst muss ich die Funktion lernen

    public partial class MainWindow : Window
    {
        DataTable myDataTable = new DataTable();
        SQLiteConnection myConnection = new SQLiteConnection();
        SQLiteCommand myCommand = new SQLiteCommand();
        DataSet myDataSet = new DataSet();

        
        public MainWindow()
        {
            InitializeComponent();

            myDataTable.TableName = "test";

            myConnection.ConnectionString = @"Data Source = myDataBase.db";
            myCommand = myConnection.CreateCommand();
            myConnection.Open();
            SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from test", myConnection);

            adapter.Fill(myDataTable);
            myDataGrid.ItemsSource = myDataTable.AsDataView();
            myConnection.Close();
        }

        private void button_AddColumn_Click(object sender, RoutedEventArgs e)
        {
            
            
            myConnection.ConnectionString = @"Data Source = myDataBase.db";
            myCommand = myConnection.CreateCommand();
            myConnection.Open();
            SQLiteDataAdapter adapter = new SQLiteDataAdapter("select * from test", myConnection);

            //DataSet myDataSet = new DataSet();

            adapter.Fill(myDataTable);
            myDataTable.AcceptChanges();
            myDataTable.Columns.Add(textBox.Text);
            


            myDataGrid.ItemsSource = myDataSet.Tables;
            //SQLiteCommandBuilder builder = new SQLiteCommandBuilder(adapter);
            //adapter.UpdateCommand = builder.GetUpdateCommand();
            //   adapter.TableMappings.Clear();
            //   adapter.TableMappings.Add(myDataTable);
            adapter.Update(myDataTable);
            myConnection.Close();

        }
    }

zu mein Problem ich erstelle mit dem Textbox und Button ein neues Column diese will ich dann in DB Speichern.

Ich könnte es auch auf einem andern weg machen, aber ich möchte versuchen, das er mir das DataGrid 1 zu 1 speichert, es soll auch gespeichert werden wenn in Row was drin steht.

Ich hoffe mir könnte da jemand helfen.

Gruß

Mezzo

18.08.2024 - 20:43 Uhr

Hallo,

Ich weiß nicht was in den ConnectionString rein kommen soll.

ich habe dieses SQLite and SQL Server Compact Toolbox - Visual Studio Marketplace installiert

Wie das ganze richtig funktioniert, keine Ahnung. Ich finde da auch keine Schritt für Schritt Anleitung.

Gruß

Mezzo

18.08.2024 - 18:55 Uhr

Hallo

Ich habe mit das SQLite bei die Erweiterungen Installiert.

Sie kann ich bei Datenquelle wenn ich auf Hinzufügen klicke das SQLite auswählen. Siehe Bild 01.png.

Wenn ich auf Verbindung Test gehe kommt das die Verbindung erfolgreich war. Aber wenn ich die ConnectionString meine test.db eintrage. kommt diese Fehlermeldung, siehe Bild 02.png

Was kann das sein?

Wie kann ich das mit dem SQLite richtig machen?

Gruß

Mezzo

14.08.2024 - 16:04 Uhr

ich habe es nun mit DataSet1 gelöst, ich wollte eigentlich eine andere Lösung ohne DataSet1.xsd machen.

13.08.2024 - 11:49 Uhr

Hallo ich bräuchte euere Hilfe

Ich weiß nicht wie ich in ein DataGrid ein Bild anzeigen lassen kann und wie es mit dem Binding dann richtig funktioniert.

Ich habe eine DataTabele siehe Code

DataTable myDataTable = new DataTable();

public MainDataGridList()
{
    InitializeComponent();
    myDataTable.Columns.Add("Images");
    myDataTable.Columns.Add("Name");
    myDataTable.Rows.Add(@"c:\myBild\01.jpg", "Bild1");
    myDataTable.Rows.Add(@"c:\myBild\02.jpg", "Bild2");
    myDataTable.Rows.Add(@"c:\myBild\03.jpg", "Bild3");

    myDataGrid.ItemsSource = myDataTable.Rows;
}

WPF

<DataGrid Grid.Row="2" x:Name="myDataGrid">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Images">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Height="25" Width="25" Source="{Binding Images}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Name">
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

Vielleicht kann mir jemand ein Beispiel geben wie man das mit DataGrid und einer Tabelle es richtig machen kann.

Gruß

Mezzo

13.07.2024 - 18:46 Uhr

Sorry hab den fehler gefunden, ich hatte meine Zahl durch 10 geteilt, ich muss die Zahlen dann immer Teilen bei 2 komma stellen muss ich durch 100 teilen.

13.07.2024 - 18:37 Uhr

Hallo,

Danke für deine Antwort

Mit einer Komma stelle funktioniert das gut. aber wenn ich nur das F benutze dann ist es nicht richtig.

Text="{Binding test03, StringFormat=F}"

Bei einen Wert 30 habe ich dann 3.00 aber es sollte dann 0.30 sein.

Bei einen Wert von 305 habe ich dann die Anzeige 30.50 sollte aber 3.05 sein.

Gibt es da eine andere Möglichkeit?

Gruß

Mezzo

13.07.2024 - 10:26 Uhr

Hallo

Wie kann ich in WPF die Formatieren der Anzeige für Zahlen machen?

z.b.

Ich habe in einer Variable Short eine Zahl 30. die Formatierung ist #.#, so soll es in der Textbox 3.0 angezeigt werden. Wichtig ist das die 0 auch angezeigt wird aber in der Variable soll es auf 30 bleiben.

Genauso wenn man in der Textbox nur eine Zahl 3 Einträgt soll dann in der Textbox 0.3 sein.

Die gibt es dann auch mit zwei komma stellen #.## da wäre der wärt 30 dann so 0.30.

Ist das irgendwie möglich ohne das ich den Wert in Double speichern muss und die Zahl 30/10 oder /100 machen muss.

Gruß

Mezzo

09.04.2024 - 18:05 Uhr

Hallo

Danke für die Antwort, diese habe ich heute Vormittag auch schon herausgefunden, hatte aber erst jetzt Zeit um zu Antworten. mein ViewModelBase hat dieses gefehlt.

hier der Richtige Code von

ViewModelBase.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace Variable_Test
{
    internal class ViewModelBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler PropertyChanged;

        protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
        {
            if (object.Equals(storage, value)) return false;
            storage = value;
            // Log.DebugFormat("{0}.{1} = {2}", this.GetType().Name, propertyName, storage);
            this.OnPropertyChanged(propertyName);
            return true;
        }

        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        #endregion INotifyPropertyChanged implementation
    }
}
07.04.2024 - 21:22 Uhr

das ist Schade, da ja diese Funktion ja auch in Visual Studio drin ist.

07.04.2024 - 13:27 Uhr

Hallo

Ich bin dabei dieses MVVM zu vertiefen, nur habe ich ein Problem, wenn ich einen String ändere dann bekommt mein Label nicht automatisch den neuen Inhalt.

Anbei sende ich mein Code, irgendwas habe ich da Falsch.

ViewModelBase.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace Variable_Test
{
    internal class ViewModelBase
    {
        #region INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler PropertyChanged;

        protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
        {
            if (object.Equals(storage, value)) return false;
            storage = value;
            // Log.DebugFormat("{0}.{1} = {2}", this.GetType().Name, propertyName, storage);
            this.OnPropertyChanged(propertyName);
            return true;
        }

        protected void OnPropertyChanged([CallerMemberName] string name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        #endregion INotifyPropertyChanged implementation
    }
}

Data.cs

namespace Variable_Test
{
    internal class Data : ViewModelBase
    {
        private string _Text1;

        public string Text1
        {
            get => _Text1;
            set => SetProperty(ref _Text1, value);  
        }
    }
}

DataRead.cs

namespace Variable_Test
{
    internal class DataRead : Data
    {
        public void Inhalt()
        {
            Text1 = "Hallo";
        }

        public void myText1(string Value)
        {
            Text1 = Value;
        }

    }
}

MainWindow.xaml.cs

using System.Windows;

namespace Variable_Test
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        DataRead myDate = new DataRead();
        public MainWindow()
        {            
            InitializeComponent();
            myDate.Inhalt();
            this.DataContext = myDate;
        }

        private void B_Button1_Click(object sender, RoutedEventArgs e)
        {
            myDate.myText1("Hallo Button");
            MessageBox.Show(myDate.Text1);
            
        }
    }
}

MainWindow.xaml

<Window x:Class="Variable_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Variable_Test"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        
        <Button x:Name="B_Button1" Content="Button" Click="B_Button1_Click" HorizontalAlignment="Left" Margin="370,74,0,0" VerticalAlignment="Top"/>
        <Label Content="{Binding Text1}" HorizontalAlignment="Left" Margin="81,84,0,0" VerticalAlignment="Top"/>
    </Grid>
</Window>

Was habe ich hier falsch?

oder was muss ich tun das der Inhalt in Label Content sich Automatisch ändert.

Gruß

Mezzo

07.04.2024 - 13:20 Uhr

Hallo,

Leider gefällt mir dieses auch nicht so besonders und vor allem will ich eigentlich nicht von anderen Tools abhängig sein.

Gibt es eine andere einfache Lösung? ohne das man ein Tool installieren muss?

Gruß

Mezzo

04.04.2024 - 11:52 Uhr

Hallo

Wenn ich eine WPF Anwendung mit .net 8.0 erstelle. gibt es eine Möglichkeit ein Setup für die Installation für die Software zu erstellen, die dann überprüft ob das .net 8.0 Framewort installiert ist. Wenn es nicht installiert ist, das es dann automatisch auf Windows installiert wird.

Das Problem ist das manche sich nicht mit Windows auskennen und da dann zu schreiben das vorher .net 8.0 Framework installiert werden muss, macht es für manche noch komplizierter.

Gruß

Mezzo

04.04.2024 - 10:41 Uhr

Hallo

Ich wollte mal nachfragen ob jemand Erfahrung mit Docking hat.

Ich habe diese Dirkster.AvalonDock gefunden. Aber ich kann diese nur mit WPF-Anwendung mit .NET Framework 6.0 oder 8.0 verwenden.

Ich möchte aber diese WPF-APP mit Framework 4.7.2 verwenden nur funktioniert das nicht.

Gibt es noch andere Dockings Tools die vielleicht besser sind, die auch Kostenlos sind.

Gruß

Mezzo80

16.01.2024 - 12:06 Uhr

Hallo

Anbei mein Beispiel.

        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            myAktualSpeed = Convert.ToInt32(Label_Speed.Content);
            myTime = myAktualSpeed / 60000;                 
            myTime1 = myTime * 500;                      
            myLaenge = myLaenge + myTime1;
            myGesamt = Convert.ToInt32(myLaenge);
            Label_LaengeMM.Content = myGesamt.ToString();
        }

Wenn ich z.b. bei AktualSpeed 10.000mm/min habe und der Timer gestartet wird. Dann habe ich in 1 minute nie die 10.000mm sondern immer unterschiedlich. mal 9350mm oder 8987mm aber ich komme nie auf die 10.000mm.

ich hatte vergessen diesen Code abschnitt zu Posten.

        private void myTimerRun()
        {
            dispatcherTimer.Interval = TimeSpan.FromMilliseconds(500);
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        }

Gruß

Mezzo

06.01.2024 - 20:23 Uhr

Hallo

Für mich scheint der dispatcherTimer so ungenau sein.

Ich will alle 200 Millisekunden eine Berechnung machen. Wenn ich die es ausführe und die Zeit Stoppe dann stimmt meine Berechnung nie überein.

Es scheint das er manchmal die Berechnung nicht durchführt.

Gruß

Mezzo

06.01.2024 - 20:14 Uhr

Formular.xaml

<Window x:Class="DataGrid_mit_DataSet.Formular"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGrid_mit_DataSet"
        mc:Ignorable="d"
        Title="Formular" Height="450" Width="400">
    
    <Grid>
        
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="2*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <Label Grid.Column="0" Grid.Row="0" Content="Vorname:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="0" x:Name="txt_Vorname" Text="{Binding Vorname}"/>

        <Label Grid.Column="0" Grid.Row="1" Content="Nachname:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="1" x:Name="txt_Nachname" Text="{Binding Nachname}"/>

        <Label Grid.Column="0" Grid.Row="2" Content="Strasse:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="2" x:Name="txt_Strasse" Text="{Binding Strasse}"/>

        <Label Grid.Column="0" Grid.Row="3" Content="PLZ:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="3" x:Name="txt_PLZ" Text="{Binding PLZ}"/>

        <Label Grid.Column="0" Grid.Row="4" Content="Ort:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="4" x:Name="txt_Ort" Text="{Binding Ort}"/>

        <Label Grid.Column="0" Grid.Row="5" Content="Telefon:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="5" x:Name="txt_Telefon" Text="{Binding Telefon}"/>

        <Label Grid.Column="0" Grid.Row="6" Content="E-Mail:" FontSize="24" FontFamily="Arial Rounded MT Bold" />
        <TextBox Grid.Column="1" Grid.Row="6" x:Name="txt_EMail" Text="{Binding EMail}"/>

        <Button Grid.Column="0" Grid.Row="7" Content="Abbrechen" IsCancel="True" />
        <Button x:Name="b_Speichern" Grid.Column="1" Grid.Row="7" Content="Speichern" Click="b_Speichern_Click" />

    </Grid>
    
</Window>

Formular.xaml.cs

using System.Windows;

namespace DataGrid_mit_DataSet
{
    /// <summary>
    /// Interaktionslogik für Formular.xaml
    /// </summary>
    public partial class Formular : Window
    {

        // Diese Veriablen sind nur zum zurücksenden der Daten an das MainWindow
        public string Vorname => txt_Vorname.Text;
        public string Nachname => txt_Nachname.Text;
        public string Strasse => txt_Strasse.Text;
        public string PLZ => txt_PLZ.Text;
        public string Ort => txt_Ort.Text;
        public string Telefon => txt_Telefon.Text;
        public string EMail => txt_EMail.Text;

        public Formular()
        {
            InitializeComponent();
        }

        private void b_Speichern_Click(object sender, RoutedEventArgs e)
        {
            //Hier wird bestätigt das der Button Speichern gedruckt wurde und wird an das MainWindow zurückgegeben und das Formular wird geschlossen.
            this.DialogResult = true;
        }
    }
}

FormularViewModel.cs

namespace DataGrid_mit_DataSet
{
    // Dieses ViewModel erbt von ViewModelBase, das ViewModelBase ist für dafür das geändertete Daten auch Angezeigt werden.
    internal class FormularViewModel : ViewModelBase
    {
        private string _Vorname;

        public string Vorname
        {
            get => _Vorname;
            set => SetProperty(ref _Vorname, value);
        }

        private string _Nachname;

        public string Nachname
        { 
            get => _Nachname;
            set => SetProperty(ref _Nachname, value);
        }

        private string _Strasse;

        public string Strasse
        {
            get => _Strasse;
            set => SetProperty(ref _Strasse, value);
        }

        private string _PLZ;
        public string PLZ
        {
            get => _PLZ; 
            set => SetProperty(ref _PLZ, value);
        }

        private string _Ort;
        public string Ort
        {
            get => _Ort; 
            set => SetProperty(ref _Ort, value);
        }

        private string _Telefon;
        public string Telefon
        {
            get => _Telefon; 
            set => SetProperty(ref _Telefon, value);
        }

        private string _EMail;
        public string EMail
        {
            get => _EMail; 
            set => SetProperty(ref _EMail, value);
        }

    }
}

Ich hoffe ich habe alles und ich hoffe man kann es gut verstehen.

Ohne Th69 hätte ich das nicht so verstanden, Danke nochmals

Gruß

Mezzo

06.01.2024 - 20:11 Uhr

DataGridFunktion.cs

using System.Data;


namespace DataGrid_mit_DataSet
{
    //Diese Klasse ist für die Funktionen zuständig
    internal class DataGridFunktion : MainWindowViewModel
    {
        // erstellen einen neuen Datensatz
        public void DataSetNeu(string Vorname, string Nachname, string Strasse, string PLZ, string Ort, string Telefon, string EMail)
        {
            ViewKontakte.Rows.Add("", Vorname, Nachname, Strasse, PLZ, Ort, Telefon, EMail);
        }

        // ändern ein Datensatz
        public void DataSetBearbeiten(DataGridDataSet.KontakteRow kontakteRow, string Vorname, string Nachname, string Strasse, string PLZ, string Ort, string Telefon, string EMail)
        {
            kontakteRow.Vorname = Vorname;
            kontakteRow.Nachname = Nachname;
            kontakteRow.Strasse = Strasse;
            kontakteRow.PLZ = PLZ;
            kontakteRow.Ort = Ort;
            kontakteRow.Telefon = Telefon;
            kontakteRow.EMail = EMail;
        }


        // Suchfunktion in DataGrid
        public DataGridDataSet.KontakteDataTable DataGridSuchen(string Suchtext, CBSpalte Spalte)

        {
            //Hier wird nochmal die Tabelle von DataSet eingebunden.
            DataGridDataSet.KontakteDataTable KontaktErgebnis = new DataGridDataSet.KontakteDataTable();

            //in dieser Variable werden die Suchergebnisse gespeichert
            string expression = "";

            // Hier wird abgefragt was in der ComboBox ausgewählt wurde
            // Wir fragen nur ab ob Alles ausgewäht wurde um alle Spalten zu durchsuchen.
            if (Spalte == CBSpalte.Alle)
            {
                //Bei dieser Schleife fangen wir mit 1 an, da in der Tabelle der erste eine ID ist die mit 0 anfängt
                //Die ID Spalte wollen wir nicht durchsuchen daher fangen wir mit i=1 an.
                //Ist die ID Spalte nicht vorhanden wird mit i=0 angefangen
                for (int i = 1; i < KontaktErgebnis.Columns.Count; i++)
                {
                    if (i > 1)
                        // dieses " OR " ist dafür weil wir alle Spalten durchsuchen
                        expression += " OR ";

                    //Hier wird die Spalten erstellt die wir haben.
                    string spalteErstellen = KontaktErgebnis.Columns[i].ColumnName;
                    //und in expression mit Spalten die ergebnisse eingetragen
                    //diese * ist dafür das Vor dem Eingabetext und nach den Eingabetext was anderes Stehen kann.
                    //wenn man aber genau das suchen will, was man Eingegeben hat müssen die zwei * raus.
                    expression += spalteErstellen + " LIKE '*" + Suchtext + "*'";
                }
            }
            // Wurde in der ComboBox eine genaue Spalte Ausgewählt dann geht es hier weiter
            else
            {
                //Hier wird das ergebnis von der Ausgewählten Spalte gesucht und gespeichert.
                expression = Spalte + " LIKE '*" + Suchtext + "*'";
            }

            //Nun muss es in DataGrid ja wieder zurück gegeben werden

            //Wir wird eine Zeile erstellt
            DataRow[] GefundeneDaten = ViewKontakte.Select(expression);

            //Wir ist eine Schleife wo unsere Gefunden Daten überprüft werden und Eingetragen werden.
            foreach (DataRow GefundeneData in GefundeneDaten)
            {
                KontaktErgebnis.Rows.Add(GefundeneData.ItemArray);
            }

            //Nun wird es wieder zurückgegeben.
            return KontaktErgebnis;
        }


        // Dies ist für die Ausgewählte Spalte
        // Wie die Namen sind ist nicht wichtig.
        // 0 ist der erste Item von der Combobox
        internal enum CBSpalte
        {
            Alle,           // Startet mit 0
            Vorname,        // 1
            Nachname,       // 2
            Strasse,        // 3
            PLZ,            // 4
            Ort,            // 5    
            Telefon,        // 6
            EMail           // 7
        }

    }
}

ViewModelBase.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace DataGrid_mit_DataSet
{
    internal class ViewModelBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged implementation
        public event PropertyChangedEventHandler? PropertyChanged;

        protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string? propertyName = null)
        {
            if (object.Equals(storage, value)) return false;
            storage = value;
            // Log.DebugFormat("{0}.{1} = {2}", this.GetType().Name, propertyName, storage);
            this.OnPropertyChanged(propertyName);
            return true;
        }

        protected void OnPropertyChanged([CallerMemberName] string? name = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }
        #endregion INotifyPropertyChanged implementation
    }
}
06.01.2024 - 20:08 Uhr

Hallo

Als erstes mal ein großes Dankeschön an Th69 der mir das sehr gut erklärt hat.

Anbei sende ich euch nun die Lösung.

MainWindow.xaml

<Window x:Class="DataGrid_mit_DataSet.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGrid_mit_DataSet"
        mc:Ignorable="d"
        Title="DataGrid aus DataSet auslesen" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />

            <RowDefinition Height="14*" />
        </Grid.RowDefinitions>

        <ToolBar VerticalAlignment="Top" Grid.RowSpan="3">
            <Button x:Name="B_Neu" Content="Neu" Click="B_Neu_Click"/>
            <Button x:Name="B_Bearbeiten" Content="Bearbeiten" Click="B_Bearbeiten_Click" />
            <Separator />
            <TextBox x:Name="txt_Suchen" Width="250" />
            <ComboBox x:Name="Combo_SuchSpalte" Width="150" SelectedIndex="0">
                <ComboBoxItem Content="Alles" />
                <ComboBoxItem Content="Vorname" />
                <ComboBoxItem Content="Nachname" />
                <ComboBoxItem Content="Strasse" />
                <ComboBoxItem Content="PLZ" />
                <ComboBoxItem Content="Ort" />
                <ComboBoxItem Content="Telefon" />
                <ComboBoxItem Content="EMail" />
            </ComboBox>
            <Button x:Name="B_Suchen" Content="Suchen" Click="B_Suchen_Click" />
        </ToolBar>

        <DataGrid Grid.Row="2" x:Name="DataGrid1" ItemsSource="{Binding ViewKontakte}" />


    </Grid>
</Window>

MainWindow.xaml.cs

using System.Windows;
using static DataGrid_mit_DataSet.DataGridFunktion;

namespace DataGrid_mit_DataSet
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        // ViewModel mit die Funktionen werden eingebunden für MainWindow
        DataGridFunktion MyDataSet = new DataGridFunktion();
        // auch das ViewModel für Formular XAML wird hier mit eingebunden um die Daten zum ändern zu übergeben
        FormularViewModel MyFormularViewModel = new FormularViewModel();
        
        public MainWindow()
        {
            InitializeComponent();

            // BeispielDateien zum Anschauen werden eingefügt
            MyDataSet.DataSetNeu("Hans", "Müller", "Weitestrasse 4", "45678", "Weithausen", "03548 / 5687", "HansM@email.com");
            MyDataSet.DataSetNeu("Alex", "Mair", "Mautstrasse 8", "78439", "Mauten", "07568 / 3769", "MairA@email.com");
            MyDataSet.DataSetNeu("Fritz", "Neumaier", "Neuestrasse 12", "69753", "Neudorf", "09348 / 6974", "fritz@neumaier.de");

            // Hier wird das DataContext für MainWindow eingefügt um die Inhalte der Variabeln Anzeigen zu lassen.
            this.DataContext = MyDataSet;
        }

        private void B_Neu_Click(object sender, RoutedEventArgs e)
        {
            // Hier wird das Formular Fenster eingebunden
            var MyFormular = new Formular();

            // Besser ist es das Formular Fenster als Dialog zu öffnen. Da dann das MainWindow deaktiviert ist.
            // durch die IF Abfrage wird geprüft ob der Button in Formularfenster ausgeführt wurde.
            // um somit die Daten in DataGrid zu speichern.
            if (MyFormular.ShowDialog() == true)
            {
                // Dies ist die Funktion zum einfügen der Daten in DataGrid diese wurde in DataGridFunktion erstellt.
                MyDataSet.DataSetNeu(MyFormular.Vorname, MyFormular.Nachname, MyFormular.Strasse, MyFormular.PLZ, MyFormular.Ort, MyFormular.Telefon, MyFormular.EMail);
            }
        }

        private void B_Bearbeiten_Click(object sender, RoutedEventArgs e)
        {
            // Hier wird das Formular Fenster eingebunden
            var MyFormular = new Formular();

            // hier wird abgerufen welche Zeile in DataGrid Markiert wurde und wird dann in MyRow gespeichert
            var MyRow = DataGrid1.SelectedItem as System.Data.DataRowView;
            // in MyItem werden dann die Inhalte der Zeilen gespeichert.
            var MyItem = MyRow.Row as DataGridDataSet.KontakteRow;

            // Hier werden die Daten an das Formular fenster übertragen.
            MyFormularViewModel.Vorname = MyItem.Vorname;
            MyFormularViewModel.Nachname = MyItem.Nachname;
            MyFormularViewModel.Strasse = MyItem.Strasse;
            MyFormularViewModel.PLZ = MyItem.PLZ;
            MyFormularViewModel.Ort = MyItem.Ort;
            MyFormularViewModel.Telefon = MyItem.Telefon;
            MyFormularViewModel.EMail = MyItem.EMail;

            // Das DataContext für das Formular fenster wird zugeordnet damit die Daten auch Angezeigt werden.
            MyFormular.DataContext = MyFormularViewModel;

            // Besser ist es das Formular Fenster als Dialog zu öffnen. Da dann das MainWindow deaktiviert ist.
            // durch die IF Abfrage wird geprüft ob der Button in Formularfenster ausgeführt wurde.
            // um somit die Daten in DataGrid zu speichern.
            if (MyFormular.ShowDialog() == true)
            {
                // Hier werden die Änderungen in DataGrid übertragen diese Funktion ist auch wieder in DataGridFunktion definiert. 
                MyDataSet.DataSetBearbeiten(MyItem, MyFormularViewModel.Vorname, MyFormularViewModel.Nachname, MyFormularViewModel.Strasse, MyFormularViewModel.PLZ, MyFormularViewModel.Ort, MyFormularViewModel.Telefon, MyFormularViewModel.EMail);
            }
        }

        private void B_Suchen_Click(object sender, RoutedEventArgs e)
        {
            CBSpalte spalte = (CBSpalte)Combo_SuchSpalte.SelectedIndex;
            DataGrid1.ItemsSource = MyDataSet.DataGridSuchen(txt_Suchen.Text, spalte);
        }
    }
}

MainWindowViewModel.cs


namespace DataGrid_mit_DataSet
{
    internal class MainWindowViewModel : ViewModelBase
    {
        public DataGridDataSet MyDataGridDataSet = new DataGridDataSet();
        // bei diesen Beispiel ist das ViewModel für MainWindow sehr sehr klein da die Tabellen alle in ein DataSet erstellt sind.

        // Hier wird das DataSet eingebunden, somit sind dann alle Spalten der Tabelle verfügbar.
        // Hat ein DataSet mehrere Tabellen dann muss jede einzelne Tabelle so eingefügt werden.
        public DataGridDataSet.KontakteDataTable ViewKontakte {  get; set; } = new DataGridDataSet.KontakteDataTable();

    }
}

Als Bilddatei habe ich die DataGridDataSet.xsd abgebildet.

Ich muss 2 oder 3 Antworten erstellen da diese Meldung kommt. "Die Nachricht ist zu lang. Maximal erlaubte Zeichen: 8000"

04.01.2024 - 10:02 Uhr

Hallo und allen noch ein gesundes neues Jahr.

Ich war leider Krank sorry für meine Späte Antwort.

Mir geht es hauptsächlich darum, wenn ein neues Window gestartet wird, wie man die Klassen mit übergibt.

Hier jetzt mal ein kleines Beispiel mit DataGrid und DataSet.

MainWindow XAML

<Window x:Class="Binding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Binding" d:DataContext="{d:DesignInstance Type=local:DataSetViewModel}"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <ToolBar Grid.Row="0" >
            <Button x:Name="B_Neu" Content="Neu" Click="B_Neu_Click"/>
        </ToolBar>

        <DataGrid x:Name="DataGrid1" Grid.Row="1" ItemsSource="{Binding Familie}"/>

        <StatusBar Grid.Row="2" />
    </Grid>
</Window>

MainWindow C#

using System.Windows;


namespace Binding
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        
        DataSetViewModel viewModelData = new DataSetViewModel();
        public MainWindow()
        {
            
            InitializeComponent();

            this.DataContext = viewModelData;

            //Beispiel Daten zum Test
            viewModelData.DataSetNew("Hans", "Mustermann", "Diesestraße 4", "12345", "Musterort");
 
            DataGrid1.ItemsSource = viewModelData.Familie;
        }

        private void B_Neu_Click(object sender, RoutedEventArgs e)
        {
            var window = new Window1
            {
                DataContext = viewModelData.MyDataSet
            };
            window.Show();
        }
    }
}

DataSetViewModel.cs

namespace Binding
{
    internal class DataSetViewModel
    {
        public DataSet1 MyDataSet = new DataSet1();

        public DataSet1.FamilieDataTable Familie = new DataSet1.FamilieDataTable();

        
        public void DataSetNew(string Vorname, string Nachnache, string Strasse, string PLZ, string Ort)
        {
           Familie.Rows.Add("", Vorname, Nachnache, Strasse, PLZ, Ort);
           
        }
    }
}

Window1 XAML

<Window x:Class="Binding.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Binding"
        mc:Ignorable="d"
        Title="Window1" Height="222" Width="371">
    <Grid>
        <Label Content="Vorname:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
        <Label Content="Nachname:" HorizontalAlignment="Left" Margin="10,41,0,0" VerticalAlignment="Top"/>
        <Label Content="Strasse:" HorizontalAlignment="Left" Margin="10,72,0,0" VerticalAlignment="Top"/>
        <Label Content="PLZ:" HorizontalAlignment="Left" Margin="10,103,0,0" VerticalAlignment="Top"/>
        <Label Content="Ort:" HorizontalAlignment="Left" Margin="185,107,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Margin="120,18,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="230"/>
        <TextBox HorizontalAlignment="Left" Margin="120,49,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="230"/>
        <TextBox HorizontalAlignment="Left" Margin="120,80,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="230"/>
        <TextBox HorizontalAlignment="Left" Margin="120,111,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="54"/>
        <TextBox HorizontalAlignment="Left" Margin="230,111,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>
        <Button Content="Speichern" HorizontalAlignment="Center" Margin="0,162,0,0" VerticalAlignment="Top" Width="95"/>

    </Grid>
</Window>

Window1 C#

using System.Windows;

namespace Binding
{
    /// <summary>
    /// Interaktionslogik für Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        
        public Window1()
        {
            InitializeComponent();
        }
    }
}

Ich habe noch eine DataSet1.xsd wo meine Tabelle drin ist.

Ich möchte nun das in Window1 in die Textboxen diese DataSet die ich in MainWindow habe gleich sind.

So das ich in Window1 in Codebehind auf das viewModelData.DataSetNew zugreifen kann. ohne das es in Window1 neu erstellt werden muss.

Gruß

Mezzo

29.12.2023 - 19:42 Uhr

Hallo

Danke für die Antwort, ich bin noch nicht soweit mit mein Code weil ich zuerst die Funktionen Lernen will.

Mein Vorhaben ist dies, Ich will ein DataGrid die mit ein DataSet verbunden ist.

in dem 2. Window möchte ich ein Formular machen, zum Hinzufügen von Daten.

ein nächstes Formular zum Ändern.

Dies möchte ich auf für das TreeView genauso haben.

Da werden von mir noch mehrere Fragen kommen. Ich habe mir gedacht ich lerne es am besten wenn ich ein Projekt starte.

in diesen Projekt habe ich, Ribbon, AvalonDock, DataGrid, TreeView, Controls, mehrere Window, SQLite und dann noch dazu in CSV Datei Exportieren, als PDF Datei und Drucken.

Ich denke bis morgen Abend kann ich euch ein Code von mein Projekt geben.

Gruß

Mezzo

29.12.2023 - 10:08 Uhr

Hallo Zusammen,

Ich versteh das mit dem Command so wenn man eine Abfrage oder eine andere Funktion mit den Click des Buttons machen will.

Das öffnen eines neues Window Fenster habe ich so verstanden das man diese durch das Click Funktion aufruft. oder liege ich da Falsch?

@BlonderHans

ich habe das mit der var viewmodel ausprobiert leider wird mit da null ausgegeben und nicht die Daten.

Das MessageBox ist jetzt nur für mich das ich sehe das die Daten auch übergeben werden. ist nicht die eigentliche Funktion.

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            var viewModel = DataContext as MyClass;
            string Text1 = viewModel.FirstName;
            MessageBox.Show(Text1);
        }
    }
28.12.2023 - 22:00 Uhr

Hallo

Danke für deine Antwort.

Das habe ich schon verstanden, wenn ich MyClass in Window1 in Codebehind lade, das dieser dann leer ist.

Ist es überhaupt möglich das ich MyClass von MainWindow in Window1 auch in Codebehind übergeben kann? Nicht nur als Datacontent.

28.12.2023 - 15:40 Uhr

Hallo

Ich habe mal eine kleine frage.

Ich habe in MainWindow.xaml ein Label, ein Textbox und ein Button

    <Grid>
        <Label Content="{Binding FirstName}" HorizontalAlignment="Left" Margin="57,71,0,0" VerticalAlignment="Top"/>
        <TextBox HorizontalAlignment="Left" Margin="80,199,0,0" TextWrapping="Wrap" Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="120"/>
        <Button Content="Button" Click="Button_Click" HorizontalAlignment="Left" Margin="389,155,0,0" VerticalAlignment="Top"/>

    </Grid>

In codebehind habe ich das drin.

    public partial class MainWindow : Window
    {
        MyClass viewModel = new MyClass();
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = viewModel;

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
           Window1 test = new Window1();
            test.DataContext = viewModel;
            test.Show();
        }
    }

hier noch MyClass.cs

    public class MyClass : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged implementation

        public event PropertyChangedEventHandler PropertyChanged;

        protected void Notify(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion INotifyPropertyChanged implementation
        public string FirstName
        {
            get { return _firstName; }
            set
            {
                if (value != _firstName)
                {
                    _firstName = value;
                    Notify("FirstName");
                }
            }
        }

        private string _firstName = "Naira";
    }

in mein Window1 habe ich nur eine Textbox.

Jetzt zu meiner Frage

Wenn ich aus MainWindow das Window1 öffne kann ich zwar in der Textbox die Werte ändern und in der MainWindow wird das Automatisch mit verändert das passt soweit.

Als nächstes möchte ich aber in Window1 im Codebehind direkt auf den String von FirstName zugreifen.

Wenn ich in Window1 in Codebehind die Zeile hinzufüge MyClass viewModel = new MyClass(); kann ich zwar mit viewModel.FirstName drauf zugreifen aber die Daten von MainWindow sind dann weg. Genauso wir es dann nicht Automatisch bei MainWindow umgeändert weil ich die Klasse dann ein Zweites mal eingebunden habe.

Wie kann man es lösen das die Verbindung der Klasse von MainWindow zu Window1 mit übernommen wird.

Kann mir bitte jemand ein Beispiel Code dafür geben.

Gruß

Mezzo

07.08.2023 - 21:05 Uhr

Wie sollte dann mein Code Behind dann aussehen?

Kannst du mir da bitte ein Beispiel geben. Wie man es richtig mit TreeView es macht.

Gruß

Mezzo

07.08.2023 - 16:58 Uhr
    <TreeView Name="myTreeView" ItemsSource="{Binding RootItems}" Grid.ColumnSpan="2" Margin="0,92,3,0" SelectedItemChanged="TreeView_SelectedItemChanged">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">

                        <Setter Property="FontWeight" Value="ExtraBold" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding ChildrenItems}">
                <TextBlock Text="{Binding Row.TreeView_Name}" />
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

ist das nicht Richtig so? es ist doch so wie bei MVVM oder?

07.08.2023 - 16:13 Uhr

Danke Abt und Th69

Könnt ihr mir bitte ein Beispiel geben wie ich es Richtig machen muss?

th69: Wie soll ich in Button_Click es richtig einfügen?

Gruß

Mezzo

07.08.2023 - 14:47 Uhr

Hallo

Ich bin neu hier im Forum und hoffe das man mir helfen kann.

Ich beschäftige mich gerade mit dem Thema TreeView ich habe die Aufteilung schon hinbekommen. Nur wenn ich ein Nodes hinzufüge dann wird es nicht Aktuallisiert.

Hier mein xaml code:

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="180*" />
            <ColumnDefinition Width="3" />
            <ColumnDefinition Width="500*" />
        </Grid.ColumnDefinitions>

        <GridSplitter Grid.Column="1" Width="3" HorizontalAlignment="Stretch" Background="#FF616060" />
        <Image Height="91" VerticalAlignment="Top" Margin="0,0,6,0"/>
        <TreeView Name="myTreeView" ItemsSource="{Binding RootItems}" Grid.ColumnSpan="2" Margin="0,92,3,0" SelectedItemChanged="TreeView_SelectedItemChanged">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                    <Setter Property="FontWeight" Value="Normal" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">

                            <Setter Property="FontWeight" Value="ExtraBold" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding ChildrenItems}">
                    <TextBlock Text="{Binding Row.TreeView_Name}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
        <TextBox Name="TextBox1" Grid.Column="2" HorizontalAlignment="Left" Margin="45,39,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="340"/>
        <Button Grid.Column="2" Content="Button" HorizontalAlignment="Left" Margin="85,159,0,0" VerticalAlignment="Top" Click="Button_Click"/>
    </Grid>

und hier mein C# Code:

    public partial class MainWindow : Window
    {
        DataSet1 DataSet_TreeView = new DataSet1();
        ObservableCollection<Data_Treeview> col = new ObservableCollection<Data_Treeview>();
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = this;
            DataSet_TreeView.Data_Treeview.Rows.Add("10", "", "test0");
            DataSet_TreeView.Data_Treeview.Rows.Add("11", "", "test1");
            DataSet_TreeView.Data_Treeview.Rows.Add("12", "10", "test01");
            DataSet_TreeView.Data_Treeview.Rows.Add("13", "12", "test02");
            foreach (DataRow row in DataSet_TreeView.Tables["Data_Treeview"].Rows) col.Add(new Data_Treeview((DataSet1.Data_TreeviewRow)row));
            cvs.Source = col.Where((d) => d.TreeViewUnterNummer == "");
           
        }


        private CollectionViewSource cvs = new CollectionViewSource();
        

        public ICollectionView RootItems { get => cvs.View; }

        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            TreeView treeView = sender as TreeView;
            Data_Treeview item = treeView.SelectedItem as Data_Treeview;

            if (item == null)
                return;

            MessageBox.Show("Nummer: " + item.TreeViewNummer);

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            
            DataSet_TreeView.Data_Treeview.Rows.Add("15", "", TextBox1.Text);
            
        }
    }

    public class Data_Treeview
    {
        public Data_Treeview(DataSet1.Data_TreeviewRow row) { this.Row = row; this.dt = (DataSet1.Data_TreeviewDataTable)row.Table; this.ds = (DataSet1)row.Table.DataSet; }
        DataSet1 ds;
        DataSet1.Data_TreeviewDataTable dt;

        public DataSet1.Data_TreeviewRow Row { get; set; }
        public string TreeViewNummer { get => Row.TreeView_Nummer; set { Row.TreeView_Nummer = value; } }
        public string TreeViewUnterNummer { get => Row.TreeView_UnterNummer; set { Row.TreeView_UnterNummer = value; } }
        public string TreeViewName { get => Row.TreeView_Name; set { Row.TreeView_Name = value; } }
        public object ChildrenItems => new ObservableCollection<Data_Treeview>(from d in dt where d.TreeView_UnterNummer == this.TreeViewNummer select new Data_Treeview(d));


        public bool IsExpanded { get; set; } = true;
        public bool IsSelected { get; set; }
    }

Ich hoffe man kann verstehen was ich meine.

Gruß

Mezzo