2012-08-02 7 views
12

मैं रिकॉर्ड एक विशिष्ट इसके साथ जुड़े झंडा है या नहीं बतलाने के लिए DataGridView सेल में एक छवि दिखाने के लिए एक नया आवश्यकता के साथ एक मौजूदा अनुप्रयोग है (नहीं उपयोगकर्ता से आबादी संपादन योग्य, यह डीबी से आता है)।DataGridView छवि स्तम्भ में व्यर्थ छवि को अक्षम कैसे करें जब DataTable

यदि कोई ध्वज है, तो मैं इसी छवि को दिखाता हूं, और यदि कोई ध्वज नहीं है, तो मुझे कॉलम में कुछ भी दिखाना नहीं है।

विजुअल स्टूडियो डिजाइनर में DataGridView कॉलम नहीं बनाए गए थे, अन्यथा यह आसान होगा। मैं सिर्फ कॉलम पर NullValue संपत्ति सेट कर सकता था। इसके बजाय कॉलम रनटाइम पर बनाए जाते हैं जब सभी डेटा डेटाटेबल में लोड होते हैं, और फिर उस डेटाटेबल से डेटाव्यू बनाया जाता है, और फिर DataGridView के डेटासोर्स को डेटा व्यू पर सेट किया जाता है।

मैं इसे पूरी तरह से फिर से लिख नहीं सकता, या अन्यथा मैं डेटाटेबल से स्तंभों को परिभाषित करने के इस हास्यास्पद तरीके के बजाय वीएस डिजाइनर में कॉलम को परिभाषित करता हूं।

मेरा प्रश्न तो, मैं कैसे कर सकते हैं यह बहुत छवियों के साथ स्तंभ में कुछ भी नहीं पता चलता अंतर्निहित डेटा तालिका एक अशक्त है जब है?

यहां कुछ छद्म सी # है जो मेरा मतलब है इसका प्रदर्शन करने के लिए। याद रखें, मैंने इसे इस तरह के दो डेटाटेबल्स का उपयोग करने के लिए नहीं लिखा; जब मैं यह मेरे लिए सौंप दिया था इसे उस तरह से था, और मैं भारी बदलाव सिर्फ एक नया स्तंभ जोड़ना बनाने के लिए नहीं चाहता ...

DataTable rawData = someMethodThatReturnsMyRawData(); 
DataTable data = new DataTable(); 
data.Columns.Add("Flags", typeof(Image)); 
data.Columns.Add("SomeOtherColumn"); 

foreach (DataRow rawDataRow in rawData.Rows) 
{ 
    DataRow dataRow = data.NewRow(); 
    bool hasFlagType1 = false; 
    bool hasFlagType2 = false; 

    if (rawDataRow["FlagType1ID"] != DBNull.Value) 
    { 
     hasFlagType1 = true; 
    } 

    if (rawDataRow["FlagType2ID"] != DBNull.Value) 
    { 
     hasFlagType2 = true; 
    } 

    if (hasFlagType1 && hasFlagType2) 
    { 
     dataRow[0] = Properties.Resources.BothFlagsImage; 
    } 
    else if (hasFlagType1) 
    { 
     dataRow[0] = Properties.Resources.FlagType1Image; 
    } 
    else if (hasFlagType2) 
    { 
     dataRow[0] = Properties.Resources.FlagType2Image; 
    } 
    else 
    { 
     //If neither flag set, I don't want it to show anything, 
     //but if I leave it as null, a little box with an X in it shows up 
     //I could set it to some transparent GIF here, but that seems lame 
    } 

    dataRow[1] = rawDataRow["SomeOtherColumn"]; 

    data.Rows.Add(dataRow);   
} 

DataView dv = new DataView(data, string.Empty, "SomeOtherColumn ASC", DataViewRowState.CurrentRows); 

this.emptyDataGridViewFromDesigner.DataSource = dv; 

// How can I modify the column "Flags" at this point to show nothing if the value is null? 

संपादित करें: यहाँ एक स्क्रीनशॉट, ताकि आप देख सकते हैं कि मैं क्या मतलब है एक एक्स के साथ छोटे से बॉक्स से - उन सभी nulls रहे हैं ...

DataGridView with Null Images

इसके अलावा, यह वहाँ .NET 4.0 में एक समाधान केवल, मैं से बाहर हूँ अगर ऐसा है, .NET 3.5 हो गया है भाग्य।

उत्तर

25

मैं इस पता लगा ...

एक DataGridViewImageColumn के रूप में स्तंभ कास्ट करने के लिए है, तो उस स्तंभ के लिए शून्य पर DefaultCellStyle.NullValue निर्धारित किया है। ऊपर मेरे उदाहरण से, आप इसे इस तरह करना चाहता हूँ ...

((DataGridViewImageColumn)this.emptyDataGridViewFromDesigner.Columns["Flags"]).DefaultCellStyle.NullValue = null; 

मुझे लगता है मैं बंदूक यहाँ पूछ कूद गया, लेकिन उम्मीद है कि इस किसी और कुछ समय में मदद करता है।

+0

मैं वीबी.नेट में ऐसा कैसे कर सकता हूं? = कुछ भी नहीं है मुझे लगता है? –

+0

मैं इस समाधान अंतिम पंक्ति के लिए काम नहीं किया है – camino

2

पूरे ग्रिड को ठीक करने के लिए, बस निर्माता फार्म के लिए इस कोड जोड़ें। (और अपने डेटा का नाम बदलें ग्रिड):

 Load += delegate 
     { 
      // remove default [x] image for data DataGridViewImageColumn columns 
      foreach (var column in dataGridView1.Columns) 
      { 
       if (column is DataGridViewImageColumn) 
        (column as DataGridViewImageColumn).DefaultCellStyle.NullValue = null; 
      } 
     }; 
संबंधित मुद्दे