Binden von benutzerdefinierten Objekten (ListT) mit Unterlisten an ein Raster durch Drehen der Unterliste

8

Ich möchte eine Liste der CourseDetails List<CourseDetails> an ein / . Jeder CourseDetail hat eine Eigenschaft StudentList vom Typ List<Student> . Die Schülerliste sollte geschwenkt werden, damit das Ergebnis so aussieht:

Meine Frage

Wie kann ich jeden Schüler in der StudentList drehen, so dass ich eine List<CourseDetails> auf die gleiche .

%Vor%

Ich habe mindestens drei Probleme, die ich nicht lösen kann:

  1. wie man die StudentList innerhalb einer Instanz von courseDetails
  2. dreht
  3. wie man zwei courseDetail-Objekte (cd1, cd2) / oder n (n & lt; 13000) miteinander verbindet, dass für jeden Studenten eine eigene Spalte erstellt wird
  4. Wie kann ein Objekt wie courseDetails an das xtragrid gebunden werden.

Demo Linqpad auf Gist

Ein demo linqpad-Programm finden Sie auf gist .

KursDetails

Die folgende Klasse repräsentiert einen Kurs in einer Schule.

%Vor%

Liste von List<CourseDetails>

Jedes Objekt in List<CourseDetails> enthält eine Liste von Schülern. Manchmal gibt es nur ein paar Studenten (2 bis 5) in einer StudentList und manchmal hat jede StudentList 15 bis 40 Studenten. Die Schüler zwischen CourseDetails können sich überlappen, aber sie können auch disjunkt sein (nicht überschneidend / nicht überlappend).

Der erste var cd1 = new CourseDetails() enthält 3 Schüler in List<Student>

%Vor%

Der zweite var cd2 = new CourseDetails() enthält 2 Schüler in List<Student>

%Vor%

Um es einfach zu machen, verwenden Sie eine Tuple<string, string,....> , aber für das Gitter hätte ich gerne jede Spalte den Datentyp der zugrunde liegenden Eigenschaft (int, string, date, ...). Die erste Zeile, die mit Id, Course, Teacher, Amy, ... beginnt, wäre die Kopfzeile des Rasters.

    
surfmuggle 16.05.2013, 23:55
quelle

2 Antworten

3

OK, ich weiß nicht, ob das funktioniert, aber wir machen etwas Ähnliches, wenn wir ein Raster an eine Liste von Objekten binden, und dann, abhängig davon, welchen Monat der Benutzer wählt, fügen wir die Tage im Monat als Spalten hinzu Laufzeit - und füllen Sie entsprechend anderen Daten in der Anwendung. Meiner Meinung nach, wenn Sie die Daten nicht bearbeiten müssen, können Sie dies leicht erreichen, indem Sie eine Ansicht in Ihrer Datenbank erstellen und dann die Ansichtsdaten einfach als DataTable zurückgeben und direkt an sie binden . Weg, viel einfacher. Leider mussten wir die Daten bearbeiten, und das war nicht eine einfache Aufgabe!

Wie auch immer, hoffentlich können Sie sich durcharbeiten.

  1. Sie haben eine Liste von CourseDetails, und jede von diesen hat eine Liste von Studenten.
  2. Erstellen Sie Ihr Gitter im Designer und erstellen Sie Ihre statischen Spalten, die Sie an die CourseDetails-Eigenschaften (ID, Course, Teacher, Room) binden werden
  3. Legen Sie zur Laufzeit die Datenquelle des Rasters auf die Liste der Kursdetails fest. Wenn Sie dies tun, müssen Sie die verschiedenen Student-Namen aus der Liste der CourseDetails extrahieren, Sie könnten dazu LINQ verwenden (etwas wie [ungetestet]) -

var names = CourseDetails.SelectMany(c => c.StudentList).Select(s => s.Name).Distinct();

Fügen Sie diese Spalten als ungebundene Spalten zu Ihrem Raster hinzu, z. B .:

%Vor%

Behandeln Sie jetzt das CustomUnboundColumnData -Ereignis in der Gridview. Sie müssen etwas Ähnliches tun (nicht sicher, wie Sie übereinstimmen möchten - entweder ID / Name):

%Vor%

Wenn Sie nach ID suchen müssen (setzen Sie die ID in die Column.Tag-Eigenschaft):

%Vor%

oder was immer Sie anzeigen möchten. Offensichtlich müssen Null-Checks usw. durchgeführt werden.

Hoffe das hilft ein bisschen. Denk doch immer noch an den falschen Baum, aber trotzdem ...

    
Simon 14.08.2013, 01:22
quelle
1

Tatsächlich müssen Sie in C # trotzdem pivotieren, denn wenn Sie Daten an Ihre UI binden (oder sie trotzdem einspeisen) wollen - und Ihr View-Objekt ist Course (was ich nicht weiß, ist auch Ihr Domain-Objekt) ; oder verwenden Sie ORM oder nicht) - die extrahierten Pivot-Daten aus der Datenbank helfen nicht (direkt) (orchestrieren Ihre UI) und Sie sollten einige LINQ-Gruppen durch Operationen ausführen, um eine Liste von Course zu extrahieren.

    
Kaveh Shahbazian 27.05.2013 19:33
quelle

Tags und Links