Datensätze lassen sich per BindingNavigator in DataGridView nicht steuern

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von us4711.

    Datensätze lassen sich per BindingNavigator in DataGridView nicht steuern

    Hallo zusammen,

    ich habe eine Datagridview, die an eine DataTable gebunden ist. Funktioniert soweit auch.

    Jetzt habe ich einen BindingNavigator mit einer zugehörigen BindinSource eingebaut und kann damit zwar die Datensätze in der DataTable steuern, allerdings bewegt sich der Cursor in der dazugehörigen DataGridView nicht nächsten Datensatz bzw. funktioniert hier die Navigation nicht wirklich.

    Die Datasource für DGV ist die DataTable. Ich habe auch schon versucht, die BindingSource an das DGV zu koppeln, klappt aber auch nicht.

    Weis jemand, wie man mit dem BindingNavigator die Datensätze im DataGridView durchlaufen kann und der Cursor sich auch entsprechend zu den Datensätzen bewegt?

    Dim objBindingNavigator As New BindingNavigator(True)
    Dim objBindingSource As New BindingSource()
    ' Set up the BindingSource component.
    objBindingNavigator.BindingSource = objbindingSource
    objBindingNavigator.Dock = DockStyle.Bottom
    Controls.Add(objBindingNavigator)
    objBindingSource.DataSource = objDataTable

    ' DataGridView einbinden
    Controls.Add(objDataGridView)

    ' DataGridView konfigurieren
    With objDataGridView
    .Dock = DockStyle.Fill
    .AllowUserToAddRows = True
    .RowHeadersVisible = True
    .AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.AllCells
    .DataSource = objDataTable
    '.DataSource = objBindingSource
    .Columns("Satznummer").ReadOnly = True
    .Columns("UmsatzbasisID").Visible = False
    .Columns("Rechnungsdatum").Visible = False
    End with

    Danke und Grüße
    Frank
    hast du nicht die möglichkeit das im designer zusammen zu klicken?
    und warum benötigst du den binding navigator wenn du ein dgv hast?

    egtl. ist es ja so, dass du aus dem datenquellenfenster deine table aufs form ziehst und der designer sowohl die bindingsource als auch die verknüpfung für dich automatisch generiert.
    Gruß Hannes
    vermutlich eine Architektur-Frage.
    Also was in welcher Methode steht, und wann die aufgerufen werden.

    Der Code aus post#1 gibt dazu nichts her - man weiß nicht, ob, wann und wo das durchlaufen wird.

    Vom Prinzip her muss die ganze Konfiguration in den Startup, und darf nur einmal durchlaufen werden.

    Auch mein Rat: lerne, sowas in Designern zu machen, dafür sind sie da.
    Gugge Videos, um einen Eindruck zu kriegen: vier Views-Videos (folge dem Link)
    Studiere Tutorial, um zu verstehen, was da eiglich gemacht wird, wie und worauf zu achten ist: codeproject.com/Articles/1033145/Databinding-for-Beginners ( <- das Tut hat insges 3 Teile, einen Vorgänger, einen Nachfolger )

    Beachte auch die Bedeutung den Schlüsselwortes New nicht bekannt, dass da nämlich etwas neues erstellt wird.
    Und wenn da bei BindingSources, DataTable, Dataset o.ä. dran gebunden ist, ist es daran gebunden, und beim nächsten New ist immer noch ans Vorherige gebunden, und da wundert man sich dann, dass vom Neuen nix zu sehen ist, und kommt nicht drauf, dasses daran liegt, dass die Bindungen ja nachwievor am alten hängen etc..
    Allerdings erledigt sich dieses Problem meist auch selbst, wenn Designer verwendet werden (es tritt dann erst wieder bei Verwendung mehrerer Forms auf).

    Ach, und noch ein Tipp: Lass den BindingNavigator weg. Niemand wird damit navigieren, etwa 50 mal "runter" klicksen, wenn er paralell dazu ein DGV hat, in dem er einfach scrollen kann, und sogar gleich die Werte sieht, sogar mehrere Zeilen und mehrere Spalten.
    Selbst eine Combobox ist ergonomischer als dieses BindingNavigator-KlickKlick-Krams.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo,

    @mox:
    Ja, ich habe es mit MoveNext und MovePrevious etc. der BindingSource versucht. Die Datensätze werden dort und in der DataTable auch korrekt angesteuert jedoch läuft die Markierung in der DataGridView nicht mit.
    Und umgekehrt wenn ich in der DGV navigiere, ändert sich die Datensatzzahl im Navigator nicht...

    @Rest:
    Ich hjabe ich nun auch vom Navigator gelöst und lass ihn einfach weg, da mit die DGV prinzipiell auch ausreicht.

    Dennoch und da ich in VB.NET ein blutiger Anfänger bin, werde ich nun einla lernen, die Controls u.ä. versuchen mit dem Designer zu erstellen...

    @ErfinderDesRades:
    Nachdem die Daten via TableadApter und DataTable in die DataGridView geladen werden, soll der Anwender die Möglichkeit haben, diese quasi Offline zu bearbeiten und sie dann per Button alles samt in einem Rutsch in die dahinterliegende Datenbank schreiben können.
    Dafür habe ich eine Routine, die die DataTable durchläuft und jeweils abhängig vom RowState ein Ändern, Hinzufügen und Löschen eines Datensatzes dann in der DB durchführt.
    Ist das "Offline Arbeiten" auch beim Aufbau der DGV und entsprechenden Bindingsources etc. dann auch so mit dem Designer möglich oder werden Änderungen dann immer sofort in der DB aktualisiert?

    frankseipferd schrieb:

    Nachdem die Daten via TableadApter und DataTable in die DataGridView geladen werden, soll der Anwender die Möglichkeit haben, diese quasi Offline zu bearbeiten und sie dann per Button alles samt in einem Rutsch in die dahinterliegende Datenbank schreiben können.
    Dafür habe ich eine Routine, die die DataTable durchläuft und jeweils abhängig vom RowState ein Ändern, Hinzufügen und Löschen eines Datensatzes dann in der DB durchführt.



    wenn du den adapter richtig nutzt macht das egtl. ein da.update() befehl für dich ganz von alleine und automatisch.
    Gruß Hannes
    Das dataset befindet sich im Arbeitsspeicher des pcs auf dem deine Anwendung läuft, die Daten die im dataset geändert werden sind vorab nur im dataset geändert und haben dann den rowstate modified oder Added.... Beim Update geht der tableadapter durch und erledigt diesen Job für dich.
    Gruß Hannes
    Verstehe...
    was passiert allerdings wenn ein anderer anwender in der zwischenzeit denselben datensatz in der db verändert hat?
    dann bekomme ich doch einen fehler oder?
    ich hätte dann gerne eine "last wins" lösung, dass immein der db altualisiert wird, egal wer wann was ändert und dass dimmer die letzte änderung die vorige überschreibt...
    Deshalb sende ich für jeden datensatz einen update-befehl...
    Last-In-Wins ist das Standard-Verhalten, und man muss schon bischen was trickreicheres programmieren, wenn man (durch Exceptions) auf Parallelitäts-Konflikte aufmerksam gemacht werden möchte.

    Einzig im Falle, dass du dir ein typDataset aus einer Db generierst - da ist standardmäßig die Parallelitäts-Konflikt-Überwachung aktiviert.
    Das kann man aber abschalten, wenn man im Generier-Assistenten die TableAdapter konfiguriert.

    Aber ich vermute, du verwendest eh kein Assistenten - oder?

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

    so, nun habe ich mal das ganze mit dem Designer zusammengebastellt.

    Die DataGridView zeig die Daten aus meiner Tabelle bzw. aus der entsprechenden DataTable im DataSet an.

    Nun wollte ich für das Feld UmsatzartID ein ComboBox hinzufügen. Bekomme ich auch soweit hin, wenn ich allerdings Display- und oder Value Member auf die entsprechende Lookuptabelle (ebenfalls aus dem Gesamtem DataSet) ändere, bekomme ich beim starten des Programms immer folgende Meldung:

    Fehler beim generieren des Codes. Die im Designer vorgenommenen Änderungen wurden nicht auf den Quellcode angewendet. Sie Sollten den Quellcode auf Fehler überprüfen und die Quelldatei dann schließen und neu öffnen. Die Fehlermeldung lautete: Der Wert liegt außerhalb des gültigen Bereichs.

    Weis jemand was da schief läuft?
    Schau' Dir mal den Projektexplorer vom @ErfinderDesRades an, ich find' den einfach zu handhaben. Und der tut, was er soll. Hab' mir dafür eine Visual-Studio-Erweiterung geschrieben, die ich jetzt oben im Menüband stehen habe. Sicherung des Projektes ist nun wirklich nur noch ein Mausklick.
    //Edit:
    Das Programm heisst SolutionExplorer, sorry

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