Zeile in DGV einfügen, Zeile wählen, Werte eintragen (mit Code)

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zeile in DGV einfügen, Zeile wählen, Werte eintragen (mit Code)

    Hallo zusammen!

    Ich versuche jetzt schon seit einer gefühlten Ewigkeit in DataGridView eine Automatisierung zu programmieren.
    DataGridView befindet sich in Form2.
    Von Form1 wird eine Zahl in das DataGridView Spalte 1 übertragen (Dort befindet sich erstmal nur diese eine Spalte).
    Das Funktioniert ohne Probleme.
    Dann möchte ich aber das über dieser Zeile eine neue erscheint, nachdem in der ersten Zeile die Zahl übertragen wurde, wo dann durch erneutes übertragen von Form1 wieder die Zahl drin steht.
    Das soll dann halt die ganze Zeit so weitergehen.
    Form1 überträgt 1 an Form2 DataGridView -> in der ersten Zeile steht nun diese 1 -> neue Zeile über der ersten erscheint.
    Form1 überträgt 1 an Form2 DataGridView erneut -> in der neuen Zeile steht nun diese 1 -> neue Zeile über dieser Zeile erzeugen.
    usw. usw. usw.

    Meine Frage ist nur, wie krieg ich das hin?
    Hat jemand da vielleicht nen Code für mich?


    Entschuldigt, ich bin echt nicht gut darin, solche Sachen zu erklären. Hoffe ihr konntet mir ein wenig folgen.

    Grüße!

    Grisey schrieb:


    Hat jemand da vielleicht nen Code für mich?

    So läuft das nicht. Es bringt dir nix wenn dir jemand fertigen code hinklatscht, wenn du keine Ahnung hast was da passiert.

    zum Thema
    Wieso muss denn unbedingt über der letzten eingefügten Zeile eine leere Zeile sein?
    Man könnte doch einfach schon brav immer eine Zeile hinten anhängen (addRow) und dann einfach das DGV absteigend nach dem Primärkey sortieren. Somit ist das neueste immer oben.
    Das Zaubärwort für sowas nennt sich Databinding. Es ist nämlich ein Holzweg, Daten (auch noch von hinten durch die Brust ins Auge) von einer Form in die andere und denn in ein datagridview zu übertragen. Der normale Ablauf ist der:
    Du hältst eine applikationsweit verfügbare Datatable im Speicher. In diese werden deine Werte eingetragen, gelöscht usw. Diese wird per Databinding an dein Datagridview in Form2 und gleichzeitig an deine Textbox in Form1 gebunden. Damit erscheinen Änderungen des Einen sofott im Anderen.
    Die Grundlage dafür findest du in diesem Tut über typisiertes Dataset.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    @Vatter
    Sowas klappt dann aber nur wenn sich form1 und form2 in einer Instanz einer Klasse befinden. (Was wahrscheinlich im diesem konkreten Fall auch sinnvoll ist)
    Wenn Form1 und Form2 in 2 verschiedenen Anwendungen laufen, sollte es nicht so einfach gehen.

    markus.obi schrieb:

    Sowas klappt dann aber nur wenn sich form1 und form2 in einer Instanz einer Klasse befinden.
    Ergibt mir keinen Sinn. Wieso müssen form1 und form2 in einer Klassen-Instanz sein?
    Ebenso denkbar, wennich sogar wahrscheinlicher ist doch, dass form2 innerhalb von form1 instanziert wird.

    Wenn Form1 und Form2 in 2 verschiedenen Anwendungen laufen, sollte es nicht so einfach gehen.
    Na, dass die Forms in derselben Anwendung laufen sollen, davon gehe ich mal aus.
    Hab das jetzt mal anders versucht.
    Hab mir eine Datenbank erstellt das ganze dann mit DGV in meine Form eingefügt.
    Dann erstellt er mir automatisch diesen BindingNavigator wo sich auch ein Button für das hinzufügen von Zeilen befindet.
    Diesen wollte ich nun ansteuern nachdem der Wert in die Zelle geschrieben wurde, sodass er mir danach dann eine neue Zeile hinzufügt.
    An sich funktioniert das auch. Nur er erstellt mir direkt 3 neue Zeilen.
    Verstehe nun nicht warum er das tut.
    In den Eigenschaften von diesem Button habe ich eingestellt das er nur eine hinzufügt.
    Dennoch erstellt er 3.

    Hier mal ein Ausschnitt aus meinem Programm:

    Quellcode

    1. Private Sub AD_0115DataGridView_DefaultValuesNeeded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowEventArgs) Handles AD_0115DataGridView.DefaultValuesNeeded
    2. If Form1.RadioButton1.Checked Or Form1.RadioButton2.Checked Then
    3. If Form1.RadioButton1.Checked Then
    4. If Me.Enabled Then
    5. With e.Row
    6. .Cells("Wareneingang").Value = 1
    7. .Cells("Datum").Value = Date.Now
    8. End With
    9. BindingNavigatorAddNewItem.PerformClick() 'Hiermit soll eine neue Zeile erzeugt werden!
    10. Else
    11. Return
    12. End If
    13. Else
    14. If Me.Enabled Then
    15. With e.Row
    16. .Cells("Warenausgang").Value = 1
    17. .Cells("Datum").Value = Date.Now
    18. End With
    19. BindingNavigatorAddNewItem.PerformClick() 'Hiermit soll eine neue Zeile erzeugt werden!
    20. Else
    21. Return
    22. End If
    23. End If
    24. Else
    25. MsgBox("Bitte Wareneingang oder Warenausgang auswählen!")
    26. Me.Close()
    27. Form1.TextBox1.Select()
    28. End If
    29. End Sub
    30. End Class
    Ich arbeite noch nicht sonderlich lange mit Visual Basic.
    Mit Basic an sich kenne ich mich mittlerweile relativ gut aus.
    Hin und wieder muss ich mir da Hilfe holen.

    Kannst du mir denn sagen welches Event für mein Vorhaben besser geeignet wäre?
    na, dann soll dein freund dir das auch zuende programmieren ;)

    imo ist das blödsinn, aber ich versteh von deim ganzen ansatz nur bahnhof, und halte ihn für total ungeeignet.

    verwende zur Datenverarbeitung ein typisiertes Dataset, und binde das dgv daran.
    gugge "Datenbank in 10 Minuten" auf Movie-Tuts, um den DB-Zugriff zu erlernen, aber entiwickel zunächst mal DatasetOnly ("DatasetOnly" auf Movie-Tuts bzw DB-Programmierung ohne Datenbank)

    Dann hast du ein tragfähiges, standardisiertes Anwendungsdesign, zu dem man dir auch Vorschläge machen kann.
    Dann erkläre ich euch mal was ich genau vorhabe:

    Lagerverwaltung per Scanner.
    Programm starten -> Fenster mit Textfeld und 2 RadioButton öffnet sich.
    Nun soll zunächst (per RadioButton) ausgewählt werden, ob es sich beim nachfolgenden Scanvorgang um Wareneingang oder Warenausgang handelt.
    Es folgt das Scannen eines Barcodes.
    Sollte es sich beispielsweise um Wareneingang handeln, wird nun OHNE das irgendein Button gedrückt werden muss, die Datenbanktabelle (bestimmte Form) im Hintergrund aufgerufen und dort das aktuelle Datum eingetragen (Spalte "Datum") und in die Spalte "Wareneingang" eine 1.
    Danach soll eine neue Zeile erstellt werden, in die später wieder etwas eingetragen werden kann.
    Der Barcode der im Textfeld steht wird nach Eintragung in die Datenbank gelöscht und für erneutes einscannen freigegeben.
    Scanne ich nun den gleichen Barcode nochmals ein, soll in der Datenbank für diesen bestimmten Artikel, in der neuen Zeile, wieder das aktuelle Datum und in der Spalte "Wareneingang" die 1 eingetragen werden.

    Sollte es sich um einen anderen Barcode handeln, soll das gleiche geschehen, nur mit dem unterschied das im Hintergrund eine andere Form (für den jeweiligen Artikel) geöffnet wird und dort alles eingetragen wird.

    Das "Lager" kann dann bequem per Button auf der ersten Form aufgerufen werden, bei bedarf.
    Dort könnte man nun nachschauen, was wann raus- oder reingekommen ist.
    für eine Datenverarbeitung musst du anfangen, datenbänkerisch zu denken.

    Grisey schrieb:

    die Datenbanktabelle (bestimmte Form) im Hintergrund aufgerufen
    Also mit Formen im Hintergrund läuft da garnix, sondern im Hintergrund steht das typisierte Dataset, und das enthält Tabellen, wo Datensätze eingetragen werden können.

    Bist du inzwischen imstande, ein typDataset anzulegen, es im DGV anzuzeigen, und auch wieder abzuspeichern?
    Alle dafür erforderlichen Infos sind in den gegebenen Links enthalten.

    Weil einen Datenbänker interessiert nur, ob du Zugriff hast oder nicht - ob das per BarcodeScanner passiert, per DGV und User-Aktion oder mw. per Serialport - dassis unwesntlich für die planung des Datenmodells.

    Und das einfachste, wo man schonmal was sieht, und laden, ändern, speichern kann ist die Anzeige per DGV.

    Also nochmal die Frage:
    Bist du inzwischen imstande, ein typDataset anzulegen, es im DGV anzuzeigen, und auch wieder abzuspeichern?

    Weil dann kann man in die Datenmodellierung einsteigen.
    na schön. Lagerverwaltung. Es gibt Artikel, es gibt LagerOrte, es gibt Zu-/Abgänge.
    Das sind 3 Tabellen, weil ich Zu-/Abgang als eine Tabelle auffassen würde.

    Welche Eigenschaften (= Spalte) ein Artikel hat, welche ein LagerOrt mußt du dir ausdenken, zur Tabelle Bewegung könnte ich mir folgende Spalten vorstellen:
    ID, ArtikelID, LagerOrtID, Count, Time

    Ist das verständlich?
    Wenn es möglich ist würde ich lieber nur eine Tabelle verwenden mit folgenden Spalten:
    Artikel, Wareneingang, Warenausgang, Datum

    Dort können dann sämtliche Daten eingetragen werden.
    Später könnte man dann wenn man auf das "Lager" zugreift, per Dropdown Menü einen bestimmten Artikel oder ein bestimmtes Datum auswählen und sich so anzeigen lassen was rein oder rausgegangen ist.

    Ich denke das vereinfacht das ganze.

    ErfinderDesRades schrieb:

    was soll denn in Spalte "Artikel" stehen?
    Wird etwas eingescannt und es handelt sich zB. um den Artikel "ABC-123", nehmen wir mal an es ist Wareneingang, steht nun in der Tabelle unter der Spalte "Artikel" : ABC-123
    Unter Spalte Wareneingang: 1
    Unter Spalte Warenausgang: -
    Unter Spalte Datum: Datum von heute

    Scanne ich jetzt was anderes ein, zB. den Artikel "DEF-456", wird in einer neuen Zeile wieder eingefügt:
    Unter Artikel: DEF-456
    Unter Spalte Wareneingang: 1
    Unter Spalte Warenausgang: -
    Unter Spalte Datum: Datum von heute