0

Studentという名前のクラスがあります

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

学生のリストをGridViewにバインドする必要があります

        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();

グリッドビューには、名前フィールドのみが表示されます。名前フィールドでもマークのリストを表示する方法。(これでは、すべての生徒が同じ数のマークを持っています。つまり、3つ、場合によっては5つなどです。)

このようなグリッドビューを表示する必要があります

Name    Mark1  Mark2 Mark3 
Scott   10     20    30
Jon     10     20    30
4

3 に答える 3

3

カスタム コンテナをTemplateFieldフィールドとして追加します (マークの数が異なる場合。例: 別のGridViewRepeaterまたはListView) または一部LabelまたはTextBoxテンプレート フィールドとして (マークの数が固定されている場合)。GridView1_RowDataBound をオーバーライドし、コンテナーまたはラベルの値を設定してDataSource、マークを表示します。

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>

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();
        }
    }
于 2012-04-10T04:48:39.827 に答える
1

例:

<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>

コード:

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();
}

私はそれをテストしません

于 2012-04-10T05:04:37.583 に答える
0

次のコードを試してください。

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();
   }
  }
 }
于 2012-04-10T05:19:30.033 に答える