Was ist für änderungsverfolgbarkeit am sinnvollsten?

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Gottric.

    Danke.
    also ich habe mal dieses Tut. durchgearbeitet um überhaupt zu verstehen was da passiert.
    Hällst du es für sinnvoll alle Daten in einer XML zu speichern oder soll ich immer eigene Anlegen?
    Ich arbeite mich mal durch, nur so vorab, ist es möglich wenn ich zum beispiel (Anhang Post #6) alles angezeigt haben will was an Roboter 3.6 gemacht wurde nur dies dann in den Datagrindview zu laden? Und nur was mit der Datei 742 alles passiert ist. also nach einzelnen Spalten zu suchen?
    Also brauch ich verschiedene Datasets die ich in beziehungen zueinander setze für mein Tool oder kann ich alles in eins schreiben?

    https://msdn.microsoft.com/de-de/library/ekw4dh3f.aspx#N%C3%A4chste Schritte


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gottric“ ()

    Für den Fall, dass Du den DataSet-/XML-Weg gehen willst, bin ich mal so frei und melde hiermit dies unseren DataSet-Spezialisten @VB1963 und @ErfinderDesRades.
    1 DataSet reicht. Da legst Du zwei Tabellen an. Eine für die unterschiedlichen Dateien, eine für die Änderungshinweise pro Datei, welche dann auf die erste Tabelle verweist. Wenn Du die Tuts durch bist, mach mal einen Screenshot des DataSet-Designers (= Visualisierung Deines Datenmodells), ggf. mit Anmerkungen, welche Datenspalte welchen Datentyp hat. Sobald das fertig ist, können wir weitermachen. Wenn jemand der anderen oder unsere beiden tDS-(typ. DataSet-)-Spezialisten Einwände haben, melden die sich schon. Nicht dass jemand gleich sagt: »Moment, das machen wir mal anders viel effizienter.« (Ich sag nur: Wer nur nen Vorschlaghammer hat, sieht in jedem Problem einen Kopf. ;) Diesem Punkt verfall ich manchmal.)
    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“ ()

    Super danke, ich habe ja noch keins dieser tuts durch. Nur das von microsoft selbst und dort ist der Dataset schon geschrieben gewesen. ich habe die Videos von Erfinder des Rades eben auf youtube mal angesehen die auf dem tut verlinkt sind. super interessant. aber hab da wohl noch einiges vor mir :)

    also so meisnt du wie im Anhang?
    Bilder
    • date.PNG

      19,82 kB, 1.205×561, 99 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gottric“ ()

    Hallo, also ich bin nun soweit dass ich speichern und laden kann durch die tuts von Erfinder des Rades und Videos aus Youtube.

    Jetzt möchte ich aber gerne eine Auswahl treffen können.
    ich kann bis jetzt nur die ganze Liste speichern und laden.

    Also damit meine ich alle Daten anzeigen lassen von einem bestimmten Datum

    ich habe aus dem tut von Erfinder des Rades dies hier rausgezogen um nur mal ne Struktur zu verstehen dass er mir die Position mal darauf anlegt.

    VB.NET-Quellcode

    1. For i = 0 To dataset1BindingSource.Count - 1
    2. Dim Datum = DirectCast(dataset1BindingSource(i), DataRowView).Row
    3. If DatumDataGridViewTextBoxColumn.Name Like txtsuchen.Text Then
    4. dataset1BindingSource.Position = i
    5. Return
    6. End If
    7. Next

    Sieht jemand auf anhieb vielleicht was ich da falsch mache oder falsch deklariert habe?
    bzw. was noch wichtiger ist wie mache ich das denn dass er mir in den leeren Datagrindview nur meine gewünschte auswahl einlade aus meiner XML?

    Gottric schrieb:

    ich kann bis jetzt nur die ganze Liste speichern und laden.

    Gottric schrieb:

    bzw. was noch wichtiger ist wie mache ich das denn dass er mir in den leeren Datagrindview nur meine gewünschte auswahl einlade aus meiner XML?

    In beiden Aussagen sehe ich ein Missverständnis. Die XML-Daten werden in das DataSet geladen und andersrum. Komplett. Immer. Das ist so gewollt. Was im DGV angezeigt wird, ist eine andere Sache. Das läuft z.B. über den BindingSource-Filter, bei dem Du z.B. sagen kannst: "Datum = #08/01/2017#". Dann werden nur die Einträge gezeigt, die einen Wert in der Spalte "Datum" 1.8.2017 haben (bei Datumsangaben US-amerikanisches Format verwenden; ja, ich weiß, ist nicht typisiert, daher ohne IntelliSense und eventuelle Fehler sieht man erst zur Laufzeit). Eine auf ein DataSet verweisende BindingSource verweist ja auch auf eine DataTable. In dieser DataTable muss es eine Spalte mit dem genannten Namen geben. Heißt die Spalte in Deiner DataTable "Änderungsdatum", muss auch das so im Filter stehen.

    btw: Dein DataSet-Designer-Screenshot fehlt noch
    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.
    Ok, verstehe ich das richtig?
    mit meinem Code hier:

    VB.NET-Quellcode

    1. Private _Datafile As New FileInfo("C:\Users\login\Desktop\Datasettest\bang.xml")
    2. Private Sub ToolStripMenuItem1_MenuClicked(ByVal Sender As Object, ByVal e As EventArgs) _
    3. Handles SaveToolStripMenuItem.Click, ReloadToolStripMenuItem.Click
    4. Select Case True
    5. Case Sender Is SaveToolStripMenuItem
    6. Save()
    7. Case Sender Is ReloadToolStripMenuItem
    8. Reload()
    9. End Select
    10. End Sub
    11. Private Sub Reload()
    12. DataSet1.Clear()
    13. If _Datafile.Exists Then DataSet1.ReadXml(_Datafile.FullName)
    14. End Sub
    15. Private Sub Save()
    16. Me.Validate()
    17. DataSet1.WriteXml(_Datafile.FullName)
    18. End Sub


    ich soll immer alles in mein Dataset1 laden und mein PrgTable1BindingSource lade ich was im Datagrindview angezeigt werden soll?
    Ich habe meinen PrgTable1BindingSource auf mein Datagrindview verlinkt. aber das rufe ich ja garnicht auf mit meinem Code.
    jetzt bin ich verwirrt, sorry.
    oder ist das egal? mein PrgTable1BindingSource ist ja nur die "Tabelle" in Dataset1.
    Wie stelle ich denn an dass er mir nur die Ergebniss aus dem Suchfeld anzeigt?
    Bilder
    • Data.PNG

      8,73 kB, 252×300, 94 mal angesehen
    DataSource ≠ BindingSource
    DataSource ist die Datenquelle, also die Tabelle in Deinem DataSet. Die BindingSource (BS) ist ein Verbindungsstück zwischen Deinem Formular und der DataSource. Und dieses Verbindungsstück gilt es per Filter zu modifizieren.

    Oben links der Ausschnitt aus meinem tDS-Designer
    In der Mitte das DGV, welches per BS (unten links) an die DataTable gebunden wurde
    Rechts die Eigenschaften der BS, bei denen man auch den Filter, also quasi die Stellschrauben der BS einstellen kann.

    EDIT: Was ist denn Dein Suchfeld? Was stellst Du dort ein? Ist es eine TextBox oder ein anderes CE? Wenn in diesem Suchfeld etwas verändert wird (nenn mal bitte einen zulässigen Wert), was soll dann geschehen? Muss man einen Button drücken, damit die Ergebnisse gefiltert werden, welche im DGV angezeigt werden? Mehr Infos bitte.
    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.
    Also meine Form ist auch so aufgebaut wie deine so wie ich das sehe.

    VB.NET-Quellcode

    1. Private Sub txtsuchen_TextChanged(sender As Object, e As EventArgs) Handles txtsuchen.TextChanged
    2. Dim DV As New DataView(DataSet1.PrgTable1)
    3. DV.RowFilter = String.Format("Datum Like '%{0}%'", txtsuchen.Text)
    4. DataGridView1.DataSource = DataSet1.PrgTable1.Select("Datum Like '%{0}%'", txtsuchen.Text)
    5. End Sub


    Ich dachte über ein Textchanged Event kommt das am saubersten.
    kann das aber auch über einen Button lösen, wenn die XML 20000 Datensätze enthällt ist über textchanged villeicht nicht die besto lösung.

    Bei meinem Code sind die Spalten wohl falsch deklariert, aber wie nenne ich diese richtig?
    Bilder
    • bild 1.PNG

      33,25 kB, 1.826×689, 68 mal angesehen
    • Data.PNG

      8,73 kB, 252×300, 81 mal angesehen
    DataView? Select?
    Moment. Das war nicht in meinem Sinne. Wenn man davon absieht, dass Du noch keinen erlaubten Wert mitgeteilt hast, würde folgendes m.E. laufen (wie weiter oben schon angegeben): Nehmen wir an, Du hättest 5 Einträge, die unterschiedliche Werte in der Spalte "Datum" haben. Eines davon ist der 8.10.2017, also heute.

    VB.NET-Quellcode

    1. Private Sub txtsuchen_TextChanged(sender As Object, e As EventArgs) Handles txtsuchen.TextChanged
    2. PrgTable1.BindingSource.Filter = "Datum = #08/01/2017#"
    3. End Sub

    Fertig. Wenn das klappt, sollte der Weg klar sein. Bitte probieren und Rückmeldung geben.
    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.
    hab es jetzt auf nen button gelegt. birngt aber fehlermeldung.
    Ich habe an den Erlaubten Werten nichts geändert, steht dann bestimmt auf string oder?

    und PrgTable1.BindingSource.Filter geht auch nicht, hab es auf PrgTable1BindingSource.Filter abgeändert, dann zeigt er keinen fehler. außer beim debuggen halt.
    Bilder
    • bild 2.PNG

      60,97 kB, 581×471, 79 mal angesehen
    Ah, das ist der Haken, wenn ich nicht so lange in der Wand bohre, bis ich durch bin => hab vergessen, dass ich auf die Mitteilung bestand, von welchem Typ die Spaltenwerte sind. Datum ist in Deiner Tabelle wohl vom Typ String. Wenn in Deiner TextBox dann "08.10.2017" steht, muss im Filter das Datum mit Hochkomma umrahmt werden, z.B.: "Datum = '08.10.2017'".

    EDIT: Ja, ok. Folgendes ist logisch, selber bin ich aber nicht draufgekommen: Du hast recht. Man kann die DGV-DataSource auch anderweitig ohne BindingSource und deren Filter festlegen.
    Der Fehler in Post#28 ist m.E., dass Du das LINQ-Wort Select verwendest => Es werden Dir Datumsangaben zurückgegeben. Du willst aber ne ganze Datenzeile => folgendes sollte laufen:

    VB.NET-Quellcode

    1. DataGridView1.DataSource = DataSet1.PrgTable1.Where(Function (x) x.Datum = txtsuchen.Text)


    @Gottric: (Diese Verlinkung soll einen Hinweis an Dich generieren, dass ich hier noch was zugesetzt habe)
    Das Filtern per LINQ statt per BS-Filter macht das ganze etwas typisierter und einfacher.
    EDIT 2: Hab auch gelesen, dass man bei zuletzt genannter Codezeile im Fehlerfall noch ein .ToList hintendran setzen sollte, falls es zu bestimmten Fehlern kommen sollte.
    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 3 mal editiert, zuletzt von „VaporiZed“ ()

    sehr gut, geht!

    VB.NET-Quellcode

    1. Private Sub btnsave_Click(sender As Object, e As EventArgs) Handles btnsave.Click
    2. PrgTable1BindingSource.Filter = "Roboter = '24'"
    3. Reload()
    4. End Sub

    Wie kann ich jetzt an der stelle wo die 24 steht meinen Text aus txtsuchen eingeben?
    Dann hab ich ja schon alles was ich brauche oder?

    Noch ne andere Frage, momentan speichere ja nur das ab was in dem Datagrindview drin steht in die XML. wenn ich jetzt aber nur einen neuen Datensatz hinzufügen will, wie stelle ich denn das an?
    per BS-Filter: PrgTable1BindingSource.Filter = "Roboter = " & txtsuchen.Text
    per LINQ: DataGridView1.DataSource = DataSet1.PrgTable1.Where(Function (x) x.Roboter = txtsuchen.Text).ToList()

    habe festgestellt, dass das .ToList() zwingend notwendig wird, wenn es mehrere Treffer gibt.

    Ich füge neue Zeilen so hinzu: DataSet1.PrgTable1.AddPrgTable1Row("und hier all Deine neuen Daten, sortiert nach Tabellenspaltenreihenfolge")

    btw: DataGrindView klingt ungesund
    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.

    VB.NET-Quellcode

    1. PrgTable1BindingSource.Filter = (ComboBox1.Text) + " = " + txtsuchen.Text

    so kann ich alles aus der combobox aussuchen und dann den text suchen.

    warum LINQ? so geht doch alles, also oberflächlich zumindest.

    neue zeilen versuche ich sofort, danke

    ARGGGHHH ich raste aus. ich versuch nun seit über 2 Stunden die Zeilen einzufügen.
    Kannst du mir ein Beispiel geben bitte?
    Egal wie ich die Zeile hinter deinem Bespiel fülle unterstreicht er es mir immer rot=> also Fehler.
    Wäre ich echt dankbar für.

    Und noch ne Frage, wie mache ich denn das dass immer die ID Automatisch erhöht wird. Über ne schleife? nehm ich die am besten raus wo man selbst was eintragen kann?

    Edit:
    Meine letze Frage hat sich erledigt, alles geklärt dank Erfinder des Rades seinen Youtube-Videos.
    Aber ne andere Frage.
    warum sucht er ohne Probleme:

    VB.NET-Quellcode

    1. ProgrammeBindingSource.Filter = "Roboter = " & txtsuchen.Text
    2. ProgrammeBindingSource.Filter = "Programmnummer = " & txtsuchen.Text

    aber egal in welcher Variante ich auch suche bei:

    VB.NET-Quellcode

    1. ProgrammeBindingSource.Filter = "Änderungsgrund = " & txtsuchen.Text
    2. ProgrammeBindingSource.Filter = "Änderungsgrund = weil"

    Er sagt mir immer: Die Spalte weil wurde nicht gefunden, steht aber drin. auch in der eigetlichen XML Datei.
    jemand ne Ahnung?

    Edit:

    VB.NET-Quellcode

    1. Private Sub txtsuchen_TextChanged(sender As Object, e As EventArgs) Handles txtsuchen.TextChanged
    2. ProgrammeBindingSource.Filter = "Änderungsgrund like '%" & txtsuchen.Text & "%' "
    3. End Sub

    in nem Textchcangedevent macht er es.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Gottric“ ()