2009-06-02 8 views
5

मैंने डेटाग्रिड व्यू बनाया है और डेटाग्रिड व्यू इमेज कॉलम (डिज़ाइनर का उपयोग करके) जोड़ा है।DataGridViewImageColumn लाल x

डेटाग्रिड व्यू में "AllowUserToAddRows = true" है, इसलिए उपयोगकर्ता के लिए एक नई पंक्ति दर्ज करने के लिए एक खाली पंक्ति प्रदर्शित होती है। इस रिक्त पंक्ति में DataGridViewImageColumn एक लाल x प्रदर्शित करता है। मैं हमेशा एक ही छवि को कॉलम में प्रदर्शित करना चाहता हूं चाहे इस पंक्ति में कोई डेटा है या नहीं (मैं सेल के क्लिक इवेंट को बाध्य कर रहा हूं ताकि डेटाग्रिड व्यू इमेज कॉलम का उपयोग बटन के रूप में किया जा सके)।

मैं लाल एक्स से कैसे छुटकारा पा सकता हूं?

+0

यदि किसी पंक्ति में कोई डेटा नहीं है, तो यह क्यों प्रदर्शित/दृश्यमान होता है? – Cerebrus

+0

सेरेब्रस, एक रिक्त पंक्ति प्रदर्शित होती है क्योंकि "AllowUserToAddRows = true"। मैंने इसे शामिल करने के लिए अपना प्रश्न संपादित किया है। –

उत्तर

4

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

e.Value = (imageIndex != int.MinValue) ? imageList.Images[imageIndex] : nullImage; 

जहां nullImage के रूप में वर्ग में पहले परिभाषित किया गया है:

private readonly Image nullImage = new Bitmap(1, 1); 
1

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

मैं पंक्तियों को ओवरराइड करता हूं और डेटा ग्रिडव्यू इमेज कॉलम का मान शून्य पर सेट करता हूं। मुझे लगता है कि मान शून्य है, यह छवि प्रदर्शित करता है।

private void dgvWorksheet_RowsAdded(object sender, 
    DataGridViewRowsAddedEventArgs e) 
{ 
    dgvWorksheet.Rows[e.RowIndex].Cells[colStartClock.Index].Value = null; 
} 

मैं भी Form_Load

colStartClock.DefaultCellStyle.NullValue = null; 

में अशक्त करने के लिए कॉलम की NullValue सेट मुझे यकीन है कि ऐसा कुछ हो रहा क्या करने की जरूरत है कि अगर नहीं हूँ। ऐसा लगता है कि यह काम कर रहा है लेकिन यह थोड़ा छोटी गाड़ी लगता है - यादृच्छिक क्लिक कभी-कभी अपवादों में पड़ता है, इसलिए अधिक जांच की आवश्यकता होती है।

2

मैं इन समाधानों के माध्यम से देखा है और जिस तरह मैं काम करने के लिए यह मिल गया निर्माता में InitializeComponent() कॉल के बाद यह करने के लिए था डेटा बाध्य पंक्तियों के लिए डिफ़ॉल्ट छवि एक खाली छवि

dataGridView1.Columns[0].DefaultCellStyle.NullValue = null; 

बनाने के लिए और RowPrePaintEvent हुक अंत में रिक्त पंक्ति के लिए लाल X दूर करने के लिए ग्रिड की वजह से AllowUserToAddRows = true:

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
     if (e.RowIndex >= numberOfRows) 
     { 
      dataGridView1.Rows[e.RowIndex].Cells[0].Value = null; 
     } 
} 

कहाँ numberOfRows ग्रिड में मान्य पंक्तियों की संख्या है। बस इससे निपटने में कुछ घंटे बिताए। उम्मीद है कि यह किसी और सिर दर्द की बचत होती है ...

2

मैं इस

private void dgUserFileList_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { 
     DataGridViewRow row = dgUserFileList.Rows[e.RowIndex]; 
     if (row.IsNewRow) { 
      row.Cells[0].Value = null; 
     } 
     } 
    } 
0

एक और तरीका है की तरह grid.row की IsNewRow संपत्ति का इस्तेमाल किया एक DataGridView में सभी DataGridViewImageColumn तत्वों के लिए इस डिफ़ॉल्ट व्यवहार से बचने के लिए रोकना है CellFormatting घटना:

dataGridView1.CellFormatting += delegate(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.RowIndex < 0 || e.ColumnIndex < 0) 
     return; 

    var grid = (DataGridView)sender; 
    if (grid.Columns[e.ColumnIndex] is DataGridViewImageColumn && 
     grid[e.ColumnIndex, e.RowIndex].DefaultNewRowValue.Equals(e.Value)) 
     e.Value = null; 
}; 

इस तरह घटक हमेशा डिफ़ॉल्ट "अनुपलब्ध छवि" की जगह सेल के लिए NullValue छवि का उपयोग करेगा।

1

MSDN documentation बल्कि इस पर वर्बोज़ है:

डिफ़ॉल्ट रूप से, रिक्त कक्षों एक डिफ़ॉल्ट त्रुटि ग्राफिक प्रदर्शित करते हैं। अशक्त या DBNull.Value के बराबर सेल मूल्यों के लिए प्रदर्शित होने से इस ग्राफिक रोकने के लिए, नियंत्रण के लिए पंक्तियों को जोड़ने से पहले अशक्त को सेल शैली DefaultCellStyle संपत्ति द्वारा दिया वस्तु की DataGridViewCellStyle.NullValue गुण सेट। यह नए रिकॉर्ड के लिए पंक्ति को प्रभावित नहीं करता है, हालांकि। जब नियंत्रण AllowUserToAddRows संपत्ति मूल्य सच है नए रिकॉर्ड के लिए पंक्ति में दिखाई देने से त्रुटि ग्राफिक रोकने के लिए, आप भी या तो स्पष्ट रूप अशक्त करने के लिए सेल मूल्य एक हैंडलर में नियंत्रण RowsAdded घटना के लिए सेट या सेट करना होगा एक DataGridViewImageCell व्युत्पन्न प्रकार का एक उदाहरण के लिए स्तंभ CellTemplate संपत्ति एक ओवरराइड DefaultNewRowValue संपत्ति है कि अशक्त रिटर्न के साथ।

कोड करने के लिए इसका मतलब है कि आप किसी भी पंक्तियों को जोड़ने से पहले यह कर सकते हैं अनुवादित:

var column = new DataGridViewImageColumn(); 
column.DefaultCellStyle.NullValue = null; 
column.CellTemplate = new DataGridViewEmptyImageCell(); 

और फिर कहीं इस वर्ग डाल: में अशक्त करने के लिए

private class DataGridViewEmptyImageCell : DataGridViewImageCell 
{ 
    public override object DefaultNewRowValue { get { return null; } } 
} 

या सेट Cell.ValueRows.Added घटना।

+0

यह मेरे लिए काम करता है। धन्यवाद! – camino

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