2011-08-05 12 views
20

मैं सी # में एक छोटा सा अनुप्रयोग है, यह एक DataGridView का उपयोग कर भर जाता है कि है:कस्टम डेटा स्रोत का उपयोग करते समय DataGridView के कॉलम को कैसे छिपाना है?

grid.DataSource = MyDatasource array;

MyClass स्तंभों के लिए संरचना पकड़, यह इस तरह दिखता है:

class MyDatasource 
{ 
    private string column1;   
    private string column2; 

    public MyDatasource(string arg1, string arg2) 
    { 
     this.column1 = arg1; 
     this.column2 = arg2; 
    } 

    public string column1 
    { 
     get 
     { 
      return this.column1; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 

    public string column2 
    { 
     get 
     { 
      return this.column2; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 
} 

सब कुछ ठीक काम करता है और DataGridView सही डेटा के साथ पॉप्युलेट हो जाता है, लेकिन अब मैं कॉलम 2 को छिपाना चाहता हूं। मैंने स्तंभ घोषणा के ऊपर [Browsable(false)] जोड़ने का प्रयास किया, जो इसे छुपाएगा, लेकिन मुझे कोड से कॉलम मान तक पहुंचने की भी आवश्यकता है, और जब मैं [Browsable(false)] का उपयोग करता हूं और उस सामग्री को पढ़ने की कोशिश करता हूं जैसे कॉलम मौजूद नहीं है। अगर मैं इसका उपयोग नहीं करता हूं तो मैं बिना किसी समस्या के कॉलम पढ़ सकता हूं लेकिन यह DataGridView में दिखाई देता है।

मैं कॉलम को कैसे छुपा सकता हूं लेकिन फिर भी कोड से इसकी सामग्री को पढ़ने में सक्षम हूं?

उत्तर

2

सेट कि विशेष स्तंभ के Visible संपत्ति = false

dataGridView[ColumnName or Index].Visible = false;

संपादित खेद Columns संपत्ति dataGridView.Columns[ColumnName or Index].Visible = false;

31

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

ग्रिड दृश्य नियंत्रण पर स्तंभ छिपाने के लिए, अगर आप इस तरह कोड का उपयोग कर सकते हैं:

dataGridView1.Columns[0].Visible = false; 

डेटा स्रोत से स्तंभ का उपयोग करने के लिए आपको कुछ इस तरह की कोशिश कर सकते:

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"]; 
+0

नियंत्रण के बाद 'दृश्यमान' "केवल पढ़ने के लिए" है। –

6

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

पूर्व ..

 if (dt.Rows.Count > 0) 
    { 
     dataGridViewProjects.DataSource = dt; 
     dataGridViewProjects.Columns["Title"].Width = 300; 
     dataGridViewProjects.Columns["ID"].Visible = false; 
    } 
35

कुछ मामलों में, यह एक बुरा विचार पहले DataGridView करने के लिए स्तंभ जोड़ने के लिए हो सकता है और उसके बाद इसे छिपाने।

उदाहरण के लिए मैं एक कक्षा है जिसमें कंपनी लोगो के लिए एक छवि संपत्ति के लिए एनएचबेर्नेट प्रॉक्सी है। अगर मैंने उस प्रॉपर्टी को एक्सेस किया है (उदा। डेटाग्रिड व्यू में दिखाने के लिए अपनी ToString विधि को कॉल करके), यह SQL सर्वर से छवि डाउनलोड करेगा। अगर मेरे पास कंपनी ऑब्जेक्ट्स की एक सूची थी और उस तरह डेटाग्रिड व्यू के डेटासोर्स के रूप में इस्तेमाल किया गया था, तो (मुझे संदेह है) इससे पहले कि मैं कॉलम छुपा सकूं, यह सभी लोगो डाउनलोड करेगा।

इसे रोकने के लिए, मैं कस्टम छवि संपत्ति पर विशेषता

[System.ComponentModel.Browsable(false)] 

, ताकि DataGridView संपत्ति पर ध्यान नहीं देता (स्तंभ का निर्माण नहीं करता और ToString तरीकों फोन नहीं करता है) का इस्तेमाल किया।

public class Company 
{ 
    ... 
    [System.ComponentModel.Browsable(false)] 
    virtual public MyImageClass Logo { get; set;} 
+0

यह निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका है यदि आप उस संपत्ति के साथ काम करते हैं जिसे आप जानते हैं कि आप कभी प्रदर्शित नहीं करना चाहेंगे। – Henry

+1

यह सबसे अच्छा जवाब है। अवधि। – Buddha

+0

सबसे सुरुचिपूर्ण समाधान साथी कोडर +1 – ChenChi

0

मैं एक ही समस्या

था यहाँ समाधान है कि आप के लिए काम कर सकते हैं है। यह मेरे लिए काम किया

GridView1.DataBind(); 
if (GridView1.Columns.Count > 0) 
    GridView1.Columns[0].Visible = false; 
else 
{ 
    GridView1.HeaderRow.Cells[0].Visible = false; 
    foreach (GridViewRow gvr in GridView1.Rows) 
    { 
     gvr.Cells[0].Visible = false; 
    } 
} 
4

मैंने देखा है कि अगर progrmmatically उपयोग किया यह अधूरा renders (पूरा फ़ॉर्म बस कुछ भी "रंग" नहीं है) अगर इस्तेमाल किया पहले panel1.Controls.Add(dataGridView); तो dataGridView.Columns["ID"].Visible = false; पूरा फ़ॉर्म तोड़ने के लिए और इसे खाली कर देगा, तो दौर के बाद इसे सेट करने के लिए:

panel1.Controls.Add(dataGridView); 
dataGridView.Columns["ID"].Visible = false; 
//works 

dataGridView.Columns["ID"].Visible = false; 
panel1.Controls.Add(dataGridView); 
//fails miserably 
संबंधित मुद्दे