asp.net CompositeDataBoundControl用于单个对象

Tys*_*Tys 6 c# asp.net

我创建了一个CompositeDataBoundControl,我可以很好地数据绑定.现在我想做同样的事情,但不是针对对象列表,而是针对单个对象.原因是我希望我的同事能够在他们的前端代码中简单地使用<%#Eval("X")%>.

问题是CompositeDataBoundControl有一个我必须覆盖的方法,它只接受一个集合作为数据源

CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
Run Code Online (Sandbox Code Playgroud)

有没有办法为单个对象做同样的事情?

Adr*_*ode 4

您需要覆盖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调用该对象。