2010-03-12 10 views
8

मुझे यह भी सुनिश्चित नहीं है कि मैं इसे सही तरीके से कर रहा हूं। लेकिन मूल रूप से मेरे पास ऐसी वस्तुओं की एक सूची है जो कक्षा से बाहर बनाई गई हैं। वहाँ से, मैं एक datagrid दृश्य एक Windows फॉर्म (सी #)डेटाबेस WinGorms के लिए ऑब्जेक्ट्स की सूची DataGridView, लेकिन कुछ सार्वजनिक गुण नहीं दिखाएं

वहां से पर है कि करने के लिए सूची बाध्यकारी कर रहा हूँ, यह वस्तु के सभी सार्वजनिक संपत्तियों, datagrid दृश्य में दिखाता है। हालांकि कुछ गुण हैं जिन्हें मुझे अभी भी मेरे आवेदन के अन्य हिस्सों से सुलभ करने की आवश्यकता है, लेकिन डेटाग्रिड व्यू में वास्तव में दिखाई देने की आवश्यकता नहीं है।

तो क्या कोई विशेषता या कुछ ऐसा है जो मैं इसे दिखाए जाने से बाहर करने के लिए संपत्ति के ऊपर लिख सकता हूं।

पीएस मैं रनटाइम पर बाध्यकारी। तो मैं डिजाइनर के माध्यम से कॉलम संपादित नहीं कर सकता।

पी.पी.एस. कृपया सार्वजनिक चर बनाने का कोई जवाब नहीं है (हालांकि अगर यह एकमात्र तरीका है, तो मुझे बताएं :))।

+3

आप DataGridView.AutoGenerateColumns '(http://goo.gl/41qt) को अक्षम और आवश्यक स्तंभों गतिशील जोड़ सकते हैं। जब आप कहते हैं तो मैं वास्तव में समझ में नहीं आता "... मैं रनटाइम पर बाध्यकारी हूं। इसलिए मैं डिजाइनर के माध्यम से कॉलम संपादित नहीं कर सकता।" – Vivek

+0

मैं जो कह रहा हूं वह है। मैं डिजाइनर का उपयोग नहीं कर रहा हूं और डेटासोर्स को बाध्यकारी हूं। मैं बस लिख रहा हूं: datagridview.datasource = mylist; – MindingData

+0

शायद आप हमें बता सकते हैं कि आप डिज़ाइनर के बजाए रनटाइम पर क्यों बाध्यकारी हैं। इससे –

उत्तर

14

सार्वजनिक गुण है कि आप के लिए स्तंभ उत्पन्न करने के लिए नहीं करना चाहती में जोड़े [Browsable(false)] विशेषता।

+1

+1 अगर यह केवल काम जोड़ रहा है, तो यह मेरे उत्तर से काफी बेहतर है! :-) – Javier

+0

अच्छा मैंने कोशिश की है, यह काम करता है =) मैं अपनी कस्टम कक्षाओं को जोड़ने की कोशिश कर रहा था। धन्यवाद! – Javier

2

मुझे उनकी टिप्पणी में @Vivek जैसा ही जवाब देना था। मुझे पता नहीं था कि उसने यहां कोई जवाब क्यों नहीं जोड़ा ...

ठीक है, अगर आप अपने कॉलम जेनरेट करने के लिए डेटाग्रिड व्यू नियंत्रण देते हैं, तो यह बाध्य वस्तुओं में सभी गुण दिखाता है। तो सबसे पहले, आपको DataGridView.AutoGenerateColumns = false चालू करना होगा।

फिर आप रनटाइम पर कॉलम जोड़ सकते हैं। उदाहरण के लिए:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn(); 
myColumn.DataPropertyName.HeaderText = "Title of the column"; 
myColumn.DataPropertyName = "NameOfTheProperty"; 

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

मदद मिल सकती है मैन्युअल रूप से सबकुछ जोड़ना शायद मेरा आखिरी उपाय है। – MindingData

+0

फिर, मेरे पास एक विचार है, लेकिन यह बहुत बड़ा है, मैं इसे एक और जवाब में डाल दूंगा। – Javier

+1

इस दूसरे विचार के बारे में भूल जाओ। इसके बजाय @ विवेक उत्तर देखें = पी – Javier

0

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

पहले, आप अपने कस्टम विशेषता कोड करने के लिए है:

MyPropertyAttribute वर्ग

आप अपनी कक्षाओं में इसका इस्तेमाल कर सकते हैं, बस इस तरह:

फू वर्ग

public class Foo 
{ 
    private string name; 
    private string surname; 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)] 
    public string Surname 
    { 
     get 
     { 
      return surname; 
     } 
     set 
     { 
      surname = value; 
     } 
    } 

} 

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

इस तरह कुछ ...

public class MyCustomDataGridView : DataGridView 
    { 

     public MyCustomDataGridView() 
     { 
      this.AutoGenerateColumns = false; 
     } 

     public void Load<T>(ICollection<T> collection) 
     { 

      foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true)) 
      { 
       if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible) 
       { 
        //... 
       } 
      } 

     } 

    } 
0

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

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