Auftragsbuch mit Dataset, Datagridview und XML-Export
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 97 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.
-
-
Welche Eventualitäten hast Du denn alle?Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
Naja, genau genommen drei.
Lieferdatum = Eingangsdatum - ohne Auswahl in der ComboBoxLieferzeit ( Leerfeld ) - Auftrag wird mit Lieferdatum ohne Lieferzeit eingetragen
Lieferdatum = Eingangsdatum - Auswahl in der ComboBoxLieferzeit muss nach aktueller Zeit liegen, sonst MsgBox
Lieferdatum > Eingangsdatum - Auswahl egal -
Madde schrieb:
Auftrag wird mit Lieferdatum ohne Lieferzeit eingetragen
Also gut, gehen wir von einer MessageBox-Meldung aus. Du setzt den ComboBox-Style auf DropDownList und fügst ihr (z.B. im Designer) die Werte zu:---
,08:00
,09:00
,10:00
, … (die führenden Nullen beachten!)
Dann setzt Du beim Start des Forms den SelectedIndex der ComboBox auf 0, sodass angezeigt/ausgewählt wird:---
.
Dann setzt man das Lieferdatum über den DTP, richtig? Dann wählt man aus der ComboBox ggf. eine Zeit. Dann klickt man wahrscheinlich irgend einen Prüfbutton.
Dort schreibst Du:VB.NET-Quellcode
- If DTP.Value.Date > Eingangsdatum OrElse ComboBox.SelectedIndex = 0 Then 'das mit dem Eingangsdatum musst Du festlegen. Ist das Date.Today?
- AllesGut 'naja, Du weißt wohl, was ich meine
- Else 'Lieferdatum = Eingangsdatum und Zeit gewählt
- If Integer.Parse(ComboBox.SelectedItem.ToString.Split(":"c)(0)) > DTP.Value.Hour Then
- AllesGut
- Else
- MessageBox.Show("Das geht so aber nicht!")
- End If
- End If
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
Klasse hab es zum Laufen bekommen. Die Testläufe waren alle positiv. Vielen Dank!
2 Dinge sind noch auf meiner Wunschliste. In Post#23 hast Du ja geschildert, wie bei aktivierter Checkbox die darauffolgenden Spalten entsprechend der Vorgaben gefüllt werden.
Wenn ich allerdings die Checkbox deaktiviere, werden diverse Phantasiezeiten angezeigt. er soll die Zellen aber einfach nur leer darstellen.
Thema 2 und damit der letzte Punkt (Stand heute :-)), sind Formatierungen des DGV bei bestimmten Werten. In einem anderen Testprojekt ohne Dataset etc, kam ich mit folgendem Code zum Ziel.
Dieser funktioniert hier nicht. Woran könnte das liegen?
VB.NET-Quellcode
- Private Sub dgv_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
- If dgv.Columns(e.ColumnIndex).Name.Equals("Abweichung") Then
- If (e.Value) < 0 Then
- e.CellStyle.ForeColor = Color.ForestGreen
- e.CellStyle.Font = New Font("Arial", 9)
- e.CellStyle.BackColor = Color.Red
- ElseIf (e.Value) > 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightGreen
- ElseIf (e.Value) = 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightBlue
- End If
- End If
- End Sub
Vorab schonmal Vielen Dank!Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Madde“ ()
-
Madde schrieb:
Row.Datum = Nothing 'entspricht ja keinem DatumsformatDate
keine Klasse, sondern ein Wertetyp ist. Während man eine Klassenvariable auf Nothing stellen kann und der Compiler weiß: »Ah, ok, da steckt jetzt einfach keine Klasseninstanz drin«, funktioniert das bei Wertetypen nicht. Das ist, als würdest Du versuchen einenInteger
aufNothing
zu setzen. Da kommt dann0
raus. Und bei Date kommtDate.MinValue
raus (01.01.0001 00:00:00). Du müsstest da ggf. dafür sorgen, dass nach diesem Datum geschaut wird und dann entsprechende GUI-Teile verändert werden. Da kommt's drauf an, was Du von Deinem Programm erwartest. Bzw. Du schreibst es auf, dann können wir das gemeinsam angehen.
Stichwort Formatierung: erstens mal:Option Strict ON
!e.Value
ist vom TypObject
. Da lässt sich ohne Konvertierung nix wertemäßig vergleichen.
Zeile#2 würd ich so schreiben: oder eigentlich noch besser per If-Umkehrung:
Was genau funktioniert nicht? Wenn nix passiert, müsstest Du erstmal per Haltepunkt schauen, ob der Compiler dort überhaupt vorbeikommt. Denn der Code an sich klappt bei mir.Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
Vorab nochmal Danke für Deine Unterstützung.
VaporiZed schrieb:
Da kommt's drauf an, was Du von Deinem Programm erwartest. Bzw. Du schreibst es auf, dann können wir das gemeinsam angehen.
Die Fertigstellung eines Auftrages wird mit Aktivierung einer Checkbox bestätigt. Ist diese aktiviert, wird das aktuelle Datum, die aktuelle Zeit sowie die Differenz zum Wunschlieferdatum nach Klick eines Buttons in die Zellen eingefügt.
Wenn die Checkbox wieder deaktiviert wird, sollten diese Zellen alle wieder leer sein. Aktuell wird folgender Code verwendet.
VB.NET-Quellcode
- Private Sub ButtonAusgeliefert_Click(sender As Object, e As EventArgs) Handles ButtonAusgeliefert.Click
- Dim Row = DirectCast(DirectCast(TblAuftragsbuchBindingSource.Current, DataRowView).Row, dtsAuftragsbuch.tblAuftragsbuchRow)
- If Row.Ausgeliefert Then
- If Row.Versandart = "Fahrer" Then
- Row.Lieferart = "Ausgeliefert"
- ElseIf Row.Versandart = "UPS" Then
- Row.Lieferart = "Versandt"
- Else
- Row.Lieferart = "Abgeholt"
- End If
- Row.Datum = Date.Today
- Row.Zeit = CDate(DateTime.Now.ToString("HH:mm"))
- Row.Abweichung = CInt((Row.Lieferdatum.Date - Row.Datum.Date).TotalDays)
- Else
- row.Lieferart = Nothing
- Row.Datum = Nothing ' eben das bekannte Problem
- Row.Zeit = Nothing ' eben das bekannte Problem
- Row.Abweichung = Nothing ' eben das bekannte Problem
- End If
- End Sub
Thema Option Strict ON, ja ich weiß, sollte immer On sein. Leider hatte ich mit folgendem Code Fehler, sodass ich es Off gestellt habe. Hiermit wird aus den gemachten Eingaben ein Ordner aus der Auftragsnummer im jeweiligen Kundenordner generiert.
Kundennummer/Monat/Auftragsnummer
VB.NET-Quellcode
Das Thema dgv_Cellformatting läuft noch nicht. Bei Abweichung kommt "wurde nicht deklariert" und e.Value löst folgenden Fehler aus.
Fehler BC32013 "Option Strict On" lässt Operanden des Typs "Object" für den =-Operator nicht zu
VB.NET-Quellcode
- Private Sub dgv_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs)
- If e.ColumnIndex = Abweichung.DisplayIndex Then
- If e.Value = 0 Then
- e.CellStyle.ForeColor = Color.ForestGreen
- e.CellStyle.Font = New Font("Arial", 9)
- e.CellStyle.BackColor = Color.Yellow
- ElseIf e.Value > 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightGreen
- ElseIf e.Value < 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightPink
- End If
- End If
- End Sub
Gruß Madde
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Madde“ ()
-
VB.NET-Quellcode
Ui, Augenkrebs.Select Case
verwendet man normalerweise, wenn man mehr als 2 Möglichkeiten hat. DaIO.Directory.Exists
einen Boolean-Wert zurückgibt (True
oderFalse
), gibt es nur 2 Möglichkeiten. Und davon wertest Du nur einen Fall aus:False
. Den anderen fackselst Du mit der umständlichen FormulierungIs <> False
ab. Dann mach doch gleich:
CreateDirectory
macht nur was, wenn das Verzeichnis noch nicht existiert.
Abweichung.DisplayIndex
- neenee. Du musst den Namen der Column verwenden. schau in Deinem DGV nach, wie das Teil heißt. Oder bei der Controlauflistung. Ich füge ein Beispiel als Bild an.
Ja,e.Value
ist vom TypObject
. Denn da kann sehr viel drinstecken. Wenn Du aber weißt, dass da einInteger
drinsteckt, sag es dem Compiler:If CInt(e.Value) = 0 Then
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
VaporiZed schrieb:
System.IO.Directory.CreateDirectory(LabelKundenordner.Text & ComboBoxKunde.SelectedItem & "\" & monat & "\" & LabelAuftrNr.Text)
Option Strict On meckert bei "ComboBoxKunde.SelectedItem"
Fehler BC30038 "Option Strict On" lässt keine Operanden des Typs "Object" für den &-Operator zu
Beim dgv passiert nach wie vor nichts in Bezug auf die Formatierung. Habe nun folgenden Code. Dein "If CInt(e.Value) = 0 Then" habe ich verwendet, da es sich ja um einen Integer handelt.
VB.NET-Quellcode
- Private Sub dgv_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs)
- If e.ColumnIndex = AbweichungDataGridViewTextBoxColumn.DisplayIndex Then
- If CInt(e.Value) = 0 Then
- e.CellStyle.ForeColor = Color.ForestGreen
- e.CellStyle.Font = New Font("Arial", 9)
- e.CellStyle.BackColor = Color.Yellow
- ElseIf CInt(e.Value) > 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightGreen
- ElseIf CInt(e.Value) < 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightPink
- End If
- End If
- End Sub
-
So. Gleiches Ding.
SelectedItem
ist einObject
, daher ist ein Cast nötig. Worin? Tja, ich vermute DoppelCast in eine KundenRow.
Und das andere: Am Ende von Zeile#1 fehlt was: das zu behandelnde Event! Probier mal:Private Sub dgv_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
##########
Allerdings bzgl. Problem 1: Was soll das eigentlich ergeben? Was steht denn in der ComboBox? Ist die gebunden? Wenn ja, gibt es doch bestimmt auch eine BindingSource. Und die hat ein Current. Und die richtig gecastet ergibt eine Klasseninstanz. Und die hat eine Eigenschaft, die Du für das Verzeichnis hernehmen willst. Wenn die Box hingegen ungebunden ist, nimmComboBoxKunde.SelectedItem.ToString
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()
-
Die Combobox wird mit folgrendem Code gefüllt. Sicher nicht die feine Klinge aber funktioniert
VB.NET-Quellcode
- Private Sub Kundenpfad_Load()
- LabelKundenordner.Text = My.Settings.kundenpfad
- My.Settings.kundenpfad = LabelKundenordner.Text
- My.Settings.Save()
- ComboBoxKunde.SelectedItem = ""
- For Each folder As String In IO.Directory.GetDirectories(LabelKundenordner.Text)
- ComboBoxKunde.Items.Add(New IO.DirectoryInfo(folder).Name)
- Next
- End Sub
- Private Sub KundenpfadÄndernToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles KundenpfadÄndernToolStripMenuItem1.Click
- If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
- LabelKundenordner.Text = FolderBrowserDialog1.SelectedPath
- End If
- ComboBoxKunde.Items.Clear()
- ComboBoxKunde.SelectedItem = ""
- For Each folder As String In IO.Directory.GetDirectories(LabelKundenordner.Text)
- ComboBoxKunde.Items.Add(New IO.DirectoryInfo(folder).Name)
- Next
- End Sub
Dein "ComboBoxKunde.SelectedItem.ToString" hat funktioniert, um an Option Strict On vorbeizukommen.
VaporiZed schrieb:
Private Sub dgv_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
Hier bricht er das Debugging mit "Ungültige Konvertierung von Typ DBNull in Typ Integer" ab, was logisch ist, da die leere "Abweichung"-Spalte eben nicht erlaubt ist, was die "Nothing"-Sache wieder ins Spiel bringt.
Habe zum Testen mal alle Aufträge als Ausgeliefert markiert, somit waren alle Abweichung-Zellen gefüllt und siehe da, funktioniert.
-
Da ist dann natürlich schon unschön, dass
DbNull
überhaupt ermöglicht wird. Ändere da am besten die DataTable-Einstellungen. Suche dann in all Deinen Daten nach allen Einträgen, wo dieser Wert drinsteht und ersetze ihn durch einen sinnvollen Wert. Bei einem Datum ist dies - wie gesagt - m.E. schwrierig. Mit Nullables will ich nicht anfangen, weil die m.E. nicht im tDS abspeicherbar sind. Arbeitest Du denn mit einem tDS überhaupt?
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
VaporiZed schrieb:
Arbeitest Du denn mit einem tDS überhaupt?
Ich meine ja , ich habe ein Dataset und eine Bindingsource. -
Dann wie gesagt: DataTables richtig einstellen, alles per For-Schleife durchgehen und
DbNull
durch sinnvolle Werte ersetzen.Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
So, ich habe es jetzt eher pragmatisch gelöst. Aus Programmiersicht sehr wahrscheinlich eher ein Graus aber für meine Zwecke ausreichend. Ich habe nun im DS das Null-Datum bei meiner Spalte "Lieferdatum" 01.01.0001 als Standardwert. Dein Hinweis @VaporiZed, DBNull zu entfernen, war sehr hilfreich.
Im dgv.formatting blende ich dieses Datum dann einfach aus.
Wie gesagt, für mich ist das ausreichend. Danke an Alle, die mir bis hierhin unterstützend unter die Arme gegriffen haben.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Madde“ ()
-
Ein Graus: nö. So hätte ich es auch gemacht.Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
Etwas zu früh gefreut. Die Formatierg im DGV hat ja soweit funktioniert. Jetzt wollte ich 2 Ergänzungen vornehmen. Leider funktionieren die nicht.
Hier die bisherige Formatierung.
VB.NET-Quellcode
- If e.ColumnIndex = AbweichungDataGridViewTextBoxColumn.DisplayIndex Then
- If e.Value = "Noch aktiv" Then
- e.CellStyle.ForeColor = Color.ForestGreen
- e.CellStyle.Font = New Font("Arial", 9)
- 'e.CellStyle.BackColor = Color.Yellow
- ElseIf e.Value = 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightBlue
- ElseIf e.Value > 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightGreen
- ElseIf e.Value < 0 Then
- e.CellStyle.ForeColor = Color.Black
- e.CellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
- e.CellStyle.BackColor = Color.LightPink
- End If
- End If
Und das sollte hinzukommen, bringt aber keinen Erfolg.
VB.NET-Quellcode
- If e.ColumnIndex = EingangsdatumDataGridViewTextBoxColumn.DisplayIndex Then
- If e.Value = Date.Today Then
- e.CellStyle.BackColor = Color.LightYellow
- ElseIf e.Value = "01.01.0001" Then
- e.Value = ""
- End If
- End If
- If e.ColumnIndex = LieferdatumDataGridViewTextBoxColumn.DisplayIndex Then
- If e.Value = Date.Today Then
- e.CellStyle.BackColor = Color.LightPink
- ElseIf e.Value = "01.01.0001" Then
- e.Value = ""
- End If
- End If
Ein weiteres Problem hat sich soeben aufgetan, welches ich dachte gelöst zu haben. Wenn ein neuer Auftrag eingetragen wird, geschieht das mitTblAuftragsbuchBindingSource.AddNew()
Solange der aktuelle Auftrag nicht fertig eingetragen ist, soll ein weiterer Klick auf "Neuer Auftrag" verhindert werden.
Wie könnte ich das umsetzen?
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Madde“ ()
-
Madde schrieb:
Leider funktionieren die nicht.Madde schrieb:
If e.Value = "Noch aktiv" ThenOption Strict On …
e.Value
dann einString
sein? Du musst schon die richtigen Datentypen miteinander vergleichen.
Madde schrieb:
Wenn ein neuer Auftrag eingetragen wird, geschieht das mit TblAuftragsbuchBindingSource.AddNew()Madde schrieb:
Solange der aktuelle Auftrag nicht fertig eingetragen ist
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
VaporiZed schrieb:
Und unter welchen Umständen wird diese Codezeile ausgeführt? Hast Du einen Button dafür? Was heißt konkret
Das hat sich erledigt.
Bei dem dgv_cellformatting habe ich wohl gestern Option Script wieder Off gestellt. Sicher beim Testen durcheinander gekommen.
Ich habe jetzt wieder auf On und er meckert alle e.values an.
Unabhängig davon verstehe ich aber nicht, warum die Formatierung bei Spalte "Lieferdatum" funktioniert aber bei Spalte "Eingangsdatum" nicht. Beide haben das gleiche Date-Format oder ich übersehe mal wieder etwas anderes.
Eine Sache auch noch, wie gesagt, mitTblAuftragsbuchBindingSource.AddNew()
wird ein neuer Auftrag per Button begonnen. Die ID wird dabei automatisch vergeben ( bspw. 1 ) . Mein Problem nun, wenn ich die Eingabe abbreche, die Zeile lösche und dann neu beginne, beginnt er mit der 3. Wie kann ich die Eingabe soweit abbrechen, dass er normal mit der 2 weitermacht.
Ein Speichern oder DGV_refresh hat nichts gebracht. Nur ein Neustart des Programms führt zum Ziel, ist aber keine Option.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Madde“ ()
-
Madde schrieb:
Mein Problem nun, wenn ich die Eingabe abbreche, die Zeile lösche und dann neu beginne, beginnt er mit der 3. Wie kann ich die Eingabe soweit abbrechen, dass er normal mit der 2 weitermacht.
Das ist nicht wirklich ein Problem.
Ein ganz anderes Problem kann entstehen dadurch, dass dein Zähler scheinbar positiv zählt. Normal, und Voreinstellung ist, dass AutoIncrement in den negativen Bereich läuft.
Das wird aber erst dann problematisch, wenn du eine Datenbank zu hinterlegen versuchst.
-
Ähnliche Themen
-
Verzeichnis in Textdatei abbilden
Ich_bastel_in_VB - - Sonstige Problemstellungen