none
Probleme mit DataGridView und BindingSources RRS feed

  • Frage

  • Hallo Community!

     

    Ich bin jetzt mit dem Beschreiben der Datenbanken schon recht weit und es klappt auch alles gut, NUR das visuelle Darstellen durch DGVs nicht so wie ich möchte.

    Habe im Internet schon einige Seiten gegoogelt um zu schauen, wie das Ganze mit DGV und BindinSources funktioniert. Im Prinzip scheint das recht einfach zu sein. Aber es will bei mir einfach nicht hinhauen! :(

    Zur Aufgabenstellung: Habe ein DGV, welches die Inhalte einer Tabelle anzeigen sollen, jedoch soll der User entscheiden, welche genau (er gibt ID vor und  das Programm filtert alle Einträge in der Tabelle mit WHERE). Zudem soll sich das DGV aktualisieren, wenn neue Inhalte in die Datenbank reinkommen.

    Soweit zu der Aufgabe!

    Nun das Problem:

    Erstmal verstehe ich nicht genau, ob ich die BindingSource jedes mal NEU an das DGV als DataSource binden muss, oder ob sich das DGV automatisch mit Veränderungen der BindingSource.DataSource verändert...

    Habe jetzt einfach mal angenommen, dass ich jedes mal alles neu machen muss zur Aktualisierung. Dann bin ich wie gefolgt vorgegangen:

     

     private void refresh_datagridview(int selected_session) // threadsicheres Update/Refreshment des Datagridview im WinForms
        {
    
          using (connectionsEntities context_data = new connectionsEntities())
          {
            var query = from p in context_data.udp_data
                  where p.SessionID == selected_session
                  select p;
    
    
            bsource = null;
            bsource = new BindingSource(); // diese 2 Zeilen existiert, da ich aus verschiedenen Threads zugreife, aber bsource keine InvokeRequired-Abfrage bietet... 
    
            bsource.DataSource = query;
    
            if (dataGridView_data.InvokeRequired)
            {
              Invoke(new MethodInvoker(delegate { dataGridView_data.DataSource = bsource; }));
            }
            else
            {
              dataGridView_data.DataSource = bsource;
            }
    
          }
        }
    

    Das funktioniert nicht so richtig, also das erste Mal auf jeden Fall, aber dann kommt folgender Fehler im Entity-ModelDesigner...

    System.ObjectDisposedException wurde nicht von Benutzercode behandelt.
     Message=The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
     Source=System.Data.Entity
     ObjectName=""
     StackTrace:
        at System.Data.Objects.ObjectContext.EnsureConnection()
        at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
        at System.Data.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)
        at System.Data.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)
        at System.Data.Objects.DataClasses.RelatedEnd.Load()
        at System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad()
        at System.Data.Objects.DataClasses.EntityReference`1.get_Value()
        at WindowsFormsApplication1.udp_data.get_udp_connections() in C:\Users\Nisse\documents\visual studio 2010\Projects\ProjektArbeit\WindowsFormsApplication1\connectionsModel.Designer.cs:line 522
     InnerException: 
    
    

    ...im Getter des folgenden Abschnittes:

     public udp_connections udp_connections
        {
          get
          {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<udp_connections>("connectionsModel.FK_udp_data_udp_data", "udp_connections").Value;
          }
          set
          {
            ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<udp_connections>("connectionsModel.FK_udp_data_udp_data", "udp_connections").Value = value;
          }
        }
    

    Also das sind so meine Problemchen, die mich plagen... Ich würde mich freuen, wenn mir jemand helfen kann, denn ich komme da einfach nicht weiter, außer dass am Ende entweder meine Tabelle flackert und komische Dinge macht oder Exceptions aufgerufen werden...

    Wenn ich irgendetwas beim Binding, SQL-Abruf etc. FALSCH gemacht haben sollte, dann würde ich mich auch da (selbst wenn es nicht das Problem auslöst) über Kritik/Verbesserungsvorschläge freuen!

    Kurze Frage noch: mit dem query, habe ich damit dem PC klargemacht, dass er ALLE verfügbaren Inhalte der Tabelle die SessionID xxx haben in query schreiben soll? Irgendwie kommt beim ersten Durchlauf nur das erste Element der Tabelle an, beim zweiten nur 2, beim dritten nur 3 usw... :(

     

    Also, vielen Dank, freue mich von euch zu hören!

     

    MFG

     

    Der Nisse!

    Donnerstag, 6. Januar 2011 18:11

Antworten

  • Hallo Nisse,

    zu den noch offenen Dingen:

    Eine automatische Aktualisierung funktioniert nur dann wenn die Datenquelle eine Änderungsbenachrichtigung unterstützt.

    Beim von Dir (vermutlich) verwendeten Entity Framework funktioniert das nur eingeschränkt, siehe
    Gewusst wie: Binden von Objekten an Windows Form-Steuerelemente (Entity Framework)
    und auch Binden von Objekten an Steuerelemente (Entity Framework)

    Da dort einige (bis viele) Einschränkungen bestehen, ist es i. a. sinnvoller direkt über eine BindingList(T)   zu gehen.

    Was das InvokeRequired angeht, dürfte das Problem mit Deinem anderen Problem in Verbindung stehen.

    Da solltest Du eine solidere Trennung der Threads (UDP-Empfang / Forms-Anzeige) vornehmen,
    sonst bekommst Du sehr schnell (noch mehr) Probleme.

    Ich hatte dort (vor dem lesen dieses Beitrags) eine BlockingCollection vorgeschlagen.
    Die wäre hier verwendbar, in dem Du die dort eingehenden Daten in die Datenquelle (Entity Framework) überträgst.

    Mit dem vorliegenden Code-Schnipseln ist das aber nicht so leicht, es konkreter zu erläutern.

    Gruß Elmar

    Montag, 10. Januar 2011 09:18
    Beantworter
  • So, habe mich jetzt mal etwas informiert und bin in mich gegangen (damit meine ich die Fehlermeldung nochmal in RUHE gelesen): Das Problem war, dass ich den Inhalt einer Tabelle "udp_data" lesen wollte, die aber einen Fremdschlüssel zu "udp_connections" besitzt.

    Der Fehler war nach etwas googeln schnell behoben, ich musste bei der query nur folgendes anfügen:

     

    var query = from p in context_data.udp_data<strong>.Include("udp_connections") // <--- Das .Include("udp_connections") musste mit ran!</strong>
        where p.SessionID == selected_session
        select p;
    

     

     

    Also, falls jemand das gleiche Problem hat, dann hier ist (eine) Lösung!

    Mit dem DataSource/BindingSource habe ich noch nicht raus, wann ich genau was neu als datasource definieren muss, aber im Moment fahre ich ganz gut, indem ich immer ALLES neu mache ;)

     

    ---------------

     

    Und achja, das Problem mit der BindingSource und der fehlenden "InvokeRequired"-Abfrage habe ich ganz einfach gelöst: Ich Invoke einfach immer :) (ist das verkehrt oder schädlich?)

    Samstag, 8. Januar 2011 23:40

Alle Antworten

  • So, habe mich jetzt mal etwas informiert und bin in mich gegangen (damit meine ich die Fehlermeldung nochmal in RUHE gelesen): Das Problem war, dass ich den Inhalt einer Tabelle "udp_data" lesen wollte, die aber einen Fremdschlüssel zu "udp_connections" besitzt.

    Der Fehler war nach etwas googeln schnell behoben, ich musste bei der query nur folgendes anfügen:

     

    var query = from p in context_data.udp_data<strong>.Include("udp_connections") // <--- Das .Include("udp_connections") musste mit ran!</strong>
        where p.SessionID == selected_session
        select p;
    

     

     

    Also, falls jemand das gleiche Problem hat, dann hier ist (eine) Lösung!

    Mit dem DataSource/BindingSource habe ich noch nicht raus, wann ich genau was neu als datasource definieren muss, aber im Moment fahre ich ganz gut, indem ich immer ALLES neu mache ;)

     

    ---------------

     

    Und achja, das Problem mit der BindingSource und der fehlenden "InvokeRequired"-Abfrage habe ich ganz einfach gelöst: Ich Invoke einfach immer :) (ist das verkehrt oder schädlich?)

    Samstag, 8. Januar 2011 23:40
  • Hallo Nisse,

    zu den noch offenen Dingen:

    Eine automatische Aktualisierung funktioniert nur dann wenn die Datenquelle eine Änderungsbenachrichtigung unterstützt.

    Beim von Dir (vermutlich) verwendeten Entity Framework funktioniert das nur eingeschränkt, siehe
    Gewusst wie: Binden von Objekten an Windows Form-Steuerelemente (Entity Framework)
    und auch Binden von Objekten an Steuerelemente (Entity Framework)

    Da dort einige (bis viele) Einschränkungen bestehen, ist es i. a. sinnvoller direkt über eine BindingList(T)   zu gehen.

    Was das InvokeRequired angeht, dürfte das Problem mit Deinem anderen Problem in Verbindung stehen.

    Da solltest Du eine solidere Trennung der Threads (UDP-Empfang / Forms-Anzeige) vornehmen,
    sonst bekommst Du sehr schnell (noch mehr) Probleme.

    Ich hatte dort (vor dem lesen dieses Beitrags) eine BlockingCollection vorgeschlagen.
    Die wäre hier verwendbar, in dem Du die dort eingehenden Daten in die Datenquelle (Entity Framework) überträgst.

    Mit dem vorliegenden Code-Schnipseln ist das aber nicht so leicht, es konkreter zu erläutern.

    Gruß Elmar

    Montag, 10. Januar 2011 09:18
    Beantworter