对我来说,您描述数据的方式并不适合DataGrid。此控件最适合您计划以标准表格样式显示的数据,其中列名跨越顶部,然后在下方显示值的行。我也有点不清楚您是否打算将一个或多个 Object 实例(我现在将其称为 Person)绑定到 UI。
让我们继续定义那个对象:
public class Person {
public String Name { get; set; }
public String LastName { get; set; }
public int Age { get; set; }
public DateTime BirthDate { get; set; }
}
要将Person 的单个实例绑定到您的 UI,一个简单的 HTML 表格应该可以正常工作。我使用TextBoxes 在此处显示值,但如果您不需要编辑它们,则只需使用Labels。
<table>
<tr><td>Name:</td><td><asp:TextBox ID="txtName" runat="server" /></td></tr>
<tr><td>Last Name:</td><td><asp:TextBox ID="txtLastName" runat="server" /></td></tr>
<tr><td>Age:</td><td><asp:TextBox ID="txtAge" runat="server" /></td></tr>
<tr><td>Birthdate:</td><td><asp:TextBox ID="txtBirthDate" runat="server" /></td></tr>
</table>
此时使用代码隐藏将Person 中的属性绑定到页面上的相应控件非常简单。
如果您想使用相同的布局在一个页面上显示多个Person 实例,请使用ASP.net Repeater。这个标记看起来更像:
<asp:Repeater ID="repPeople" runat="server">
<ItemTemplate>
<table>
<tr><td>Name:</td><td><asp:TextBox ID="txtName" runat="server" Text='<%# Eval("Name") %>' /></td></tr>
<tr><td>Last Name:</td><td><asp:TextBox ID="txtLastName" runat="server" Text='<%# Eval("LastName") %>' /></td></tr>
<tr><td>Age:</td><td><asp:TextBox ID="txtAge" runat="server" Text='<%# Eval("Age") %>' /></td></tr>
<tr><td>Birthdate:</td><td><asp:TextBox ID="txtBirthDate" runat="server" Text='<%# String.Format("{0:d}", Eval("BirthDate")) %>' /></td></tr>
</table>
</ItemTemplate>
</asp:Repeater>
在代码隐藏中,您只需将Person 的集合绑定到Repeater 上的DataSource 属性:
protected void Page_Load(object sender, EventArgs e) {
// A simple example using Page_Load
List<Person> people = new List<Person>();
for (int i = 0; i < 10; i++) {
people.Add(new Person() {Name = "Test", Age = 10, BirthDate=DateTime.Now, LastName = "Test"});
}
if (!IsPostBack) {
repPeople.DataSource = people;
repPeople.DataBind();
}
}
注意:您可以使用 CSS 而不是表格来完成类似的布局,但是相同的原则适用于绑定单个对象和多个对象。只需将本示例中的表格布局替换为您最终定义的任何标记即可。