Hallo alle zusammen, ich habe ein Programm, das die Zeiten erfasst der Code schreibt die Start zeit in textfeld Start und End Zeit in textfeld Ende ,diese würde in in Observable Collection gespeichert als Liste.
dann die liste wird in Datagrid tabelle hinzugefügt dann wird die ganze in eine text datei geschrieben.
nun die Format in Textfelder könnte ich so umformen wie es gewünscht ist und auch in textdatei könnte ich alles so umformen, in dem ich die To string Methode in Timer klasse überschrieben habe und in gewünschte Format als String züruck gegebn habe.
das Problem ist wie kann ich die Formaten in Dtagrid umformen?
die Differenz geschieht hier:
ich weiss es nicht ob ObservableCollection eine gute Wahl wäre und ob man an jede einzelene Elemente in diese Art von Listen ran kommen kann und Format zu ändern?
es soll statt:
00:00:00.000000
diese werden :
00:00:00
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Drawing;
using System.Linq;
using System.IO;
namespace TimeRecorderPro
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public DateTime startTime;
public DateTime endTime;
public Timer _currentTimer;
public DateTime Dauer;
System.Windows.Forms.NotifyIcon notifyIcon = new System.Windows.Forms.NotifyIcon();
public void SetinTab()
{
Timers.Add(_currentTimer);
btnStart.Content = "Start";
}
void Löschen()
{
txtStart.Text = "";
txtEnde.Text = "";
}
public void BemerkungEinfuegen(string str)
{
_currentTimer.Bemerkung = str;
}
private ObservableCollection<Timer> Timers;
public MainWindow()
{
InitializeComponent();
Timers = new ObservableCollection<Timer>{};
lstNames.ItemsSource = Timers;
this.ShowInTaskbar = false;
notifyIcon.Icon = new System.Drawing.Icon(@"C:\Users\mmohammadi\source\repos\WPF Proj\TimeRecorderPro\TimeRecorderPro\bin\Debug\66164.ico");
notifyIcon.MouseClick += notifyIcon_MouseDoubleClick;
}
private void btnStart_Click(object sender, RoutedEventArgs e)
{
if ((string)btnStart.Content == "Start")
{
_currentTimer = new Timer();
txtStart.Text = _currentTimer.Start.ToString("T");
btnStart.Content = "Ende";
}
else
{
_currentTimer.Ende = DateTime.Now;
txtEnde.Text = _currentTimer.Ende.ToString("T");
_currentTimer.Dauer = _currentTimer.Ende - _currentTimer.Start;
txtEnde.Text = _currentTimer.Ende.ToString("T");
Bemerkung bemerkungsdialog = new Bemerkung();
bemerkungsdialog.Owner = this;
bemerkungsdialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
bemerkungsdialog.ShowDialog();
SetinTab();
Löschen();
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
MessageBoxResult mbresult = System.Windows.MessageBox.Show("Möchten Das Programm wirklich beenden?", "Programm beenden", MessageBoxButton.YesNo);
if (MessageBoxResult.No == mbresult)
{
e.Cancel = false;
}
e.Cancel = true;
this.Visibility = Visibility.Hidden;
string testtext = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Zeitbuchung_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
var objWriter = new System.IO.StreamWriter(testtext);
foreach (Timer timer in Timers)
{
objWriter.WriteLine(timer.ToString());
}
objWriter.Close();
notifyIcon.Visible = true;
}
private void lstNames_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (this.WindowState == WindowState.Minimized)
{
}
}
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.WindowState = WindowState.Normal;
notifyIcon.Visible = false;
this.Show();
}
}
public class Timer
{
public Timer()
{
Start = DateTime.Now;
}
public DateTime Start { get; set; }
public DateTime Ende { get; set; }
public TimeSpan Dauer { get; set; }
public string Bemerkung { get; set; }
public override string ToString()
{
return "Start : " + Start.ToString("T") + " \nEnde : " + Ende.ToString("T")
+ "\nDauer : " + Dauer.TotalHours.ToString("0.00") + "\nBemerkung : " + Bemerkung.ToString();
}
}
}
Die Formatierung hat nichts mit der Liste zu tun, sondern mit der Ausgabe.
Und du meinst wohl das DataGridView
(statt "DataGrid
")? Dort gibt es das CellFormatting-Ereignis.
PS: Den absoluten Pfad bei notifyIcon.Icon
solltest du entfernen...
Es geht um wpf
Die Daten werden von GridViewClumn so ausgegeben anscheind , die für die Anzeige geeignet sind.. laut Microsoft Dokumentation , aller dings da ist von Datagridview die Rede und nicht von GridViewColumn.. gilt die Aussage auch für WPF und für GridViewColumn
hier ist der XAML Code die Stelle wo die Daten Formatiert rauskommen müssen, soll ich die Daten in jede Celle formatieren, geht das eig ?
</StackPanel>
<ListView
x:Name="lstNames"
Grid.Row="0"
Grid.Column="1"
Margin="5,5,5,5" SelectionChanged="lstNames_SelectionChanged">
<ListView.View >
<GridView x:Name="grdNames">
<GridViewColumn
Width="100"
DisplayMemberBinding="{Binding Start}"
Header="Start" />
<GridViewColumn
Width="100"
DisplayMemberBinding="{Binding Ende}"
Header="Ende" />
<GridViewColumn
x:Name="sptDauer"
Width="100"
DisplayMemberBinding="{Binding Dauer}"
Header="Dauer" />
<GridViewColumn
Width="150"
DisplayMemberBinding="{Binding Bemerkung}"
Header="Bemerkung"/>
</GridView>
</ListView.View>
</ListView>
Den absoluten Pfad bei notifyIcon.Icon führt zum Icon welche doch als Notify Icon beim beenden des Programmes bzw minimirung erscheinen müss.
notifyIcon.Icon = new System.Drawing.Icon(@"C:\Users\mmohammadi\source\repos\WPF Proj\TimeRecorderPro\TimeRecorderPro\bin\Debug\66164.ico");
Ups, sorry - war irritiert wegen System.Windows.Forms
(aber das hast du wohl nur wegen NotifyIcon
drin).
Bei WPF kannst du beim Binding StringFormat
benutzen: XAML Using String Format.
PS: Durch den absoluten Pfad kann das Programm doch nur auf deinem Rechner (bzw. mit deinem Usernamen) genutzt werden (Absolute Pfadangaben im Code sind ein generelles No-Go!).
Es reicht doch einfach:
notifyIcon.Icon = new Icon("66164.ico");
Oder aber den "Application Startup Path" ermitteln: [FAQ] Pfad zur eigenen Anwendung (EXE) ermitteln und per Path.Combine(...)
zusammensetzen.
Perfekt ,Ich habe noch nicht probieret aber es kann nur die einzige lösung sein in GridView bei WPF die Daten zu formatieren !!
stimmt hab vergessen, dass Absoluten Pfadangaben in Programm nicht zu suchen haben , das ist auch logik denn auf dem anderen Rechner führt ja niergendwo!!
genau so ist am besten:
notifyIcon.Icon = new Icon("66164.ico");
ich probiere die Lösungen gleich nochmal
Dankeschön 👍