【发布时间】:2009-04-08 22:18:02
【问题描述】:
什么是实现DataBind()方法的正确方法来控制内部有一个中继器?
这些是此控件的要求(但如果您认为这些缺少某些内容或者是开销,您可以提供您的要求)
- 控件应接受集合或可枚举(对象列表、匿名对象、字典或数据表)
- DataSource 应该完全应该与控件完全解耦(使用 Data*Field 属性来指定映射的属性或键;如 DropDownList 中的 DataValueField 和 DataTextField)
- 控件在 ViewState 上应该很容易。如果可能的话,根本不应该使用 ViewState,或者它的使用率应该尽可能低(存储一些 ID 或类似的东西)
- 该控件应处理任何类型(使用 ToString() 进行转换)
- ItemDataBound 内部可以使用 e.DataItem 应该可以访问
我希望我的控件像这样初始化:
var control = new Control();
control.DataDateField = "Date";
control.DataNameField = "FullName";
control.DataTextField = "Comment";
control.DataSource = data;
control.DataBind();
并且数据项可以是以下之一
字典列表(或表格行)
var data = new List<Dictionary<string, string>>
{
new Dictionary<string, string>
{{"Date", "2009-03-15"}, {"FullName", "John Walker"}, {"Comment", "comment1"}},
new Dictionary<string, string>
{{"Date", "2009-03-12"}, {"FullName", "Chuck Norris"}, {"Comment", "comment2"}},
new Dictionary<string, string>
{{"Date", "2009-03-13"}, {"FullName", "Sergej Andrejev"}, {"Comment", "comment3"}}
};
匿名对象列表
var data = new List<object>
{
new {Date = "2009-03-15", FullName = "John Walker", Comment = "comment1"},
new {Date = "2009-03-12", FullName = "Chuck Norris", Comment = "comment2"},
new {Date = "2009-03-13", FullName = "Sergej Andrejev", Comment = "comment3"},
};
项目列表
public class SampleClass
{
public object Date { get; set; }
public object FullName { get; set; }
public object Comment { get; set; }
public SampleClass(string date, string fullName, string comment)
{
Date = date;
FullName = fullName;
Comment = comment;
}
};
var data = new List<SampleClass>
{
new SampleClass("2009-03-15", "John Walker", "comment1"),
new SampleClass("2009-03-12", "Chuck Norris", "comment2"),
new SampleClass("2009-03-13", "Sergej Andrejev", "comment3"),
};
数据表
var data = new DataTable();
data.Columns.Add(new DataColumn { DataType = typeof(DateTime), ColumnName = "Date" });
data.Columns.Add(new DataColumn { DataType = typeof(string), ColumnName = "FullName" });
data.Columns.Add(new DataColumn { DataType = typeof(string), ColumnName = "Comment" });
data.Rows.Add(new object[] { DateTime.Parse("2009-03-15"), "John Walker", "comment1" });
data.Rows.Add(new object[] { DateTime.Parse("2009-03-12"), "Chuck Norris", "comment2" });
data.Rows.Add(new object[] { DateTime.Parse("2009-03-13"), "Sergej Andrejev", "comment3" });
基本上我想要的是用于数据绑定的通用代码,这样我就不会在每次创建新控件时都浪费时间从头开始创建它。如果您能提供任何关于良好做法、官方指南以及您的个人经验的参考资料,我将不胜感激。
【问题讨论】: