Entwickler-Ecke

WinForms - Vergleichen von Datum Problem


nav93 - Fr 18.11.16 23:26
Titel: Vergleichen von Datum Problem
Hallo Leute,

ich habe ein Problem beim Programmieren einer c# anwendung. unzwar muss ich ein kleines Programm für ein Auktionshaus schreiben. das problem das ich habe ist, ein Datum zu vergleichen :( . Ich möchte Schmuckstücke in einer Datenbank anlegen und diese dann Differenzieren nach der Dauer im Auktionshaus

zb. ein schmuckstück wird abgebeben ( DateTime.today )
nun sollen in der Tabelle alle Schmuckstücke die unter 90 Tage im Auktionshaus sind grün dargestellt werden, alle die über 90 Tage im Auktionshaus sind rot.

ich wäre euch sehr sehr dankbar, wenn ihr mir helfen würdet .
Vielen Lieben Dank & ein schönes Wochenende


Csharp-programmierer - Fr 18.11.16 23:59

Die TimeSpan Klasse müsste dich weiterbringen.


nav93 - Sa 19.11.16 01:29

Hallo ,

Danke für die schnelle Antwort . Leider find ich dazu nicht viel :/ gibt es eine Lösung bzw ein leichten Weg dahin ? Also wie ich das leichter bzw einfacher lösen kann


Csharp-programmierer - Sa 19.11.16 01:34

TimeSpan-Klasse [https://msdn.microsoft.com/de-de/library/system.timespan(v=vs.110).aspx]

Ließ dir das mal durch. Damit kann man die einzelnen Tage in deinem Fall berechnen. Guck dir mal die Beispiele unten an

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


Ralf Jansen - Mo 21.11.16 12:09


C#-Quelltext
1:
2:
3:
4:
if (DateTime.Today.AddDays(-90) > meinLiebesSchmuckstueck.AbgabeDatum) 
   // red
else
   // green


Je nach benutzten Grid kann das Grid mit speziellen Formatierregeln das anders machen. Das ist aber Controlspezifisch und wir wissen nicht was du benutzt.


nav93 - Do 01.12.16 00:37

Hallo leute ,

ich hab hier mal mein code jetzt hoch geladen . alles funktioniert soweit .. bloß das mit den farben nicht . ich hab das jetzt mal so hochgeladen und hoffe das mir jemand helfen kann . Das problem ist das , alles was über 90 tage seit dem Abgabedatum in der Datenbank ist grün angezeigt werden soll im datagridview und alles was darunter liegt rot.






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:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
private void btFarbe_Click(object sender, EventArgs e)
        {
            dataGridView1.ClearSelection();

SqlDataAdapter SDA = new SqlDataAdapter ("Select Datum FROM Schmuck", CON);
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                var now = DateTime.Now;
                var verkaufDate = DateTime.Parse(row.Cells[7].Value.ToString());
                var ninetydaysBefore = verkaufDate.AddDays(-90);

                if (now < verkaufDate)
                {
                    row.DefaultCellStyle.BackColor = Color.Red;
                }
                else if (now > verkaufDate)
                {
                    row.DefaultCellStyle.BackColor = Color.Blue;
                }
            }
        }






das ist mein code quasi für die farben aber leider geht das nicht richtig.









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;
using System.Data.SqlClient;

namespace Pfandleihhaus
{
    public partial class Schmuckverwaltung : MaterialSkin.Controls.MaterialForm
    {

        SqlConnection CON = new SqlConnection("Data Source=.;Initial Catalog=myData;Integrated Security=True;Pooling=False");

        public Schmuckverwaltung()
        {
            InitializeComponent();
            anzeigen();
        }

        DataTable DATA;

        private void anzeigen()
        {
            CON.Open();
            SqlDataAdapter SDA = new SqlDataAdapter(" SELECT * FROM Schmuck", CON);
            DATA = new DataTable();
            SDA.Fill(DATA);
            dataGridView1.DataSource = DATA;
            CON.Close();

        }



        private void Schmuckverwaltung_Load(object sender, EventArgs e)
        {

        }

        private void btZurück_Click(object sender, EventArgs e)
        {

            this.Hide();
            Hauptmenü h2 = new Hauptmenü();
            h2.ShowDialog();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CON.Open();
            SqlDataAdapter SDA = new SqlDataAdapter("INSERT INTO Schmuck (Bezeichnung,Schmuckart,Material,Gewicht,Zustand,Preis,Datum)VALUES('" + textBox2.Text + "','" + comboBox1.Text + "','" + comboBox3.Text + "','" + textBox4.Text + "','" + comboBox2.Text + "','" + textBox3.Text + "','" + dateTimePicker1.Text + "')", CON);
            SDA.SelectCommand.ExecuteNonQuery();
            CON.Close();
            MessageBox.Show("Speichern erfolgreich !");
            anzeigen();

        }




        private void button2_Click(object sender, EventArgs e)
        {
            CON.Open();
            SqlDataAdapter SDA = new SqlDataAdapter("UPDATE Schmuck SET Bezeichnung = '" + textBox2.Text + "', Schmuckart = '" + comboBox1.Text + "', Material = '" + comboBox3.Text + "', Gewicht = '" + textBox4.Text + "', Zustand = '" + comboBox2.Text + "',Preis = '" + textBox3.Text + "', Datum = '" + dateTimePicker1.Text + "'WHERE ID ='" + textBox1.Text + "'", CON);
            SDA.SelectCommand.ExecuteNonQuery();
            CON.Close();
            MessageBox.Show("Update erfolgreich !");
            anzeigen();
        }

        private void dataGridView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            textBox1.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
            textBox2.Text = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
            comboBox1.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString();
            comboBox3.Text = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();
            textBox4.Text = dataGridView1.SelectedRows[0].Cells[4].Value.ToString();
            comboBox2.Text = dataGridView1.SelectedRows[0].Cells[5].Value.ToString();
            textBox3.Text = dataGridView1.SelectedRows[0].Cells[6].Value.ToString();
            dateTimePicker1.Text = dataGridView1.SelectedRows[0].Cells[7].Value.ToString();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            CON.Open();
            SqlDataAdapter SDA = new SqlDataAdapter("DELETE FROM Schmuck WHERE ID ='" + textBox1.Text + "'", CON);
            SDA.SelectCommand.ExecuteNonQuery();
            CON.Close();
            MessageBox.Show("GELÖSCHT !");
            anzeigen();
        }

        private void btFarbe_Click(object sender, EventArgs e)
        {
            dataGridView1.ClearSelection();
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                var now = DateTime.Now;
                var verkaufDate = DateTime.Parse(row.Cells[7].Value.ToString());
                var ninetydaysBefore = verkaufDate.AddDays(-90);

                if (now < verkaufDate)
                {
                    row.DefaultCellStyle.BackColor = Color.Red;
                }
                else if (now > verkaufDate)
                {
                    row.DefaultCellStyle.BackColor = Color.Blue;
                }
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}



hoffe jemand kann mir da helfen ! Vielen Lieben dank

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Delete - Do 01.12.16 02:28

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Do 01.12.16 03:01

erst einmal vielen lieben dank für deine hilfe ! also das mit dem Grün funktioniert. jedoch werden die anderen zeilen nicht rot ? muss ich da noch etwas ändern?

und vielen dank für den hinweis ! nächstes mal wird das natürlich geändert


Delete - Do 01.12.16 03:08

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Do 01.12.16 03:10

im code stehen doch 2 bedingungen . entweder oder . also müssten doch beide farbig sein oder hab ich da jetzt einfach nur einen denkfehler


Delete - Do 01.12.16 03:35

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Do 01.12.16 22:09

cool danke ! eine frage hätte ich noch . könnte ich wenn ich eine zeile auswähle im datagrid eine weitere form aufmachen ? quasi wenn bei der ausgewählten zeile das datum < das heutige datum dann soll die form Rechnung aufgehen . anders herum wenn es > ist Beleg.

ich hätte es jetzt so gemacht aber leider geht es nicht .



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
private void Schmuckverwaltung_MouseClick(object sender, MouseEventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                var now = DateTime.Now;
                var datum = DateTime.Parse(row.Cells[7].Value.ToString());


                if (DateTime.Today.AddDays(-90) <= datum)
                {
                    rechnung r = new Hauptmenü();
                    r.ShowDialog();

                }
                else if (DateTime.Today.AddDays(-90) >= datum)
                {
                    beleg b = new beleg();
                    b.ShowDialog();
                }
            }
        }
    }



