10

विरासत में है II एक ग्रिड व्यू में आईआईएलआई को बाध्य कर रहा हूं। IMyInterface लग रहा हैबाध्यकारी IList <IMyInterfaceType> इंटरफेस के सदस्यों को प्रदर्शित नहीं करता है कि IMYInterface

तरह
public interface IMyInterface: IHasTotalHours, IHasLines 
{ 
    DateTime GoalStartDate { get; set; } 
    DateTime GoalEndDate { get; set; } 
} 

मैं इस तरह एक ग्रिड को एक उदाहरण के लिए बाध्य:

IList<IMyInterface> instance= GetMyData(); 

myGrid.DataSource = instance; 
myGrid.DataBind(); 

जब ग्रिड को यह बाँध, केवल सदस्यों को बताया कि ग्रिड में दिखाई IMyInterface के प्रत्यक्ष सदस्य हैं: गोल स्टार्टडेट और गोलएंडडेट।

वह क्यों है? मैं ग्रिड को अन्य इंटरफेस के सदस्यों को प्रदर्शित करने के लिए कैसे प्राप्त करूं?

अद्यतन विरासत में मिला इंटरफेस की तरह

public interface IHasTotalHours 
{ 
    string Description { get; set; } 
    int Hours{ get; set; } 
} 
public interface IHasLines 
{ 
    double TotalLines { get; set; } 
    double LinesPerHour { get; set; } 
} 

सरल डेटा गुण को परिभाषित एक वर्ग है कि IMyInterface लागू करता है:

public class MyClass : IMyInterface 
{ 
    public string Description { get; set; } 
    public int Hours { get; set; } 
    public double TotalLines { get; set; } 
    public double LinesPerHour { get; set; } 
    public DateTime GoalStartDate { get; set; } 
    public DateTime GoalEndDate { get; set; } 

} 

ये IMyInterface के रूप में कास्ट कर रहे हैं, और सूची में लौट आए कि मैं ग्रिड व्यू के लिए बाध्यकारी हूँ।

+0

IHasTotalHours, IHasLines, IHasGoals की परिभाषा क्या है? – shahkalpesh

+0

इसके अलावा, आईएमआई इंटरफेस लागू करने वाली कक्षा कैसी दिखती है? – shahkalpesh

उत्तर

5

डेटा बाध्य नियंत्रण डेटा स्रोत से गुण प्राप्त करने के लिए प्रतिबिंब का उपयोग नहीं करते हैं, लेकिन टाइप डिस्क्रिप्टर का उपयोग नहीं करते हैं। TypeDescriptor.GetProperties विधि में, आपको निम्न पढ़ सकते हैं:

एक घटक के लिए गुण एक वर्ग, के गुणों से अलग कर सकते हैं, क्योंकि साइट को शामिल करना या घटक sited है गुण निकाल सकते हैं।

जाहिर है कि डिफ़ॉल्ट कार्यान्वयन केवल इंटरफ़ेस से प्रत्यक्ष गुण लौटाएगा और विरासत में नहीं होगा।

सौभाग्य से यह तंत्र एक्स्टेंसिबल है, और आप कस्टम संपत्ति सूचना कार्यान्वयन के साथ TypeConverter कक्षा लिख ​​सकते हैं। कृपया संपत्ति तर्क लागू करने के लिए TypeConverter दस्तावेज़ में टिप्पणियों का संदर्भ लें।

आपके कस्टम टाइप कनवर्टर क्लास का गेटप्रॉपर्टीज कार्यान्वयन आपके इंटरफ़ेस पर TypeDescriptor.GetProperties (Type) और उसके सभी विरासत वाले इंटरफेस को कॉल कर सकता है। लेकिन हो सकता है कि आप एक सामान्य टाइप कनवर्टर भी लिख सकें जो प्रतिबिंब का उपयोग कर सभी विरासत गुणों को पा सके।

फिर आप इस कस्टम टाइप कनवर्टर को अपने इंटरफ़ेस में TypeConverterAttribute विशेषता के साथ संलग्न करते हैं।

और फिर, जादू की तरह, डेटा स्रोत सभी गुण पाएंगे। ;-)

+0

उत्कृष्ट। यह बहुत उपयोगी है। आपका बहुत बहुत धन्यवाद! – jlembke

+1

पूर्णता के लिए, TypeConverter मुख्य रूप से PropertyGrid जैसी चीजों पर लागू होता है; ग्रिड के लिए, ITypesList या TypeDescriptionProvider - या कभी-कभी (कम आम) ICustomTypeDescriptor (0 वें आइटम पर) का उपयोग करना अधिक आम है - लेकिन शायद ही कभी टाइप कनवर्टर। –

0

ऐसा इसलिए है क्योंकि एक इंटरफेस एक अनुबंध है, और यह एकमात्र तरीका है कि किसी ऑब्जेक्ट से बातचीत करने का एकमात्र तरीका उस विशिष्ट अनुबंध के माध्यम से होता है। अन्य इंटरफेस को ग्रहण नहीं किया जा सकता है और कास्ट नहीं किए जाने तक इसका उपयोग नहीं किया जा सकता है।

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

यदि आप डेटाग्रिड को सभी गुणों तक पहुंच प्राप्त करना चाहते हैं तो आपको सूची बांधना होगा।

+0

लेकिन यदि आईएमइंटरफेस को लागू करने वाली किसी भी कक्षा को अन्य इंटरफेस के सदस्यों को भी लागू करना है, तो मुझे नहीं पता कि वे सदस्य क्यों दिखाई नहीं दे रहे हैं। आपसे असहमत नहीं आईडीई में जब मैं उदाहरण पर होवर करता हूं, तो यह केवल मुझे तत्काल सदस्यों को दिखाता है। मुझे बाकी को देखने के लिए आगे खोदना है। – jlembke

+0

तो आप कह रहे हैं कि उदाहरण सूची होना चाहिए, न कि ILI? मैं इसे सुबह में एक शॉट दूंगा। – jlembke

+0

कोई फर्क नहीं पड़ता कि यह एक सूची या IList है या नहीं। यह बात है कि मायने रखता है। IMyInterface प्रकार केवल दो गुणों का खुलासा करता है। डेटाग्रिड संभवतः दूसरों के बारे में नहीं जान सकता क्योंकि इसे आईएमआईइंटरफेस प्रकार दिया जा रहा है। –

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