vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 13.03.12 20:42

1. Erledigt und geändert.

4. Für den Fall hätte ich eher eine Exception mit threadübergreifenden Vorgang erwartet. Dann wäre ich möglicherweise auch darauf gekommen. Die Meldung war für mich etwas irreführend. Vermundert mich aber trotzdem, dass die Daten geändert wurden.

Ich danke euch nochmal für die Hilfe. Jetzt kann es mit neuer Motivatoin weiter gehen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 12.03.12 22:37

Hallo zu so später Stunde.

Im Programm erhalte ich manchmal folgende Ausnahme:
System.InvalidOperationException: BindingSource kann nicht die eigene Datenquelle sein. Legen Sie die DataSource-Eigenschaft und die DataMember-Eigenschaft nicht auf Werte fest, die zurück auf BindingSource verweisen.

Diesen Fehler erhalte ich, seitdem ich das INotifyPropertyChanged-Ereignis in meiner Datenklasse hinzugefügt habe und die Werte einer Eigenschaft ändere. Manchmal erscheint die Fehlermeldung im Programmcode, an der Stelle wo ich dieses Ereignis auslöse, manchmal als (vom VS erstellte) MessageBox während das Programm läuft und manchmal klappt es ganz ohne Ausnahme.

Das macht es für mich jetzt schwierig den entsprechenden Code zu posten, da ich nicht weiß, wo genau der Fehler auftritt. In der Form1, in welcher die DataSource gesetzt wird habe ich folgenden Code:
Public Class Form1
    Private tc As New MyTaskController
 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
      Handles Button1.Click
        MyTaskControllerBindingSource.DataSource = tc
        MyTaskControllerBindingSource.DataMember = "Items"
 
        tc.AddTask(New MyTaskA)
        tc.Start(MyTaskStart.Collect)
    End Sub
 
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) _
      Handles Button2.Click
        tc.Start(MyTaskStart.Edit)
    End Sub
 
End Class
Weder liegt der BindingSource der eigene Quelle zugrunde, noch manipuliere ich die DataSource direkt und weiß daher nicht, wo diese Fehlermeldung herkommt. Weiß hier jemand weiter?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: Manfred X
Datum: 13.03.12 06:48

Hallo!

Ich weiss zwar nicht, was sich in deinem Programm im Einzelnen abspielt,
aber ein paar Sachen fallen mir auf:

1. Lege die Datamember-Eigenschaft der Bindingsource VOR Zuweisung der
DataSource fest, sonst kommt es zu einer Wiederholung des Bindevorgangs.

2. Stelle die Datenbindung nicht stets aufs Neue innerhalb eines GUI-Events her,
sondern nur einmal - direkt nach dem Erstellen und Initialisieren von "tc".
(Aktualisierungen nach zwischenzeitlichen Änderungen durch Aufruf der
ResetBindings-Methode veranlassen.)

3. Es hat den Anschein, als ob Du diverse Tasks innerhalb einer Klasse startest,
die als Datenquelle fungiert ("tc"). Wäre es nicht möglich, diese Datenquelle
zu "isolieren" und eine separate Klasse für die Taskverwaltung zu schaffen,
wobei die Tasks auf eine/meherer Instanz(en) der Datenquell-Klasse zugreifen?
Diese Zugriffe wären zu synchronisieren.

4. Erstellst Du innerhalb der Klasse "tc" weitere Datenbindungen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: ModeratorDaveS (Moderator)
Datum: 13.03.12 09:05

Ich schätze du brauchst doch irgendwo SyncLock().

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 13.03.12 09:48

Guten morgen,

Ich habe es mit einem einzigen Thread versucht, also nur einer einzigen Aufgabe. Demnach hat also nur diese eine Klasse Zugriff auf die Datenquelle. Nichtsdestotrotz habe ich die SyncLock-Anweisung in der Methode eingefügt, die durch die SynchronisationContext-Instanz uiContext.Post() aufgerufen wird. Die Ausnahmen erhalte ich aber leider immer noch (es scheinen aber weniger zu sein, vielleicht täuscht das aber auch nur).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 13.03.12 09:59

Guten morgen,

was ich im Grunde getan habe sieht von der Struktur so aus: Re: Mehrere Datenstämme an ein einziges DataGridView binden? und meine darauffolgende Antwort "Update".

1. Der BindingSource weise ich nur die DataSource-Eigenschaft zu. Die DataMember-Eigenschaft lege ich im DGV auf "Items".

2. Die Zuweisung der DataSource im Button-Klick-Ereignis dient derzeit nur zum Test. Natürlich würde ich das in der Sub New oder im Form-Load-Ereignis machen. Ich sorge im Test stets dafür, dass der Button nur ein einziges mal geklickt wird.

