Laden...

Wie kann ich auf einzelne Elemente in einer ObservableCollection zugreifen um das Format zu ändern?

Erstellt von MMazi vor 3 Jahren Letzter Beitrag vor 3 Jahren 571 Views
M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren
Wie kann ich auf einzelne Elemente in einer ObservableCollection zugreifen um das Format zu ändern?

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();
                                          }       
        
                }    
        
}

4.931 Beiträge seit 2008
vor 3 Jahren

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...

M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren

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>
M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren

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");

4.931 Beiträge seit 2008
vor 3 Jahren

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.

M
MMazi Themenstarter:in
45 Beiträge seit 2020
vor 3 Jahren

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 👍