Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 30.01.16 00:17 
Hallo ihr Experten.
Ich habe eine ListView in der Datail-Ansicht. In der befinden sich folgende Columns nach dieser Reihenfolge:

- Datum
- Typ (Einzahlung...)
- alter Betrag
- Betrag
- neuer Betrag
- Beschreibung.

Wenn ich nun den Kontostand berechnen möchte, dann muss ich ja alterBetrag + Betrag = neuerBetrag rechnen. An sich ist dies ja kein Problem aber ich brauche dafür ja den Wert des Endergebnisses des davorigen Items.

Mein Hauptproblem ist aber ich habe es mal geschafft das zu programmieren aber jetzt im Moment stehe ich gerde richtig auf der Leitung. Ich brauche irgendeine Methode, die den aktuellen Wert berechnet und wenn man dann ein neues Item hinzufügt, wird der errechnete Wert an den Konstruktor der anderen Form übergeben. Dann werden in dieser Form die Daten eingegeben und per delegate void wieder zurück an die andere Form gesendet.

Ich habe es schon mal hinbekommen aber ich hab es vergessen. Mich ärgert es selber total das ich hier schon wieder nachfragen muss :( :oops: :autsch: :nixweiss: :bawling:

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 30.01.16 14:23 
Ich habe es jetzt wieder geschafft.
Eine Erweiterung habe ich vorgenommen: wenn man Enter drückt, werden die Daten in die ListView gefüllt und das Fenster mit den Werten bleibt geöffnet. Die Datenübertragung mache ich über ein delagate event. Wenn ich nun die Form2 (wo man eine Einzahlung hinzufügen kann) öffne, die Werte eintrage und einmal Enter drücke ist alles richtig. Drücke ich jedoch nochmal Enter, dann wird der Alte Betrag richtig berechnet aber der neue Betrag bleibt gleich.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
public partial class Form2 : Form
    {
        private string _status;
        private decimal x;
        private decimal __betrag, _alterbetrag;
        public delegate void ÜbertrageDaten(string Datum, decimal Betrag, decimal NeuerBetrag, string Typ, string Beschreibung);

        public Form2(string Status, decimal AlterBetrag)
        {
            InitializeComponent();
            _status = Status;
            _alterbetrag = AlterBetrag;
        }

        public event ÜbertrageDaten _daten;
        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void Form2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (Decimal.TryParse(this.textBox1.Text, out __betrag))
                {
                    x = __betrag + _alterbetrag;
                    _daten(this.maskedTextBox1.Text, __betrag, x, "Einzahlung"this.richTextBox1.Text);
                    x = 0;
                }
            }
        }
    }


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
private void einzahlungToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2("Einzahlung", BerechneBetrag());
            a._daten += new Form2.ÜbertrageDaten(Transfair);
            a.Show();
        }
        private decimal BerechneBetrag()
        {
            try
            {
                _betrag = 0;
                foreach (ListViewItem i in this.listView1.Items)
                {
                    if (i.SubItems[1].Text == "Einzahlung")
                    {
                        decimal x = Decimal.Parse(i.SubItems[2].Text);
                        decimal y = Decimal.Parse(i.SubItems[3].Text);
                        _betrag = x + y;
                    }
                    else if (i.SubItems[2].Text == "Auszahlung")
                    {
                        decimal x = Decimal.Parse(i.SubItems[2].Text);
                        decimal y = Decimal.Parse(i.SubItems[3].Text);
                        _betrag -= x + y;
                    }
                    else if (i.SubItems[1].Text == "Zinsen")
                    {
                        decimal x = Decimal.Parse(i.SubItems[2].Text);
                        decimal y = Decimal.Parse(i.SubItems[3].Text);
                        _betrag += x + y;
                    }
                }
                return _betrag;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return 0;
            }
        }
        private void Transfair(string Datum, decimal Betrag, decimal neuerBetrag, string Typ, string Beschreibung)
        {
            ListViewItem i = new ListViewItem(Datum);
            i.UseItemStyleForSubItems = false;
            if ((Typ == "Einzahlung") || (Typ == "Zinsen"))
                i.SubItems.Add(Typ).ForeColor = Color.Lime;
            else if (Typ == "Auszahlung")
                i.SubItems.Add(Typ).ForeColor = Color.Red;
            i.SubItems.Add(BerechneBetrag().ToString());
            i.SubItems.Add(Betrag.ToString());
            i.SubItems.Add(neuerBetrag.ToString());
            i.SubItems.Add(Beschreibung);
            this.listView1.Items.Add(i);
        }


Der letzte Code ist für die Form, auf der sich die ListView befindet. Ich glaube es liegt daran, das der alte Wert an den Konstruktor übergeben wird und in der Form2 nicht neu berechnet werden. Ich habe es auch mit dem += Operator versucht aber es passiert das falsche. Oder was meint ihr?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 30.01.16 17:38 
Hallo,

vergleiche mal die Indizes deiner SubItems-Zugriffe.
Du solltest aber generell kein Steuerelement für Berechnungen nutzen, sondern ein Datenmodell verwenden (mit entsprechenden Eigenschaften - anstatt über Indizes auf die Spalten einer ListView zuzugreifen).

Es scheint sich ja immer noch um das selbe Projekt wie in deinem anderen Thema zu handeln - und auch dort haben wir dir schon den Tipp mit den Datenklassen gegeben: Daten in Datei speichern (serialisieren) ff.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 30.01.16 18:08 
Hallo user profile iconTh69

Zitat:
Du solltest aber generell kein Steuerelement für Berechnungen nutzen, sondern ein Datenmodell verwenden (mit entsprechenden Eigenschaften - anstatt über Indizes auf die Spalten einer ListView zuzugreifen).


Was meinen sie mir Datenmodell? Eine Klasse?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 30.01.16 19:05 
Ja genau, eine Klasse, welche die Daten hält.
In deinem Beitrag des anderen Themas hast du doch schon diese erstellt (Datenklasse).
Du mußt diese dann nur noch benutzen.