dachte mit einem doppelklick auf die zeile würde das gehen . jedoch tut sich da nichts

sorry ich hab das mit dem code anzeigen wie erwünscht nicht hinbekommen

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Delete - Fr 02.12.16 02:41

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Fr 02.12.16 03:51

cool ! danke jetzt funktioniert das auch ! ich denke immer meine ansätze sind soweit immer ganz naja ok :D

eine frage hätte ich noch. ich habe eine combobox , in der ich entweder 5,10,15 auswählen kann . dann einen betrag den ich eingebe , zb 210.10. dann hab ich einen knopf , der quasi diese beiden zahlen summieren soll.

jedes mal wenn ich eine Kommazahl eingebe bekomm ich jedoch eine fehlermeldung :


Zitat:
Ein Ausnahmefehler des Typs "System.Data.SqlClient.SqlException" ist in System.Data.dll aufgetreten.

Zusätzliche Informationen: Fehler beim Konvertieren des varchar-Datentyps in float.


Hier wird der fehler makiert :


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 private void button1_Click(object sender, EventArgs e)
        {
            if (ValidateChildren(ValidationConstraints.Enabled))
                CON.Open();
            SqlDataAdapter SDA = new SqlDataAdapter("INSERT INTO Beleg (ArtikelId,Datum,Gebühr,Betrag,Endpreis)VALUES('" + comboBox1.Text + "','" + dateTimePicker1.Text + "','" + comboBox2.Text + "','" + textBox2.Text + "','" + textBox3.Text + "')", CON);
            SDA.SelectCommand.ExecuteNonQuery(); // hier kommt immer die Fehlermeldung
            CON.Close();
            MessageBox.Show("Speichern erfolgreich !");

            anzeigen();
            clear();
        }


Code des Button :


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 private void button3_Click(object sender, EventArgs e)
        {
            float box1 = 0;
            float box2 = 0;
            float ergebnis;

            box1 = float.Parse(comboBox2.Text);
            box2 = float.Parse(textBox2.Text);
            ergebnis = box1 + box2;
            textBox3.Text = Convert.ToString(ergebnis);
        }


