2012-07-14 18 views
6

मैं DataGridView पर कुछ इस तरह रहा हूँ पर पाठ:सी # - DataGridView - छवि और एक ही पंक्ति

Image | Text | 
Text | Text | 
Image | Text 

असल में, मैं तो बस एक ही पंक्ति पर छवि कोशिकाओं और पाठ कोशिकाओं चाहते हैं। मैं इसे विभिन्न प्रकारों के साथ काम करने में सक्षम था, उदाहरण के लिए: चेकबॉक्स, टेक्स्ट, आदि ... लेकिन मैं इसे छवियों के साथ काम करने में सक्षम नहीं हूं।

मैं इस त्रुटि मिलती है: Invalid Cast from 'System.String' to 'System.Drawing.Image'

किसी को भी समाधान पता है या मैं इसे कैसे करना चाहिए पर सुझाव है? धन्यवाद

+1

पोस्ट अपने aspx मार्कअप यहाँ –

+0

ref1c - क्या आप अपने प्रश्न में उलझन वाली पंक्तियां और कॉलम प्राप्त कर रहे हैं? एक ही पंक्ति (विभिन्न स्तंभों में) पर छवियों और पाठ को छोटा करने के लिए छोटा है, बस एक छवि और एक टेक्स्ट कॉलम है। छवियों और पाठ दोनों के साथ एक कॉलम रखने के लिए थोड़ा सा ट्रिकियर है। मैं अभी इसके जवाब पर काम कर रहा हूं। –

उत्तर

7

कुछ कोशिकाओं में DataGridViewImageColumn प्रदर्शन टेक्स्ट के कॉलम के अपेक्षाकृत आसान है।

आपको केवल वांछित सेल को DataGridViewTextBoxCell के साथ प्रतिस्थापित करने की आवश्यकता है।

उदाहरण के लिए, अगर मैं अपने ग्रिड के लिए निम्न छवि कॉलम जोड़ें:

DataGridViewImageColumn imageColumn = new DataGridViewImageColumn(); 
imageColumn .Name = "ImageColumn"; 
imageColumn .HeaderText = "An Image!"; 
Image i = Image.FromFile(@"C:\Pictures\TestPicture.jpg"); 
imageColumn.Image = i; 
dataGridView1.Columns.Add(imageColumn); 

आप जब किसी सेल पाठ के साथ ऐसा (यहां बटन हैंडलर में की तरह जगह ले सकता है, लेकिन आप भी इसे कहीं की तरह कर सकता है एक डाटाबेसिंग पूर्ण हैंडलर के भीतर)।

private void button1_Click(object sender, EventArgs e) 
{ 
    dataGridView1.Rows[3].Cells["ImageColumn"] = new DataGridViewTextBoxCell(); 
    dataGridView1.Rows[3].Cells["ImageColumn"].Value = "Some text!"; 
} 

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

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

+0

धन्यवाद, आदमी !!! मैंने अलग-अलग समाधान के साथ प्रयास किया है लेकिन ऐसा करने में सक्षम नहीं था कि मैं 'DataGridViewTextBoxCell()' का उपयोग करना भूल गया हूं, आपका समाधान मुझे अपना कार्य प्राप्त करने में मदद करता है –

1

मुझे पता चला कि मुझे DataGridViewCellFormattingEventHandler को संभालना था और DataGridViewCellFormattingEventHandler में छवि असाइन करना था (जो अपवाद को बाहर निकालने के रूप में फेंक रहा था)।

DataGridViewCellFormattingEventHandler अंदर मैं सौंपा e->Value = System::Drawing::Image::FromFile("c:/Test.jpeg");
या
e.Value = System.Drawing.Image.FromFile("c:/Test.jpeg");

0

बेहतर समाधान के लिए, कृपया इस Blogspot पोस्ट देखें।

मैं अपने प्रोजेक्ट के लिए एक ही समाधान की कोशिश की, यह अच्छी तरह से काम कर रहा है, मेरे datagrid कक्ष में 16x16 पिक्सेल छवि प्रदर्शित करने, मैं ऊपर TextandImageColumn कक्षा में समारोह संपादित किया है:

protected override void Paint(Graphics graphics, Rectangle clipBounds, 
    Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
    object value, object formattedValue, string errorText, 
    DataGridViewCellStyle cellStyle, 
    DataGridViewAdvancedBorderStyle advancedBorderStyle, 
    DataGridViewPaintParts paintParts) 
    { 
     // Paint the base content 
     base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, 
      value, formattedValue, errorText, cellStyle, 
      advancedBorderStyle, paintParts); 

     if (this.Image != null) 
     { 
      PointF p = cellBounds.Location; 
      p.X += 0; 
      p.Y += 4; 

      graphics.DrawImage(this.Image, p); 
     } 
    } 
संबंधित मुद्दे