2012-02-14 10 views
6

पर कस्टम बिजनेस ऑब्जेक्ट के लिए गतिशील बाध्यकारी मैं Web Forms प्रोजेक्ट पर काम कर रहा हूं जो एसक्यूएल प्रश्नों के परिणाम DataTable एस में लोड करता है।रनटाइम

ये DataTable एस सामने वाले अंत तक पारित किए जाते हैं जहां हम उन्हें Repeater वेब नियंत्रण से बांधते हैं।

यह बहुत अच्छा काम करता है। हालांकि, अब हम DataTable की बजाय अपने स्वयं के कस्टम वर्गों से जुड़ना चाहते हैं। दुर्भाग्यवश, मैंने जो सोचा था वह स्पष्ट उत्तर नहीं था (हमारी कक्षा में IDictionary<string, object> लागू करना)।

हमें बाध्यकारी के लिए ठोस संपत्ति बनाने के बिना अतल को डेटम से बांधने की क्या ज़रूरत है? स्पष्ट रूप से DataRow को हमारे द्वारा बाध्य की जाने वाली प्रत्येक संपत्ति को ठोस रूप से लागू करने की आवश्यकता नहीं है। तो, किसी भी तरह ऐसा लगता है कि Eval डेटारो पर नाम से संपत्ति मूल्यों को देखने में सक्षम है।

यहाँ जहां डेटा स्रोत फ़ाइल

rptTags.DataSource = new[] { new Datum { {"Count", 1} }, new Datum { {"Count", 2 } }; 

aspx.cs में सेट है कस्टम वर्ग

public class Datum: IDictionary<string, object> 
{ 
    private Dictionary<string, object> _entries; 

    public Datum() 
    { 
     _entries = new Dictionary<string, object>(); 
    } 

    public object this[string s] 
    { 
     get 
     { 
      return this._entries[s]; 
     } 
    } 

    ... 
} 

यहाँ है यहाँ है और aspx फ़ाइल में बाध्यकारी है

<asp:Repeater ID="rptTags" runat="server"> 
    <ItemTemplate> 
     <%# (int)Eval("Count") > 
    </ItemTemplate> 
</asp:Repeater> 

उपर्युक्त उदाहरण का उपयोग करके हमें यह कहते हुए एक त्रुटि मिलती है कि प्रश्न में संपत्ति मौजूद नहीं है, जो सच है, लेकिन यह डी डेटारो पर मौजूद नहीं है। मैं इसे System.Data.DataRow की तरह कैसे बांध सकता हूं?

+0

क्या आप डेटा मॉडल वर्ग और eval अभिव्यक्ति साझा कर सकते हैं, कि होगा मदद करने में आसान बनाओ। –

+0

"यह किसी भी कोशिश करने और परीक्षण करने के लिए एक दुःस्वप्न बनाता है।" उदाहरण के लिए? –

+0

@mark ठीक है मुझे लगता है कि मुझे यह मिल गया है ... – Aristos

उत्तर

1

मैं आज सुबह ताजा आंखों के साथ आया और आईएलएसपी के साथ नेट फ्रेमवर्क के माध्यम से कई घंटे बिताए। मैं अंततः इस पहेली को समझने और एक समाधान समाधान को लागू करने में सक्षम था। मैं उन चीजों को सूचीबद्ध करूंगा जो मैंने सीखा है जो समाधान के लिए प्रासंगिक हैं और फिर मेरे कार्यान्वयन की जानकारी देते हैं।

  • जब आप एक पुनरावर्तक को डेटाटेबल को बाध्य करते हैं तो प्रत्येक रिपेटर इटैम डेटारो से बंधे नहीं है, जैसा कि मैंने उम्मीद की थी, लेकिन DataRowView पर। यह वास्तव में महत्वपूर्ण नहीं है कि DataRowView ICustomTypeDescriptor इंटरफ़ेस लागू करता है जो हमें अपनी कक्षा में लागू करने की आवश्यकता है।
  • भले ही MSDN documentation कहता है कि इवल विधि देर से बाध्यकारी करने के लिए प्रतिबिंब का उपयोग करती है और आपकी अभिव्यक्ति को सार्वजनिक संपत्ति का मूल्यांकन करना चाहिए, यह वास्तव में सत्य नहीं है। Eval स्टेटमेंट आपकी अभिव्यक्ति का मूल्यांकन करने के लिए ICustomTypeDescriptor पर GetProperties() विधि का उपयोग करता है।

इस बात को ध्यान में रखते हुए मुझे अपने स्वयं के कस्टम प्रकार बनाने के लिए क्या कदम उठाने पड़ते हैं जिन्हें मैं डेटाटेबल की तरह गतिशील रूप से बांध सकता हूं।

  1. अपनी खुद की कस्टम क्लास बनाएं जो PropertyDescriptor से प्राप्त होती है।
  2. सभी संपत्ति डिस्क्रिप्टर के सार सदस्यों को कार्यान्वित करें। गतिशील बाध्यकारी के लिए सबसे महत्वपूर्ण एक GetValue() है। यह वह जगह है जहां आप परिभाषित करते हैं कि उस वर्ग से मूल्य कैसे प्राप्त करें जिससे आप बाध्यकारी हैं।
  3. कक्षा में आप कस्टमटाइपडिस्क्रिप्टर के उत्तराधिकारी के लिए बाध्यकारी होंगे। यह एक सामान्य वर्ग है जो ICustomTypeDescriptor लागू करता है।
  4. कस्टम टाइप टाइपस्क्रिप्टर की GetProperties() विधि को ओवरराइड करें और प्रत्येक वैल्यू के लिए अपने प्रॉपर्टी डिस्क्रिप्टर (चरण 1-2 में बनाए गए) की एक सूची वापस करें, जिसे आप बाध्य करने में सक्षम होना चाहते हैं।
  5. सुनिश्चित करें कि आपके प्रॉपर्टी डिस्क्रिप्शन का नाम संपत्ति सेट है। यह संपत्ति है। नेट यह निर्धारित करने के लिए कि आपकी संपत्ति डिस्क्रिप्शन बाध्यकारी होने पर उपयोग करने के लिए आपकी Eval अभिव्यक्ति की तुलना करता है।
  6. एक Webcontrol के डेटा स्रोत के रूप में अपने CustomTypeDescriptor वस्तु (चरण 3-5 में बनाया गया) निर्धारित करें और इसे करने के लिए बाध्य करने के लिए eval() का उपयोग गतिशील
0

एक बाध्यकारी डेटासोर्स को IEnumerable या IListSource लागू करना चाहिए।

गतिशील पहलू के बारे में: ध्यान रखें कि डाटाबेसिंग के जादू का हिस्सा प्रतिबिंब का उपयोग करके होता है।

+0

उत्तर के लिए धन्यवाद। हां, मैंने एमएसडीएन दस्तावेज में पढ़ा है कि यह देर से बाध्यकारी करने के लिए प्रतिबिंब का उपयोग करता है। हालांकि, डेटारो अभी भी गतिशील डाटाबेसिंग से दूर हो सकता है, इसलिए मुझे लगता है कि मुझे भी सक्षम होना चाहिए। –