2012-03-02 6 views
6

मैंने एक कंपोजिटडेटाबाउंड कंट्रोल बनाया है जिसे मैं पूरी तरह से डाटाबेस कर सकता हूं। अब मैं वही काम करना चाहता हूं, लेकिन वस्तुओं की सूची के लिए नहीं, बल्कि एक वस्तु के लिए। कारण यह है कि मैं चाहता हूं कि मेरे सहयोगियों को अपने फ्रंट एंड कोड में <% # Eval ("X")%> का उपयोग करने की क्षमता हो।एएसपीनेट कंपोजिटडाटाबाउंड कंट्रोल एक ऑब्जेक्ट के लिए

समस्या CompositeDataBoundControl एक विधि को ओवरराइड करने के लिए है कि मैं है, जो केवल एक डेटा स्रोत

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

वहाँ एक वस्तु के लिए एक ही बात करने के लिए एक रास्ता है के रूप में एक संग्रह को स्वीकार करता है कि है?

उत्तर

4

आप उपयोग दिखाने के लिए

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

संपादित की जरूरत है, लेकिन अधिभावी SingleObjectView नियंत्रण की डेटासोर्स संपत्ति, सुनिश्चित करता है कि CreateChildControls कहा जाता है।

+0

यह वही है जो TysHHTP करने का प्रयास कर रहा है। – AngeloBad

+0

@AngeloBad, इस नियंत्रण को मैंने लिखा है इस तरह प्रयोग किया जाता है: ctrlSingleObjectView.DataSource = एकल ऑब्जेक्ट; ctrlSingleObjectView.DataBind(); मेरा मानना ​​है कि यह वही है जो ओपी की जरूरत है। –

+0

मैं जानना चाहता हूं कि यह जवाब क्यों कम किया गया था .. –

2

नियंत्रण की एक सूची बनाने के बारे में क्या, एक एकल वस्तु जोड़ें और फिर विधि को कॉल करें?

+1

हमने यह भी पता लगाया है, लेकिन यह एक सभ्य समाधान के रूप में एक कामकाज/हैक के रूप में अधिक महसूस करता है। – Tys

+1

यदि कोई विधि पैरामीटर के रूप में एक आईनेमरेबल को स्वीकार करती है, तो केवल 1 तत्व द्वारा रचित एक आईनेमेरेबल को पास करना एक हैक नहीं है। क्या आपको पता है कि मेरा क्या मतलब है? – AngeloBad

+2

मैं एंजेलोबैड से सहमत हूं। –

0

मैं FormView का उपयोग एक वस्तु का एक उदाहरण अनुमति देने के लिए टेम्प्लेट की जा करने के लिए:

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

फिर ProductTemplate.ascx में आप इस तरह सामान कर सकते हैं:

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

अपने परिदृश्य में आप का उल्लेख तुम थे कस्टम नियंत्रण का उपयोग करना, लेकिन विचार मूल रूप से ऊपर दिए गए उत्तरों के समान ही है। आप बस एक आइटम के साथ एक संख्यात्मक बनाते हैं और इसे बांधते हैं। FormView का उपयोग करने का कारण यह है क्योंकि यह एक समय में केवल एक ही आइटम को प्रदर्शित करने के लिए डिज़ाइन किया गया है।

संबंधित मुद्दे