in meiner datenbank tabelle sind auch alle zahlen mit float deklariert . ganze zahlen funktionieren problemlos .. kommazahlen nicht :(
wenn ich jetzt in der Kombobox 5 auswähle & bei Preis 10,20 & auf den knopf drücke wird 15,20 angezeigt. doch sobald ich auf den speichern knopf drücke geht da nichts mehr. Ich glaube ich versuche da einen String zu übergeben , aber wieso gehen dann ganze Zahlen?

hoffe jemand kann mir da weiterhelfen !

& vielen dank noch mal für die Erklärung


Delete - Fr 02.12.16 20:22

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Sa 03.12.16 04:13

Vielen Dank für die Antwort . Endpreis ist bei mir als flaust gespeichert . Doch sie konvertier ich jetzt den String in Float . Also das Textbox3 dann einen float wert hat ?


Csharp-programmierer - Sa 03.12.16 09:26

Einfach mit this.textbox1.text = Ergebnis.ToString();

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Sa 03.12.16 10:43

Hallo nav93,

benutze für die Datenbankabfragen SqlParameter (s. meine Links unter Suchparameter an SQL übergeben [http://www.entwickler-ecke.de/viewtopic.php?p=696349#696349]) - auf keinen Fall einfach Strings zusammenfügen.


nav93 - Sa 03.12.16 13:46

vielen dank !

muss ich diesen code in den code für dei textbox eingeben ? oder dort wo der code für den button steht?



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void button3_Click(object sender, EventArgs e)
        {
            {
                float box1 = 0;
                float box2 = 0;
                float Endergebnis;

                box1 = float.Parse(comboBox2.Text);
                box2 = float.Parse(textBox2.Text);
                Endergebnis = box1 + box2;
                this.textBox3.Text = Endergebnis.ToString();

            }
        }


so geht es leider nicht. muss ich die kombobox auch konvertieren

das problem ist einfach das ich wenn ich den betrag ausrechnen lassee , ein string ist und meine spalte in der datenbank ein float ist. habe aber dort auch nvarchar benutzt. geht auch nich. sollte das normal nicht gehen?


Delete - Sa 03.12.16 18:21

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Sa 03.12.16 18:36

ok danke das hab ich jetzt eigentlich verstanden . muss ich dann zum Beispeil bei Spalte 5 statt zb wie bei mir textbox3.txt einfach textbox3.float machen oder etwas anderes . weil das wird mir als fehler angezeigt. ich komme da echt nicht weiter. wenn ich endpreis als ein nvarchar deklariert habe in meiner datenbank, dann sollte der das doch ohne probleme annehmen .


Delete - Sa 03.12.16 19:27

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - Sa 03.12.16 22:50

also ich krieg es einfach nicht auf die reihe . ich mache alles wie ihr es eig auch vorschlagt .

das ist mein code für s speichern bei der form Beleg


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 private void button1_Click(object sender, EventArgs e)
        {
            

            if (ValidateChildren(ValidationConstraints.Enabled))
                CON.Open();
            SqlDataAdapter SDA = new SqlDataAdapter("INSERT INTO Beleg (ArtikelID,Datum,Betrag,Gebühr,Endpreis)VALUES('" + comboBox1.Text + "','" + dateTimePicker1.Text + "','" + textBox2.Text + "','" + comboBox3.Text + "','" + textBox3.Text + "')", CON);
            
            SDA.SelectCommand.ExecuteNonQuery();
            
            
            CON.Close();
            MessageBox.Show("Speichern erfolgreich !");

            anzeigen();
            clear();
        }


Beleg hab ich der Datenbank so festgelegt :

Beleg Id -> int Identity damit s immer selbst +1 erhöht wird
Schmuck id -> int
abgabedatum -> Date
Betrag -> float ( hier vllt auch varchar ? wegen dem Kommazahlen ?
Gebühr ( kombo box für die werte 5 , 10, 15 ) -> int
Endpreis -> varchar.

trotzdem kommt der Fehler .. das kann doch nicht sein oder.

und der knopf um endpreis auszurechnen :


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
     private void button3_Click(object sender, EventArgs e)
        {
            {
                float box1 = 0;
                float box2 = 0;
                float Endergebnis;

                box1 = float.Parse(comboBox2.Text);
                box2 = float.Parse(textBox2.Text);
                Endergebnis = box1 + box2;
                this.textBox3.Text = Endergebnis.ToString();

            }
        }



geht leider nicht .....


Delete - So 04.12.16 00:40

- Nachträglich durch die Entwickler-Ecke gelöscht -


nav93 - So 04.12.16 00:56

ja ich weiss was der fehler ist, also ich hab das schon verstnaden, jedoch weiss ich nicht wie ich jetzt einer textbox einen bestimmten datentyp zuweise. hat jemand eventuell ein konkretes beispiel ?


Csharp-programmierer - So 04.12.16 00:59

Du kannst alle Datentypen parsen. Du kannst auch den Text einer ComboBox parsen

C#-Quelltext
1:
int i = int.parse(this.combobox1.SelectedItem.ToString());