3. Die tatsächliche Datenquelle ist lediglich die Items-Eigenschaft der MyTaskController-Instanz tc. In diesem werden mehrere Tasks (Threading.Tasks.Task-Instanzen) gestartet, die neue Items über ein Event an die MyTaskController-Klasse melden, welche diese neuen Daten in die Items-Auflistung aufnimmt. Dieses Event ruft dabei eine Methode im SynchronisationContext des UI-Threads auf, die das Hinzufügen der Elemente in die Items-Auflistung übernimmt. Hierbei sei aber erwähnt, dass die einzelne Aufgabe diese Daten ebenfalls in eine eigene Liste aufnimmt. Das heißt, dass die Daten in zwei Listen vorhanden sind: zum einen in der MyTaskController (die an das DGV gebunden wird) und in einer internen Liste des Tasks, damit diese weiterbearbeitet werden können.

4. Die einzige Datenbinding erfolgt in Form1. Alle anderen Klassen sind vollständig von UI-Elementen getrennt.


Noch ein Hinweis an alle:
Die Ausnahmen treten nur ein, wenn ich auf den zweiten Button klicke. Die MyItem-Klasse (die Daten, die also im DGV angezeigt werden) enthalten eine Status-Eigenschaft. Diese wird unmittelbar vorm Bearbeiten in "Editing" und nach abschließender Bearbeitung in "Edited" geändert. Kann es sein, dass die Änderung so schnell abläuft, dass zu oft eine Änderung an das DGV mitgeteilt wird und daher die Fehler auftreten?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 13.03.12 11:54

Ich bin es schon wieder.

Erst noch einmal Danke an euch für die Hilfe. Ich habe jedenfalls jetzt das Problem in einem neuen Projekt auf ein Minimum reduziert und erhalte den Fehler immernoch sporadisch. Das ganze habe ich hochgeladen und würde euch bitten das mal anzuschauen (Projekt muss dann erst kompiliert werden, bis die Form im VS angezeigt wird). Ich verstehe den Grund der Fehlermeldung nicht und weiß einfach nicht, wo ich ansetzen soll, um den Fehler zu beheben. Ich wäre euch dankbar, wenn ihr helfen könnt und Vorschläge und Ideen zur Fehlerbeseitigung habt.

Ich konnte jedenfalls noch herausfinden, dass
a.) der Fehler entweder immer hier
    Protected Friend Sub OnPropertyChanged(e As _
      System.ComponentModel.PropertyChangedEventArgs)
        RaiseEvent PropertyChanged(Me, e)
    End Sub
auftritt, oder der Standardfehlerdialog für das DGV erscheint, den ich durch Behandeln des DataError-Ereignises abschalten kann und ...

b.) der Fehler offensichtlich *nur* mit der Darstellung zu tun hat. Ich habe dazu das DataError-Ereignis behandelt und erhielt folgende Informationen:
Cancel          False
ColumnIndex     -1
Context         Display {2}
Exception       {"BindingSource kann nicht die eigene Datenquelle sein. Legen" & _
  "Sie die DataSource-Eigenschaft und die DataMember-Eigenschaft nicht auf" & _
  "Werte fest, die zurück auf BindingSource verweisen."}
RowIndex        9
ThrowException  False
wobei der Wert bei RowIndex immer ein anderer ist.

Theoretisch könnte ich um das RaiseEvent-Konstrukt eine Try-Anweisung packen und den Fehler ignorieren, das gleiche im DataError-Ereignis des DGV, da offensichtlich die Eigenschaften korrekt geändert werden, aber das hilft mir auch nicht beim Verstehen des Problems.

EDIT: Noch ein Hinweis zur Erzeugung des Fehlers:
Einfach immer wieder auf "Sammeln" klicken (etwas warten), dann auf "Bearbeiten (simulieren)" und wenn dann der Fehler nicht auftritt, auf "Zurücksetzen" klicken und Vorgang wiederholen. Bei mir kommt der Fehler aber relativ frühzeitig.

Beitrag wurde zuletzt am 13.03.12 um 12:06:29 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: ModeratorFZelle (Moderator)
Datum: 13.03.12 13:11

Du hälst dich an so ziemlich keine Konventionen.

1.
OnPropertyChanged sollte mit dem Namen des Properties aufgerufen werden ( oder besser per expressiontree ) und das PropertyChangedEventArgs sollte dann darin erstellt werden.
http://msdn.microsoft.com/de-de/library/ms229614(v=vs.85).aspx

2.
Statt ständig "New System.EventArgs" zu erzeugen, benutze "System.EventArgs.Empty".

3.
Statt für alles und jedes ein eigenes EventArgs anzulegen benutze ein EventArgs(of T ) ( muss einmalig erstellt werden )

4.
Die Exception ist natürlich klar und hat damit zu tun, das du das mit den Events noch nicht so richtig durchdrungen hast.
Die BindingList hängt sich auch an INotifyPropertyChanged und reagiert ihrerseits auf das Ereignis und versucht dann eben die Änderung des Status an die UI zu geben.
Diese Fehlermeldung ist typisch für die Fehlerbehandlung beim dataBinding.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: Manfred X
Datum: 13.03.12 13:14

