당신은
<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();
}
}
그래서 데이터 소스는 IEnumerable
를 구현하지 않는 개체를 수신 사용을 보여주기 위해 데이터 소스 특성을
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; }
}
}
편집을 재정의해야하지만, 오버라이드 (override) SingleObjectView
컨트롤의 DataSource 속성은 CreateChildControls
이 호출되도록합니다. 내가 단일 개체의 인스턴스를 허용하는 FormView를 사용
이것은 정확히 TysHHTP가 시도하는 것입니다. – AngeloBad
@AngeloBad, 내가 작성한이 컨트롤은 다음과 같이 사용됩니다. ctrlSingleObjectView.DataSource = singleObject; ctrlSingleObjectView.DataBind(); 나는 OP가 필요로하는 것이 정확히 그것이라고 믿습니다. –
나는 왜이 대답이 downvoted인지 알고 싶습니다. –