MMazi Geschrieben 11. November 2020 Geschrieben 11. November 2020 Hallo Alle zusammen, Ich habe eine Zeitefassungstool geschrieben mit Windowsform. Das Tool funktioniert wie folgt: 1. Start Button ->wird die Statzeit in der Textbox und in erste Spate von dgv eingetragen 2. Ende Button -> wird die Endzeit in der textbox eingetragen , gleichzeitig wird die Differenz in der Textbox und die Spalte Dauer in dgv eingetragen und zeitgleich wird einen Dialogfenster geöffnet um die Bemerkungen zu schreiben 3. beim schliessen von Hauptfenster, wird die Daten in einer Textdatei geschrieben und in einem neuen Lokalen Ordner Lokal abgelegt. das hat ja alles geklappt nun um alles noch besser zu machen bin dabei alles mit WPF zu ersetllen. ich habe soweit das Layout erstellt ( Bilder in Anhang ) , nun hat sich herausgestellt, dass ganz andere Datenbindung in wpf gilt als Windowsform. habt Ihr eine Idee wie ich diese Vorhaben realisieren kann, und wie die Daten aus Textfelder und Button in dgv spalten eingetragen werden kann ? Ich danke euch im voraus. Der Code in windows Form: Form1.cs: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Text; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Configuration; using System.IO; namespace Zeiterfassungstool { public partial class Form1 : Form { //Globale Variabeln public DateTime startTime; public DateTime endTime; string v1 = System.Configuration.ConfigurationManager.AppSettings["k1"]; string v2 = System.Configuration.ConfigurationManager.AppSettings["k2"]; string v3 = System.Configuration.ConfigurationManager.AppSettings["k3"]; public Form1() { InitializeComponent(); btnStart.Visible = true; btnStart.Text = "Start"; } //--------------------------------------START------------------------------------------------ private void btnStart_Click(object sender, EventArgs e) { if (btnStart.Text == "Start") { this.startTime = DateTime.Now; textBox2.Text = startTime.ToString("HH:mm:ss"); int n = dataGridView1.Rows.Add(); dataGridView1.Rows[n].Cells[0].Value = textBox2.Text; btnStart.Text = "Ende"; } else { this.endTime = DateTime.Now; textBox3.Text = endTime.ToString("HH:mm:ss"); int n = dataGridView1.Rows.Count - 1; dataGridView1.Rows[n].Cells[1].Value = textBox3.Text; TimeSpan dauer; dauer = endTime.Subtract(startTime); int m = dataGridView1.Rows.Count - 1; dataGridView1.Rows[m].Cells[2].Value = dauer.TotalHours.ToString("0.00"); //--------Bemerkungsdialog---------- Bemerkung bemerkungdialog = new Bemerkung(); bemerkungdialog.StartPosition = FormStartPosition.CenterScreen; if (bemerkungdialog.ShowDialog() == DialogResult.OK) { int d = dataGridView1.Rows.Count - 1; dataGridView1.Rows[d].Cells[3].Value = bemerkungdialog.getBemerkung(); } //----------Löschen------------------- foreach (Control tbx in Controls) { if (tbx.GetType() == typeof(TextBox)) { ((TextBox)tbx).Clear(); } } btnStart.Text = "Start"; } } //--------------------------------------ENDE------------------------------------------------ //-----------------------------------Speichern------------------------------------------- //------------------------------------SizeChanged. NotifyIcon------------------------------------------- private void Form1_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { notifyIcon1.Icon = SystemIcons.Application; } this.ShowInTaskbar = false; } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.WindowState = FormWindowState.Normal; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt"; var objWriter = new System.IO.StreamWriter(testtext); int count = dataGridView1.Rows.Count; for (int row = 0; row < count; row++) { int columncount = dataGridView1.Columns.Count; for (int column = 0; column < columncount; column++) { objWriter.WriteLine(dataGridView1.Rows[row].Cells[column].Value.ToString()); } } objWriter.Close(); DialogResult dialog = MessageBox.Show("Möchten Das Programm wirklich beenden?", "Programm beenden", MessageBoxButtons.YesNo); if (dialog == DialogResult.No) { e.Cancel = true; } } } } Dialogfenster" Bemerkung" : using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Zeiterfassungstool { public partial class Bemerkung : Form { // Interne Zugriff private string Speichern = ""; // Externe Zugriff public string Form1 { get { return Form1 ; } } public Bemerkung() { InitializeComponent(); } private void btnspeichern_Click(object sender, EventArgs e) { Speichern = textBox1.Text; } public string getBemerkung() { return textBox1.Text; } private void textBox1_TextChanged(object sender, EventArgs e) { } } } App config : <?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <appSettings> <add key="k1" value="Pfad zum Speichern angeben " /> <add key="k2" value="v2" /> <add key="k3" value="v3" /> <add key="ClientSettingsProvider.ServiceUri" value="" /> </appSettings> </configuration> Der Code in WPF: Hauptfenster von Programm ( MainWindow.xaml:1 ) Window x:Class="Grid.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:Grid" mc:Ignorable="d" Title="MainWindow" Height="300" Width="600"> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition Width="14*"/> <ColumnDefinition Width="15*"/> <ColumnDefinition Width="15*"/> <ColumnDefinition Width="15*"/> <ColumnDefinition Width="15*"/> </Grid.ColumnDefinitions> <Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"> <Button x:Name="btnStart" FontSize="16" FontWeight="Bold" Background="LightSkyBlue" Height="50" Width="100" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,0,0,0" >Start</Button> </Grid> <Grid Grid.Row="0" Grid.Column="2"> <Label FontSize="16" FontFamily="Century Gothic" FontStyle="Normal" FontWeight="Bold" Margin="5" Padding="5,5,5,5" HorizontalAlignment="Center"> Start</Label> </Grid> <Grid Grid.Row="0" Grid.Column="3"> <TextBox x:Name="textBox2" Margin="5,5,5,5" ></TextBox> </Grid> <Grid Grid.Row="0" Grid.Column="4"> <Label FontFamily="Century Gothic" FontSize="16" FontStyle="Normal" FontWeight="Bold" Margin="5" Padding="5,5,5,5" HorizontalAlignment="Center">Ende :</Label> </Grid> <Grid Grid.Row="0" Grid.Column="5"> <TextBox x:Name="textBox3" Margin="5" ></TextBox> </Grid > <DataGrid Name="dataGridView1" Grid.Column="0" Grid.ColumnSpan="6" Grid.RowSpan="6" AutoGenerateColumns="False" Grid.Row="1" > <DataGrid.Columns> <DataGridTextColumn Header="Start" FontSize="12" Width="125" Binding="{Binding Start}"/> <DataGridTextColumn Header="Ende" Width="125" Binding="{Binding Stop}"/> <DataGridTextColumn Header="Dauer" Width="70" Binding="{Binding Dauer}"/> <DataGridTextColumn Header="Bemerkung" Width="720" Binding="{Binding Bemerkung}"/> </DataGrid.Columns> </DataGrid> </Grid> </Window> Hauptfentser c#: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Input.Manipulations; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Timereporter2; namespace Grid { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public DateTime startTime; public DateTime endTime; public MainWindow() { InitializeComponent(); test(); } public void test() { DateTime Start = new DateTime(2020, 11, 10, 0, 0, 0); DateTime Stop = new DateTime(2020, 11, 10, 0, 0, 0); CustomDataGridRow t1 = new CustomDataGridRow(Start, Stop , 0.00 , "test"); List<CustomDataGridRow> list = new List<CustomDataGridRow>(); list.Add(t1); dataGridView1.ItemsSource = list; } } } Dialogfenster "Bemerkung" XAML : <Window x:Class="Timereporter2.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:Timereporter2" mc:Ignorable="d" Title="Window1" Height="206" Width="442"> <Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"> <TextBox x:Name="textBox1" Width="442" ></TextBox> </Grid> <Grid Grid.Row="1" Grid.Column="0"> <Button x:Name="btnspeichern" Margin="15,15,15,15" FontSize="16" FontFamily="Century Gothic" FontStyle="Normal" FontWeight="Bold" >Einfügen</Button> </Grid> <Grid Grid.Row="1" Grid.Column="1"> <Button x:Name="Abbrechen" Margin="15,15,15,15" FontSize="16" FontFamily="Century Gothic" FontStyle="Normal" FontWeight="Bold" >Abbrechen</Button> </Grid> </Grid> </Window> Dialogfenster " Bemerkung" c#: using System; using System.Collections.Generic; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace Timereporter2 { /// <summary> /// Interaktionslogik für Window1.xaml /// </summary> public partial class zWindow1 : Window { // Interne Zugriff private string Speichern = ""; // Externe Zugriff public string MainWindow { get { return MainWindow; } } public Window1() { InitializeComponent(); } private void btnspeichern_Click(object sender, EventArgs e) { Speichern = textBox1.Text; } public string getBemerkung() { return textBox1.Text; } } } Zitieren
KeeperOfCoffee Geschrieben 11. November 2020 Geschrieben 11. November 2020 (bearbeitet) Wie jetzt...Windows Forms oder WPF? Wenn du WPF machst, dann macht man sowas über MVVM und nicht über Events. Da sollte die Oberfläche komplett von der Logik getrennt sein. Windows Forms Anwendungen sind meistens Event-Basiert, während bei WPF in 99% der Fälle MVVM verwendet wird. Du versuchst hier eine WPF Anwendung wie eine Windows-Forms Anwendung umzusetzen. Bearbeitet 11. November 2020 von KeeperOfCoffee Zitieren
MMazi Geschrieben 11. November 2020 Autor Geschrieben 11. November 2020 WPF halt, Achso Ok dann muss ich mich erstmal mit MVVM befassen , Danke dir erstmal Zitieren
KeeperOfCoffee Geschrieben 11. November 2020 Geschrieben 11. November 2020 Um das mal ganz grob zu erklären. In WPF hat sich das MVVM Pattern als Best Practice herauskristallisiert und viele Techniken von XAML basieren darauf. View: Die View ist eine XAML Datei, oft eine Page oder ein Window, und sollte im Code-Behind wenn möglich keinerlei Logik haben, besonders keine Logik die mit dem Model oder den ViewModels zu tun hat. Die View wird an ViewModels mittels DataBindings gebunden. ViewModel: Ein ViewModel exportiert Daten zur View. Man könnte sagen es ist eine Abstraktion der View. Alle möglichen Daten abbilden, die du in der View anzeigen willst ODER auch ein Verhalten abbilden mittels Commands. (Deshalb haben Buttons die XAML Property Command). Model: Das Model sind generell die Daten die du in der WPF Anwendung generell zur Verfügung stellen willst. Hier sind alle Properties z.B. deines User Objects definiert (für ein entsprechendes ViewModel benötigst du ja evtl. nur eine Property von hier z.B. Name). Im DataContext eines UserWindows ist also ein UserViewModel, welches Daten verwendet die aus dem bereitgestellten User-Objectes aus dem Model kommt. // Model public class User { public int id { get; set; } public string Name { get; set; } } // ViewModel public class UserWindowViewModel { private readonly _user; public UserWindowViewModel(User user) { _user = user; } public string Name => _user.Name; } // Window Anzeige Window userWindow = new Window(); userWindow.DataContext = new UserWindowViewModel(); userWindow.ShowDialog(); // TextBlock im Window <TextBlock Text="{Binding Name, Mode=OneWay}"/> Das ist aaaaaabbbberr eine sehr vereinfachte Darstellung. Meist nutzt man für MVVM heutzutage eher Frameworks wie z.B. PRISM, MVVMCross oder ReactiveUI. Würde dir empfehlen mal das Beispiel von MVVMCross anzusehen https://www.mvvmcross.com/documentation/tutorials/tipcalc/a-wpf-ui-project MMazi und Blothmath reagierten darauf 2 Zitieren
MMazi Geschrieben 11. November 2020 Autor Geschrieben 11. November 2020 ja stimmt Aber mal klein und vereinfacht ertsmal anfangen ich danke dir vielmals Zitieren
Whiz-zarD Geschrieben 11. November 2020 Geschrieben 11. November 2020 Ja, das Problem ist, dass WPF trotz seiner Monstrosität sich doch recht halbgar anfühlt, wenn man es so nutzen möchte, wie es mal angedacht war. Nicht umsonst hat das "patterns & practices"-Team von Microsoft ursprünglich sogar noch Prism entwickelt, um die Arbeit mit WPF zu erleichtern. Selbst intern ist man wohl mit WPF nicht zufrieden gewesen. Meines Wissens nach wurde ja auch die Oberfläche von Visual Studio mit WPF und Prism entwickelt. MMazi reagierte darauf 1 Zitieren
MMazi Geschrieben 16. November 2020 Autor Geschrieben 16. November 2020 (bearbeitet) Danke für die Antworten wollte noch gleich hier fargen , wie kann man das Fenster solution Explorer in Visual Studio 2019 öffnen? oder soll einr neue Frage daraus werden? Danke Bearbeitet 16. November 2020 von MMazi Zitieren
JustALurker Geschrieben 16. November 2020 Geschrieben 16. November 2020 Hey, das Fenster Projektmappen-Explorer ist die deutsche Übersetzung des Solution Explorer. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.