Laden...

Nhibernate: Liste von Objekten in DataGridView sortieren

Erstellt von Sclot vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.058 Views
S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren
Nhibernate: Liste von Objekten in DataGridView sortieren

Guten Morgen,
Ich bin immer noch dabei mit NHibernate rum zu spielen.
Jetzt ist mir folgendes aufgefallen:

Wenn ich eine Liste von Objekten aus der DB hole...


System.Collections.IList bsp = _Session.CreateCriteria(typeof(tA.DBModels.SYSTEM_PLUS)).List();

Dann liegen sie in einer ArrayList vor.
Diese kann ich als DataSource an ein DataGridView zuweisen.
Leider kann ich die Spalten in dem DGV nicht sortieren (Über klick im Header).

Bei Google findet man einige Menschen die auch solch ein Probleme haben, aber nie wirklich eine Lösung dafür.
Letzendlich scheint so ein GDV echt nur Sinnvoll mit DataTables umgehen zu können.

Ich brauche eine Visuelle Darstellung meiner Objekte in einer Liste mit Sortierungs-Möglichkeit.

Irgendjemand eine Idee wie man das anstellen könnte?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sclot,

Dann liegen sie in einer ArrayList vor.

ist das durch Nhibernate erzwungen? Denn ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Stattdessen sollte List<T> und die anderen typisierten Collections aus System.Collections.Generic verwendet werden.

Letzendlich scheint so ein GDV echt nur Sinnvoll mit DataTables umgehen zu können.

Es hindert dich ja keiner daran, die Daten aus der Liste in einer DateTable zu packen.

herbivore

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

Naja.. Wenn ICH das mache, dann wird das nicht grad das Performance-Technische Wunderwerk werden 😉

Und ja, nach meinem Minimalen Wissensstand gibt NHibernate das mit der .List() Methode so vor.

C
252 Beiträge seit 2007
vor 13 Jahren

Nein du erhälst schon eine typisierte Liste zurück mittels .List<T>().
Mach mal folgendes:


System.Collections.IList<tA.DBModels.SYSTEM_PLUS> bsp = _Session.CreateCriteria(typeof(tA.DBModels.SYSTEM_PLUS)).List<tA.DBModels.SYSTEM_PLUS>();

Weiters würde ich mir eine generische Methode schreiben. somit hast du nur eine Methode um alle Objekte zu laden und nicht 1 Methode pro Typ. Da erspart ne Mege.


    public IList<T> RetrieveAll<T>(SessionAction sessionAction)
    {
      /* Note that NHibernate guarantees that two object references will point to the
       * same object only if the references are set in the same session. For example,
       * Order #123 under the Customer object Able Inc and Order #123 in the Orders
       * list will point to the same object only if we load Customers and Orders in 
       * the same session. If we load them in different sessions, then changes that
       * we make to Able Inc's Order #123 will not be reflected in Order #123 in the
       * Orders list, since the references point to different objects. That's why we
       * maintain a session as a member variable, instead of as a local variable. */

      // Open a new session if specified
      if ((sessionAction == SessionAction.Begin) || (sessionAction == SessionAction.BeginAndEnd))
      {
        m_Session = m_SessionFactory.OpenSession();
      }

      // Retrieve all objects of the type passed in
      ICriteria targetObjects = m_Session.CreateCriteria(typeof(T));
      IList<T> itemList = targetObjects.List<T>();

      // Close the session if specified
      if ((sessionAction == SessionAction.End) || (sessionAction == SessionAction.BeginAndEnd))
      {
        m_Session.Close();
        m_Session.Dispose();
      }

      // Set return value
      return itemList;
    }


M
51 Beiträge seit 2010
vor 13 Jahren

Hallo Sclot ,

NHibernate kann auch typisierte Listen!

Beispiel:

public IList<T> GetSomething(...){
    ICriteria criteria = session.CreateCriteria<T>();
    ...
    ...
    return criteria.List<T>();
}

Gruß

Martin

R
103 Beiträge seit 2009
vor 13 Jahren

Wegen dem SortierProblem kannst du mal nach der SortableBindingList<T>
googeln.

Damit kann das DGV auch sortieren. Ich hole mir für meine DGVs immer eine

IList<T> aus nhibernate und übergebe diese an eine SortableBindingList<T>, die dann an die DGV datasource gebunden wird.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Um solche Listen einfach zu sortieren muss du an das DGV einen View binden, der das übernimmt.

Bei einer DataTable gibt es ja den DataView, der das da übernimmt.

Für objektlisten gibt es auch wenige.

Such mal hier nach IBindingListView

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sclot,

Naja.. Wenn ICH das mache, dann wird das nicht grad das Performance-Technische Wunderwerk werden 😉

solange es lesbarer Code ist, reicht es doch, wenn es schnell genug ist (und das wird es sicher sein). Ob der Code Performence-Rekorde bricht, ist völlig belanglos, solange es schnell genug ist. Oder andersherum gesagt: premature optimization is the root of all evil.

herbivore

H
208 Beiträge seit 2008
vor 13 Jahren

Genau. Denn egal wie suboptimal er die Konvertierung macht, sie wird auf keinen Fall so lange dauern wie der eigentliche DB-Zugriff 😁

S
Sclot Themenstarter:in
324 Beiträge seit 2007
vor 13 Jahren

Ui...
Da geht man seinen Azubi mal was erklären und dann so viele Antworten 😃

Gut, Dann arbeite ich mich da mal durch und Berichte...

Danke!

Edit:

Ich hab dort http://code.google.com/p/modelshredder/ auch ein lustiges Projekt gefunden, welches eine ExtensionMethod zur verfügung stellt um aus einer List<> eine DataTable zu machen, welche man dann im DGV auch sortieren kann 😃