2009-07-24 9 views
7

कहें कि मेरे पास नमूना नामक एक व्यावसायिक वस्तु है और मेरे पास नमूने के बाध्यकारी सूची हैं। एक नमूना में 4 गुण हैं।बाध्यकारी सूची <T> के लिए बाध्यकारी - क्या बांधना है चुनें?

क्या मैं चुन सकता हूं कि कौन से गुण डेटाग्रिड से बंधे हैं या ऐसी चीज को अनुकूलित करने के लिए कोई विकल्प नहीं है?

नोट: मैं कॉम्पैक्ट फ्रेमवर्क का उपयोग कर रहा हूं, जहां कोई डेटाग्रिड व्यू नहीं है, साथ ही स्वत: उत्पन्न संपत्ति और डेटामेम्बर संपत्ति भी है।

उत्तर देने के दौरान कृपया इसे ध्यान में रखें।

उत्तर

0

मैं तुम्हें WinForms में डेटा ग्रिड मतलब यह सोचते कर रहा हूँ, लेकिन एक ही सबसे bindable नियंत्रण के लिए लागू है।

हाँ आप यह कर सकते हैं। ऐसा करने का तरीका एक 2 कदम प्रक्रिया

  • डेटासोर्स सदस्य को BindingList<T> का उदाहरण होने के लिए सेट करें।
  • डेटामेम्बर संपत्ति को उस संपत्ति का स्ट्रिंग नाम होने के लिए सेट करें जिसे आप बाध्य करना चाहते हैं।
+0

धन्यवाद। कॉम्पैक्ट फ्रेमवर्क डेटाग्रिड क्लास से डेटामेम्बर संपत्ति गुम है। क्या बाइंडिंगलिस्ट स्तर पर ऐसा करने का कोई तरीका है? मैं जो खोज रहा हूं वह एक नमूना संपत्ति को चिह्नित करने का एक तरीका है जो बाध्यकारी नहीं है .... – sarsnake

9
BindingList<Sample> samples = new BindingList<Sample>(); 
DataGridView dgv = new DataGridView(); 
dgv.DataSource = samples; 

यह DataGridView पर एक स्तंभ के रूप में प्रत्येक सार्वजनिक संपत्ति प्रदर्शित करना चाहिए। आप जो गुण प्रदर्शित किए जाते हैं बदलना चाहते हैं, तो आप के रूप में अच्छी निम्नलिखित कार्य करने होंगे:

dgv.AutoGenerateColumns = false; 

और, DataGridView के गुणों में जाने कॉलम मैन्युअल रूप से जोड़ने और संपत्ति नाम को DataPropertyName निर्धारित किया है।

आप कोड में DataGridView बनाया है, तो निम्नलिखित बना सकते हैं और DGV के लिए एक स्तंभ जोड़ देगा।

DataGridViewColumn dgvc = new DataGridViewColumn(); 
dgvc.Name = "PropertyA"; 
dgvc.HeaderText = "Property A"; 
dgvc.DataPropertyName = "PropertyA"; 
dgv.Columns.Add(dgvc); 


संपादित

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

public class Sample 
{ 
    public int PropertyA {get;set;} 
    public bool PropertyB {get;set;} 
    public string PropertyC {get;set;} 
    public double PropertyD {get;set;} 
} 

List<Sample> samples = new List<Samples>(GetSamples()); 
var sampleBinding = from sample in samples 
        select new 
        { 
         PropertyA = sample.PropertyA, 
         PropertyC = sample.PropertyC 
        }; 

BindingList bl = new BindingList(); 
bl.DataSource = sampleBinding; 
dgv.DataSource = bl; 


संपादित 2

public class Sample 
{ 
    [Browsable(false)] 
    public int PropertyA {get;set;} 
    public bool PropertyB {get;set;} 
    public string PropertyC {get;set;} 
    [Browsable(false)] 
    public double PropertyD {get;set;} 
} 
+0

धन्यवाद, मैं कॉम्पैक्ट फ्रेमवर्क में इसके बराबर कुछ कर रहा हूं। लेकिन यह बहुत गतिशील नहीं है क्योंकि मुझे अभी भी "PropertyA" स्ट्रिंग को हार्डकोड करने या इसे कुछ स्थिर करने के लिए लोड करने की आवश्यकता है। मैं शायद नमूना की प्रत्येक संपत्ति के बारे में अधिक जानकारी दे रहा था जिसमें एक संपत्ति बाइंडेबल है जिसे चालू या बंद किया जा सकता है। या दूसरे शब्दों में, बाध्यकारी सूची को बाध्यकारी .... मुझे लगता है कि यह संभव नहीं है? चलिए अब डेटाग्रिड कॉलम के बारे में भूल जाएं (मुझे पता है कि यह कैसे करना है)। क्या बाध्यकारी सूची के माध्यम से करने का कोई तरीका है? – sarsnake

+0

बाइंडिंगलिस्ट के लिए गुण/विधियों को देखते हुए ऐसा लगता है कि ऐसा नहीं लगता है। मुझे कुछ और कोड देने के लिए कुछ मिनट दें ताकि आप इसे आजमा सकें। –

+0

कुछ http://www.jardinesoftware.net/2007/10/23/hide-properties-in-bindinglist/ पर कुछ ऐसा नहीं है लेकिन वह विस्तृत नहीं करता है और वह नहीं जानता कि उसने क्या लिखा प्रयोग किया जाता है। – sarsnake

1

मैं इस में कुछ अलग अलग तरीकों से संभाला है, उम्मीद है कि यह उपयोगी है।

पहला विकल्प के रूप में जस्टिन उल्लेख किया है, AutoGennerateColumns = false निर्धारित करते हैं, और वहाँ से मैन्युअल रूप से करना है। यदि आप इसे बाध्य करते हैं, तो रनटाइम नमूना के सभी सार्वजनिक गुणों के लिए कॉलम बनाएगा। आप उन्हें निकालना चाहते हैं, तो आप के रूप में आप इसे अद्यतन रखने की जरूरत है कि

DataGridView.Columns["SomePropertyOfSample"].Remove(); 

साथ यह समाधान एक सा समस्याग्रस्त है, कर सकते हैं, और स्पष्ट रूप से आइटम निकालें।

संपत्ति पर गलत करने के लिए ब्राउज़ करने योग्य विशेषता को सेट करने का जस्टिन का संपादन 2 विकल्प दिलचस्प है, मैंने पहले यह कोशिश नहीं की है।

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

मेरे पास दो अलग-अलग डेटाग्रिड व्यू थे जिन्हें एक ही डेटा दिखाने के लिए आवश्यक था, लेकिन प्रत्येक बार अलग-अलग कॉलम दिखाते और छुपाते थे। इस मामले में आप क्या करेंगे:

public interface ISimpleSample 
{ 
    string Name {get;} 
    int ID {get;} 
} 

public interface IAdvancedSample 
{ 
    string Name {get; set;} 
    int ID {get; set;} 
    string Make {get; set;} 
    string Model {get; set;} 
} 

public class Sample : ISimpleSample, IAdvancedSample 
{ 
    //Implementation skipped 
} 

फिर आप

BindingList<ISimpleSample> = new BindingList<ISimpleSample>(); 

का उपयोग कर अपने नमूना संग्रह बना सकते हैं और है कि करने के लिए बाध्य।

यदि आप बाद में कॉलम जोड़ना चाहते हैं, तो आप उन्हें उचित इंटरफ़ेस में जोड़ें।

यह मेरी परियोजना के लिए अच्छा काम करता है, मुझे बताएं कि आप क्या सोचते हैं।

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