Frage

Ich schätze, dass dies eine ziemlich einfache Frage sein kann - aber ich habe ziemlich viel Mühe (als fledgeling ASP.NET-Entwickler). Ich habe eine Reihe von Ideen aus SO und Google ohne Glück gewonnen und ich glaube, ich fange an, das über-denken, es scheint so ein Standard-Szenario, das ich glaube, ich bin etwas fehlt offensichtlich.

ich zum Beispiel, drei Standard-Beispieltabellen -. Beachten Sie die Many-to-Many Beziehung

Students
- student_id
- forename
- surname

Courses
- course_id
- course_name

StudentCourses
- studentcourse_id
- course_id
- student_id

würde Ich mag diese in einer Art und Weise auf meine ASP.NET 3.5 Web Application angezeigt werden, die ähnlich ist (wobei eine Schaltfläche, um sie zu bearbeiten, um die Informationen für Studenten zu ermöglichen, die letzte Spalte) aussieht:

Students:
#  Name          Courses                 Actions
1  Joe Bloggs    Maths, English          [Manage]
2  Arthur Sleep  English                 [Manage]
3  Andy Mann     Maths, German, French   [Manage]

Die „Kurse“ Spalte ist eine Liste der Kurse, die die Schüler zur Zeit bei eingeschrieben sind. Dieses leer sein könnte (noch nicht immatrikulierte) oder eine Liste enthalten (durch Komma getrennt oder eine Standard-ungeordneten HTML-Liste, ich bin nicht wertvoll) ihre derzeit eingeschrieben Kurse. Dies würde nicht eine massive Liste sein als Student nur auf einer Handvoll von Kursen zu jeder Zeit einschreiben kann.

Ich habe eine Reihe von Lösungen ausprobiert, von asp: Repeater zu meinen aktuellen Lieblingen, Listview, die mit 3,5 kamen. Ich bin mit LINQ als meine Datenschicht SQL (falls es aufgrund LINQs komplizierte Unterstützung für Many-to-Many Beziehungen wichtig ist).

War es hilfreich?

Lösung

Ganz einfach, könnte man ein paar neuen Objekte zu Ihrer „Student“ Klasse hinzufügen wie folgt (in C #):

public IEnumerable<Course> Courses
{
    get { return CourseRepository.GetCoursesByStudentId(this.Student_Id); }
}

//Aggregate course names into a comma-separated list
public string CoursesDescription 
{
    get 
    {
        if (!Courses.Any())
            return "Not enrolled in any courses";

        return Courses.Aggregate(string.Empty, (currentOutput, c) =>
              (!String.IsNullOrEmpty(currentOutput)) ?
              string.Format("{0}, {1}", currentOutput, c.Course_Name) :  c.Course_Name );
    }  
}

Wenn Sie jetzt nur einen Repeater benötigen (gebunden an Ihre Student Sammlung), da die Notwendigkeit für den Unter Repeater durch die „CoursesDescription“ Eigenschaft auf der Student-Klasse entfernt wird.

Als beiseite, würde ich empfehlen die Tabellen in der Einzahl Namensgebung (das heißt Sie nennen sie nach dem, was 1 Zeile darstellt). Außerdem gibt es ein starkes Argument für die Identitätsspalt aus Ihrer StudentCourses Tabelle zu entfernen und es mit einem zusammengesetzten Schlüssel über STUDENT_ID und course_id zu ersetzen.

Hope, das hilft.

Andere Tipps

Sie können die verschachtelten Repeater einsetzen. Das folgende Beispiel ruft eine sekundäre Methode in der Code-behind-Datei, die eine Liste zurück. Sie können alle Kursinformationen von diesem zuzugreifen. Ich konnte es mit einem Verfahren aus einer Repository-Klasse erhalten arbeiten verwendet, um den Code, dies zu umgehen:

protected List<tblStudentCourses> GetStudentCoursesByStudentID(int id)
{
return studentRepository.GetStudentCoursesByStudentID(id).ToList();
}

Hier ist das vollständige Beispiel:

<asp:Repeater ID="parentRepeater" runat="server" DataSourceID="myDataSource">
<HeaderTemplate>          
 Header HTML         
</HeaderTemplate>

<ItemTemplate>

    <asp:Repeater ID="availabilityRepeater" runat="server" DataSource='<%#GetStudentCoursesByStudentID(Convert.ToInt32(Eval("studentCourseID"))) %>'>
        <ItemTemplate>
            <%# Eval("tblStudentCourses.courseName")  %><br />
        </ItemTemplate>
    </asp:Repeater>

    Student Name example: <%#Eval("studentName")%>

</ItemTemplate>
<FooterTemplate>
    Footer HTML 
</FooterTemplate>

                    

Dies ist möglicherweise nicht die beste Lösung sein, aber es ist eine Arbeitslösung, so dass ich hoffe, es hilft Ihnen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top