2012-03-02 24 views
6

Mükemmel bir şekilde veritabanını oluşturabildiğim bir CompositeDataBoundControl oluşturdum. Şimdi aynı şeyi yapmak istiyorum ama bir nesne listesi değil, tek bir nesne için. Sebepler, meslektaşlarımın kendi uç kodlarında sadece <% # Eval ("X")%> kullanma becerisine sahip olmasını istemektir.asp.net Tek bir nesne için CompositeDataBoundControl

sorun CompositeDataBoundControl sadece bir veri kaynağı

CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding) 

tek bir nesne için aynı şeyi yapmak için bir yolu var mı gibi bir koleksiyon kabul ı geçersiz kılmak zorunda bir yöntem, sahip olmasıdır?

cevap

4

Sen

<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(); 
     } 
} 

Yani DataSource IEnumerable uygulamıyor bir nesneyi alır kullanımını göstermek için DataSource, tesisi

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; } 
     } 
    } 

düzenlemeyi geçersiz kılmak gerekir, ancak ağır basan SingleObjectView denetiminin DataSource özelliği, CreateChildControls'un çağrılmasını sağlar. Tek bir nesnenin bir örneğini izin FormView kullanmak

+0

Bu, TysHHTP'nin yapmaya çalıştığı şeydir. – AngeloBad

+0

@AngeloBad, yazdığım bu denetim şöyle kullanılır: ctrlSingleObjectView.DataSource = singleObject; ctrlSingleObjectView.DataBind(); OP'nin ihtiyacı olan şeyin tam olarak bu olduğuna inanıyorum. –

+0

Bu sorunun neden reddedildiğini bilmek isterim .. –

2

Denetim listesi oluşturmak, tek bir nesne eklemek ve sonra yöntemi çağırmaktan ne haber?

+1

Bunu da düşündük, ancak iyi bir çözümden ziyade bir çözüm/hack olarak daha fazla hissediyor. – Tys

+1

Bir yöntem bir IEnumerable'ı parametre olarak kabul ederse, yalnızca 1 öğeden oluşan bir IEnumerable iletmek bir saldırı değildir. Ne demek istediğimi biliyor musun? – AngeloBad

+2

AngeloBad ile aynı fikirdeyim. –

0

şablon edilecek:

protected void fvProduct_Init(object sender, EventArgs e) 
    { 
     // Load product template 
     fvProduct.ItemTemplate = LoadTemplate("Templates/ProductTemplate.ascx"); 

     // Bind product to data source 
     fvProduct.DataSource = new[] { Product }; 
     fvProduct.DataBind(); 
    } 

Sonra ProductTemplate.ascx içinde böyle şeyler yapabilirsiniz:

sizin senaryoda
<h1><%# Eval("ProductName") %></h1> 
<p><%# Eval("Description") %></p> 
<h4><%# Eval("Price", "{0:C}")%></h4> 

sen öyleydin sözü özel bir kontrol kullanarak ancak fikir temelde yukarıdaki cevaplarla aynıdır. Sadece bir öğe ile numaralandırılabilir bir numara oluşturmak ve bağlamak. Bir FormView kullanmanın nedeni, bir kerede yalnızca bir öğeyi yalnızca görüntülemek üzere tasarlandığından kaynaklanmaktadır.

İlgili konular