我创建了一个CompositeDataBoundControl,我可以很好地数据绑定.现在我想做同样的事情,但不是针对对象列表,而是针对单个对象.原因是我希望我的同事能够在他们的前端代码中简单地使用<%#Eval("X")%>.
问题是CompositeDataBoundControl有一个我必须覆盖的方法,它只接受一个集合作为数据源
CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
Run Code Online (Sandbox Code Playgroud)
有没有办法为单个对象做同样的事情?
您需要覆盖DataSource属性
public class SingleObjectView : CompositeDataBoundControl
{
private object dataSource;
public override object DataSource
{
get { return new List<object> { dataSource }; }
set { dataSource = value; }
}
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
{
SingleItem singleItem = null;
if (dataBinding)
{
var it = dataSource.GetEnumerator();
it.MoveNext();
singleItem = new SingleItem(it.Current);
}
else
{
singleItem = new SingleItem(null);
}
ItemTemplate.InstantiateIn(singleItem);
Controls.Add(singleItem);
if (dataBinding)
singleItem.DataBind();
return 1;
}
[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(SingleItem))]
public ITemplate ItemTemplate { get; set; }
}
public class SingleItem : Control, IDataItemContainer
{
public SingleItem(object dataItem)
{
DataItem = dataItem;
}
public object DataItem { get; set; }
public int DataItemIndex
{
get { return 0; }
}
public int DisplayIndex
{
get { return 0; }
}
}
Run Code Online (Sandbox Code Playgroud)
编辑以显示用法
<ctrl:SingleObjectView ID="productView" runat="server">
<ItemTemplate>
<%# Eval("ProductName") %>
<br />
<%# Eval("Price","{0:c}") %>
</ItemTemplate>
</ctrl:SingleObjectView>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
productView.DataSource = new { ProductName="My Product", Price="10"};
productView.DataBind();
}
}
Run Code Online (Sandbox Code Playgroud)
因此 DataSource 接收一个未实现 的对象IEnumerable,但重写控件的 DataSource 属性SingleObjectView,确保CreateChildControls调用该对象。
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |