2012-04-10 9 views
0

Ich habe eine Klasse namens StudentenWie binden Liste innerhalb einer Liste zu einem Gridview in ASP.NET

public class Student 
{ 
    public string Name { get; set; } 
    public List<int> Marks { get; set; } 
    public Student() 
    { 
    } 
} 

und ich brauche

 List<Student> StudentList = new List<Student>(); 

     Student stud = new Student(); 
     stud.Name = "Scott"; 
     List<int> marks = new List<int>(); 
     marks.Add(10); 
     marks.Add(20); 
     marks.Add(30); 
     stud.Marks = marks; 

     StudentList.Add(stud); 

     Student stud1 = new Student(); 
     stud1.Name = "Jon"; 
     List<int> marks1 = new List<int>(); 
     marks1.Add(10); 
     marks1.Add(20); 
     marks1.Add(30); 
     stud1.Marks = marks1; 

     StudentList.Add(stud1); 

     GridView1.DataSource = StudentList; 
     GridView1.DataBind(); 

Die Gridview eine Liste des Studenten Gridview zu binden Zeigt nur das Namensfeld an. wie ich die Liste der Marken auch mit dem Namensfeld anzeigen kann. (In dieser alle Schüler haben die gleiche Anzahl von Markierungen, bedeutet manchmal 3 oder manchmal 5. etc.)

zeige ich brauche gridview wie diese

Name Mark1 Mark2 Mark3 
Scott 10  20 30 
Jon  10  20 30 
+0

Bitte senden asp.net Code – msigman

+0

asp-Upload-Code –

+0

In asp.net ich ein Gridview haben nur. im Code dahinter binde ich gerade eine Liste von Schülern an Gridview. – niknowj

Antwort

1

Beispiel:

<asp:GridView ID="grid1" runat="server" AutoGenerateColumns="false" Width="100%"> 
    <Columns> 
     <asp:BoundField DataField="Name" HeaderText="Name" /> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:GridView ID="grid2" runat="server" AutoGenerateColumns="False" Width="100%"> 
       <Columns> 
        <asp:BoundField DataField="Mark" HeaderText="Mark" /> 
       </Columns> 
      </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Code:

protected override void OnInit(EventArgs e) 
{ 
    grid1.RowDataBound += grid1_RowDataBound; 
} 

void grid1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    var grid2 = (GridView)e.Item.FindControl("grid2"); 
    grid2.DataSource = StudentList.Where(w => w.Name = (e.Item.DataItem as Student).Name); 
    grid2.Bind(); 
} 

Ich teste es nicht

1

einen benutzerdefinierten Container als TemplateField Feld hinzufügen (falls Nummer B. GridView, Repeater oder ListView) oder einige Label oder TextBox als Vorlagenfeld (wenn die Anzahl der Markierungen fest ist). Überschreiben Sie GridView1_RowDataBound und legen Sie Werte für den Container DataSource oder die Beschriftungen fest, um die Markierungen anzuzeigen.

in aspx: -

<asp:GridView ID="GridView1" runat="server" 
     onselectedindexchanged="GridView1_SelectedIndexChanged" 
     onrowdatabound="GridView1_RowDataBound"> 
     <Columns> 
     <asp:BoundField DataField="Name" HeaderText="Name" /> 
      <asp:TemplateField HeaderText="Marks"> 
        <ItemTemplate> 
         <asp:DataList runat="server" ID="DataList1" RepeatDirection="Horizontal" > 
         <ItemTemplate> 
         <%# Container.DataItem.ToString() %> 

         </ItemTemplate> 
         </asp:DataList> 
        </ItemTemplate> 
       </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

in cs: -

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowIndex != -1) 
     { 
      var student = e.Row.DataItem as Student; 
      var dataList = e.Row.FindControl("DataList1") as DataList; 
      dataList.DataSource = student.Marks; 

      dataList.DataBind(); 
     } 
    } 
0

den folgenden Code Versuchen:

protected void gridStudentDetails_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
Student studentObj = (Student)StudentList[e.Row.RowIndex]; 
if (studentObj != null) 
    { 
    DropDownList ddlMarks = (DropDownList)e.Row.FindControl("ddlMarks"); 
    if(ddlMarks != null) 
    { 
    ddlMarks.DataSource = studentObj.Marks; 
    ddlMarks.DataBind(); 
    } 
    } 
} 
Verwandte Themen