Hallo!

Ich habe zunächst folgende Änderungen vorgenommen:
My-Klassen in eine DLL ausgelagert.

Die Reihenfolge dieser Statements geändert:
MyTaskControllerBindingSource.DataMember = "Items"
MyTaskControllerBindingSource.DataSource = tc

Diese Anweisung aus dem Designer entfernt:
Me.MyTaskControllerBindingSource.DataSource = _
GetType(Controler.MyTaskController)

In der ChangeItem-Routine das Item aus Object konvertiert:
Dim ai As MyItem = CType(e.Item, MyItem)
Me.Items.Add(ai)

Die Datasource des DatagridView im Form_Load-Handler der Form1
zugewiesen.


Keine Laufzeit-Probleme erkannt!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 13.03.12 14:28

Danke für deine Antwort. Ich habe aber noch nicht alles so genau verstanden.

1. Ich kann das gerne ändern, kein Problem. Allerdings dachte ich, dass es Konvention wäre ein Ereignis über eine Methode aufzurufen, die mit On beginnt und nachfolgend den Namen des Events trägt. Diese Methode ist Protected Friend und besitzt die EventArgs als Parameter. Daher habe ich es für dieses Ereignis bisher auch so gemacht. Ich sehe auch keinen bedeutenden Vorteil darin, ob ich den Name der Eigenschaft übergebe oder die EventArgs, die den Namen bereits enthalten. Aber wie gesagt: das kann ich natürlich ändern - ist immerhin kaum Aufwand. Erspart mir vielleicht sogar etwas Tipparbeit, wenn ich nur den Name übergeben muss.

2. Normalerweise benutze ich auch die Shared-Instanz davon. Da ich aber aus meinem größeren Projekt den Code übernommen habe, habe ich oft mit Copy & Paste gearbeitet. Denn eigentlich gehört dort wieder eine von mir erstellte EventArgs-Klasse hin.

3. Ich habe nur eine EventArgs-Klasse in dem Projekt verwendet. Eine vorhandene EventArgs(Of T)-Klasse finde ich nicht, weshalb ich diese auch erst programmieren müsste. Ob ich nun die generische Klasse *und* eine typisierte Klasse davon erben lasse oder direkt eine typisierte Klasse erstelle hat für diesen Zweck keinen besonderen Vorteil. Oder verstehe ich nur nicht genau, was du meinst?

4. Dass die BindingList auf INotifyPropertyChanged reagiert ist mir bewusst, deswegen habe ich es implementiert. Damit auch die Änderung des Items an die BindingList und von dieser weiter an das DGV übermittelt wird. Du willst also damit sagen, dass das PropertyChanged-Ereignis nicht im UI-Thread ausgelöst wird und daher der Fehler entsteht? Hmm, wäre zumindest wahrscheinlich, da die Änderungen aus den Threading.Tasks.Task-Instanzen vorgenommen werden, welche eben nicht im UI-Thread laufen. Das bedeutet also, dass ich dieses Event ebenfalls mit dem SynchronisationContext behandeln müsste? Was meinst du mit typisch für die Fehlerbehandlung beim DataBinding?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: keco
Datum: 13.03.12 14:30

Ich habe diese Änderungen genauso vorgenommen, wie du es beschrieben hast. Ich spüre allerdings keine Veränderung. Im Debug-Fenster erhalte ich immernoch vereinzelt die Fehlermeldung, die ich im DataError-Ereignis anzeigen lasse.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: ModeratorFZelle (Moderator)
Datum: 13.03.12 18:13

1.) Schau dir den Link an, das ist die std Implementierung wie sie überall zu sehen ist.

3.) Wie geschrieben die musst du selber erst machen, aber std ist, das man eben nicht für solche Events die nur einen einzelnen zusätzlichen Parameter brauchen eine eigene Eventklasse erzeugt.

4.) Ja, Events werden in dem Thread verarbeitet in dem sie erzeugt werden. Wenn du alsi in einem Task ein Property änderst wird das event auch im nicht UIThread geworfen.
Deshalb typisch, weil bei Databinding viele Exceptions geschluckt werden oder irgendwie komisch ankommen, hat nichts mit dir zu tun.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception: BindingSource kann nicht die eigene Datenquelle sein. 
Autor: DavidoO
Datum: 11.08.15 10:23

Hi.....
Hast du eine Lösung gefunden??
Ich hatte die Tage auch diese nervige Fehlermeldung und nach 2 Tagen weiß ich woran es liegt..
Vielleicht bei dir auch das gleiche?
Also melde dich wenn du das Problem weiterhin hast.
Gruß David

Azubi-Informatik

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel