Bindingsource updaten


Jeiss

Grünschnabel
Hallo alle zusammen, komme nicht mit dem updaten meiner Bindingsource klar.
Auf einer Form habe ich unter anderen Steuerelementen auch ein Datagridview und eine ComboBox. Ich moechte die Combobox gerne gleicheitig zum Anzeigen der Werte aus einer bestimmten Spalte des DGVs und aber auch zum ändern dieser Werte butzen. Das mit dem Anzeigen klappt ja ganz wunderbar. Aber wähle ich einen anderen Eintrag aus der Liste der CBB aus, dann wird dieser nicht in der BindingSource (und natürlich auch nicht im DGV) übernommen. Ich erspare euch einstweilen noch die Einzelheiten über die BindingSource und der beiden Steuerelemente. Wollte nur mal fragen ob das was ich vorhabe überhaupt machbar ist. Falls das der Fall sein sollte, dann sehen wir uns meinen Code mal näher an.

Danke,
Jeiss
 

Jeiss

Grünschnabel
Hallo alle zusammen, ich bin es noch einmal. Da niemand mir antwortet, antworte ich mir halt selber. :) Ich nehme wohl an dass ich etwas zu sehr mit den Angaben über mein Problem gegeizt habe. Ich versuche das wieder gut zu machen. Also wie schon beschrieben ärgert es mich, dass die Einträge in meinem DGV welches an die gleiche Bindingsource gebunden ist als meine ComboBox, die Werte (bessergesagt den Wert) nicht SOFORT aktualisert nachdem ich im ComboBox einen Eintrag aus dessen Liste gewählt habe. Beide Steuerelemente befinden sich übrigens auf der gleichen Form. Die Werte in der Spalte des DGV werden erst aktualisiert nachdem ich entweder mit dem BinbingNavigator weiter oder zurück-navigiert habe, bzw. nachdem ich ein anderes Steuerelement auf der Form angeklickt habe. Müsste das denn nich automatisch gehen sobald der Text in der ComboBox geändert hat? Die einzige Lösung die ich bis jetzt habe ist, dass ich im ComboBox_SelectedIndexChanged-Event ein BindingSource.EndEdit() eingefügt habe. Aber das kann ja nicht die Lösung sein, denn dieses Event wird auch jedesmal beim navigieren zwischen den Einträgen des DGVs ausgelöst. Also wie ihr sehen könnt, könnte ich einen guten Rat oder einfach mal eine Meinung zu meinem Problem gebrauchen.
Ah noch etwas, könnte mir bitte jemand verraten wie ich es anstellen muss, dass vor meinem Beitrag (in der Liste aller Beiträge im Forum) dahinstehen kommt dass ich mit VB2008 programmiere.
Danke,
Jeiss
 

Jeiss

Grünschnabel
Hallo Spyke, hab mich über deine Hilfe sehr gefreut. Aber leider versuche ich schon seit zwei Tagen diese INotifyPropertychanged Schnittstelle für mein kleines Problem einzusetzen, aber leider ohne den geringsten Erfolg. Es ist auch das Erste Mal dass ich damit rumexperimentiere. Beim Googlen bin ich natürlich auf Beispiele gestossen, aber leider waren das alles Beispiele mit "eigenen" Eigenschaften (also Properties) und nicht wie in meinem Fall mit einem Event (oder Eigenschaft) einer Combobox. Auch waren das auch immer Beispiele OHNE Bindingsource.
Könntest du mir bitte noch ein wenig weiter helfen? Ich habe meine Klasse schon mal um folgenden Code erweitert:
Code:
 'Die Erste zeile in der Klasse: 
 Implements INotifyPropertyChanged
'Dann werden die Variablen deklariert....
' Und dann:
    Public Event PropertyChanged As PropertyChangedEventHandler _
     Implements INotifyPropertyChanged.PropertyChanged


    Private Sub NotifyPropertyChanged(ByVal info As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    End Sub
Und da ich nicht wusste wie ich dieser PropertyChanged-Event überhaupt auslösen könnte habe ich einfach eine Eigenschaft erstellt, in deren SET-Bereich der Wert der Eigenschaft gesetzt wird und dann auch noch "NotifyPropertyChanged" aufgerufen wird. Und der Code dieser Eigenschaft sieht so aus:
Code:
 Public Property EntryType() As String
        Get
            Return newEntryType
        End Get
        Set(ByVal value As String)
            newEntryType = value
            NotifyPropertyChanged("EventType")
        End Set
    End Property
Der Code wird auch durchlaufen wenn ich in der Liste der ComboBox ein neues Item auswähle, aber leider wird der Wert in der BindingSource nicht geändert. Und im DGV welches an die gleiche BS gebunden ist passiert natürlich auch nichts.
So ich hoffe du erkennst mein Problem und kanns mir noch ein wenig weiter helfen.
Danke,
Jeiss
 

Spyke

Premium-User
das PropertyChangedEventArgs erwartet den Namen der Eigenschaft, nicht irgendeine willkürliche Info ;)

Also nicht EventType sondern EntryType
Code:
NotifyPropertyChanged("EntryType")

Im Prinzip wird durch diese Schnittstelle (mit dem Ereignis) der Datenbindung mit geteilt welche Eigenschaft sich geändert hat.


Die Datenbindung für die Combobox hast du die über den Disgner gemacht?

Wenn ja geh mal beim Eigenschaftenfenster in der IDE, wenn ComboBox angeklickt.
Zu (Databindings) und dort (Advanced) aufrufen.

Dort siehst du nun die Eigenschaften der Combobox und bei der jeweiligen Eigenschaft, "Data Source Update Mode". Dort dann OnPropertyChanged auswählen.

Puh, hoffe ist verständlich.
 

Jeiss

Grünschnabel
Hi Spyke, hab alles nach deinen letzten Anweisungen geändert. D.h. ich habe dem PropertychangedEvent den Namen der Eigenschaft übergeben und ich habe den DataSourceUpdateMode auf "OnPropertyChanged" gesetzt. Zwar habe ich die Datenbindung meiner ComboBox nicht mit dem Desiger sondern per Code programiert. Sieht bei mir also so aus:
Code:
        cbxEventType.DataBindings.Add(New Binding("Text", Getdata.BS_Events, _
 "EventType", True, DataSourceUpdateMode.OnPropertyChanged))
Das Problem ist, ich bin mir nicht ganz sicher ob es etwas gebracht hat! Denn der Wert im DGV ändert sich nach wie vor nicht automatisch nachdem ich einen neuen Eintrag aus der Liste der ComboBox aus ausgewählt habe. Verfolge ich, in der IDE, aber den Wert in der BS dann scheint diese die Aenderung aber mit zu bekommen(?) Aber leider wird der neue Wert nicht an die DGV übertragen. Wie bereits erwähnt, hat die DGV die gleiche Bindingsource als Datasource.
Code:
DataGridView1.DataSource = Getdata.BS_Events
Also wie du siehst, wäre es gut wenn du dich noch ein wenig um mich und mein kleines Problem kümmern könntest.:)
Im Prinzip wird durch diese Schnittstelle (mit dem Ereignis) der Datenbindung mit geteilt welche Eigenschaft sich geändert hat.
Jetzt müssten wir also nur noch einen Weg finden damit meine Datenbindung die geänderte Eigenschaft nicht für sich behält, sondern schön artig an die DGV weiter reicht. Ich bedanke mich auf jedenfall jetzt schon für deine Hilfe.
Danke,
Jeiss
 

Spyke

Premium-User
hm ich arbeite bei Datenbindung immer mit dem Designer aber wenn ich das richtig sehe hast du die falsche Eigenschaft der Combobox gebunden.
Versuch es anstatt mit Text lieber mal mit SelectedItem oder SelectedValue,
 

Jeiss

Grünschnabel
Hallo Spyke, jeider hat das auch nichts gebracht. Binde ich die Eigenschaft SelectedValue, dann zeigt mir die ComboBox gar keine Werte mehr an. Binde ich SelectedItem, dann stelle ich gar keinen Unterschied zur Bindung der Text-Eigenschaft fest. Ich habe in der Zwischenzeit eine ganz andere Variante ausprobiert, Und zwar habe ich bei MSDN was gefunden das einwandfrei funktioniert. How to: Ensure Multiple Controls Bound to the Same Data Source Remain Synchronized
Sieht dann so aus:
Code:
Private Sub bindingSource1_BindingComplete(ByVal sender As Object, _
    ByVal e As BindingCompleteEventArgs) Handles bindingSource1.BindingComplete

    ' Check if the data source has been updated, and that no error has occured.
    If e.BindingCompleteContext = BindingCompleteContext.DataSourceUpdate _
        AndAlso e.Exception Is Nothing Then

        ' If not, end the current edit.
        e.Binding.BindingManagerBase.EndCurrentEdit()
    End If

End Sub
Ich werde deine Variante mal für andere Zwecke zurückbehalten. Obwohl ich es noch nich ausprobieren konnte, glaube ich dass die INotifyPropertyChanged-Methode eher dafür geeignet ist um Aenderungen in Eigenschaften (Properties mit Get u. Set) als in gebundenen Steuerelemente festzustellen. Ich habe im gleichen Projekt, auf einer anderen Form den Fall wo ich mit Daten von Kontakten (Name, Vorname, Adresse.....) zu tun habe. Also alles Properties die auch gesezt werden müssen. Ich werde mal sehen ob ich da was mit INotifyPropertyChanged anstellen kann. Falls das auch nicht klappen sollte werde ich mich noch einmal hier im Forum melden. Hiermit betrachte ich das ursprüngliche Problem als gelöst un kann den Fall als "erledigt" betrachten.
Ich bedanke mich auf jeden Fall sehr für deine Hilfe. Denn auch wenn ich nicht direkt mein Problem mit der INotifyPropertyChanged-Methode lösen konnte hat sie mir erlaubt in Bereiche von VB reinzuschauen die ich als Anfänger bis jetzt immer gemieden habe.
Danke,
Jeiss
 

Spyke

Premium-User
ok, aufjedenfall konntest du eine Lösung finden

um zu schauen warum INotifyPropertyChanged bei dir nicht funktioniert hat, hätte man sich wohl dein Projekt anschauen müssen.

Und da ich kein VB hier drauf hab bin ich froh das es nicht soweit kommen musste :)

Aber nur noch eine letzte Frage die DataSource Eigenschaft der ComboBox hattest du schon gesetzt oder?
 

Jeiss

Grünschnabel
Hallo Spyke, also eins muss man dir lassen. Wenn du einmal bis dran bist, dann lässt du auch so schnell nicht wieder los. Super!
Aber nur noch eine letzte Frage die DataSource Eigenschaft der ComboBox hattest du schon gesetzt oder?
Die Antwort lautet ganz klar NEIN! Ich hab bis jetzt gar nicht gewusst, dass man die überhaupt brauch. Dachte immer es würde mit einer Biningsource reichen. Ich hab das natürlich ausprobiert. Habs so gemacht:
Code:
cbxEventType.DataSource = Getdata.ds.Tables("tblEvents")
Ich hoffe das ist was du gemeint hast?
um zu schauen warum INotifyPropertyChanged bei dir nicht funktioniert hat, hätte man sich wohl dein Projekt anschauen müssen.
Die Idee gefällt mir gut. Vor allem da du dir ja ziemlich sicher zu sein scheinst dass das auch bei mir funktionieren müsste.
Frage: Wäre uns damit weitergeholfen wenn ich im Laufe der nächsten Woche eine Demo zusammenbasteln würde. Könntest du sie dir dann irgendwann mal anschauen oder kommst du nicht an einen Rechner mit VB ran? Sonst würde ich nämlich eine Demo mit genau den gleichen Elementen zusammenbasteln. D.h. mdf-Datenbank (SQL), Formanwendung mit einem DGV und eimer ComboBox, einem Dataset mit einer Tabelle, einer Bindingsource, sogar auch eine Combobox.Datasource wenn du drauf bestehst ;)
Na ist das ein Angebot? Sag mir bitte bescheid bevor ich anfange an der DEmo rumzuarbeiten. Ich habe das zwar noch nicht ausprobiert, aber es sieht so aus als ob ich die Demo dann als "Anhang" mit-posten könnte.
Danke,
Jeiss
 

Spyke

Premium-User
Also um ganz ehrlich zu sein, Wochenende ist vorbei und in der Woche hab ich keine Lust mich dann noch durch Fremdencode zu wüllen. :D
Da kommt es dann wirklich auf die Tagesform drauf an

Natürlich könnte ich mir auch VB Express runterladen aber ehrlich gesagt will ich das nicht ;)
In der Regel reicht eh ein Texteditor (am besten noch mit bissel Syntaxhighlight) um das wesentliche zu sehen.

Auch arbeite ich nicht mit DataSet, ich würde das ganze über Listen regeln.
 

Jeiss

Grünschnabel
Hi Spyke, eigentlich schade. Aber ich kann das schon irgendwie verstehen. Also meine kleine Demo muss ich trotzdem vorbereiten und zwar meinetwegen. Ich fange nämlich an den Ueberblick in meinem Projekt zu verlieren. Permanent werden nämlich andere Events ausgelöst, so dass es gar nicht mehr so einfach ist zu sehen wann eine Aenderung der Daten erfolgt. Ich plage mich zur Zeit nämlich mit zwei DateTimePicker die auch nicht immer dann die Werte zurück an die Bindung geben wann ich es möchte sondern ganz einfach nur wenn sie es für richtig halten. Und da es bei DTP keine PropertyChanged-Eigenschaft zu geben scheint, muss eben doch noch einmal "INotifyPropertychanged" herhalten. Ok somit betrachte ich die ursprüngliche Aufgabe bis hierhin als gelöst, und werde diesen Beitrag somit im Forum als "erledigt" kennzeichnen.
Danke,
Jeiss
 

Neue Beiträge

Forum-Statistiken

Themen
272.361
Beiträge
1.558.639
Mitglieder
187.834
Neuestes Mitglied
jordanx0206