2012-05-18 3 views
11

हम अपने आवेदन पर विभिन्न ग्रिड में रंग कोड कोशिकाओं में सेलफॉर्मेटिंग ईवेंट का उपयोग करते हैं।क्या सभी कक्षों के लिए सेलफॉर्मेटिंग ईवेंट को आग लगाने के लिए डेटाग्रिड व्यू को मजबूर करने का कोई तरीका है?

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

यह question & answer में मदद मिली है (और यह काम करता है) ... को छोड़कर वहाँ बड़ा ग्रिड कि एक ही स्क्रीन से बाहर भी साथ एक समस्या है। ग्रिड के भाग जिन्हें अभी तक स्क्रीन पर प्रदर्शित नहीं किया गया है (तार्किक रूप से) कभी भी अपने सेलफॉर्मेटिंग कोड को निकाल नहीं पाए जाते हैं, और इसलिए उनका अंतर्निहित रंग कभी भी सेट नहीं होता है। नतीजतन, Excel में, रंग कोडिंग पेज नीचे बाहर आधे रास्ते fizzles।

लगता तीन समाधान देखते हैं:

1) उपयोगकर्ता वह एक्सेल में एक निर्यात करने से पहले ग्रिड के सभी भागों में स्क्रॉल करने के लिए है बताओ। हा! नहीं एक गंभीर समाधान

2) प्रोग्राम एक्सेल में एक निर्यात करने से पहले ग्रिड के सभी भागों के लिए स्क्रॉल। (1)

3) हमारे निर्यात में एक्सेल कोड में निर्यात करने के लिए, शीर्ष पर कुछ आग लगाना जो डेटाग्रिड व्यू को अपने पूरे क्षेत्र को पेंट/प्रारूपित करने के लिए बताता है।

MyDataGridView.FormatAllCells() 

वहाँ कुछ है कि कुछ इस तरह करता है ???

ओह, और वहाँ एक चौथा विकल्प है, लेकिन यह मौजूदा कोड उनमें काफी छू शामिल होगी:

4), CellFormatting घटना का उपयोग करना बंद लोड समय पर कोशिकाओं को फ़ॉर्मेट। इसके साथ समस्या यह है कि हमें अपने आवेदन में हर ग्रिड को फिर से करना होगा क्योंकि सेलफॉर्मेटिंग जिस तरह से हमने इसे वर्ष के बाद से किया है।

+0

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

+0

एक और विकल्प (4 का एक संस्करण) सेलवैल्यू का उपयोग करना है जो आपके स्वरूपण को करने के लिए किया गया है। –

उत्तर

2

मानते हुए, @ डेविडहॉल सुझाव देते हैं, कोई जादू .FormatAllCells कोई दूसरा विकल्प सेलफॉर्मेटिंग का उपयोग करना बंद करना है।

हालांकि, नई समस्या है कि यहाँ लोड होने के दौरान सेल शैली स्वरूपण लागू करने के कोई असर दिखाई नहीं देता है। यदि आप इसे Google करते हैं तो वहां बहुत सारी पोस्ट हैं। इसके अलावा वे इंगित करते हैं कि यदि आप फॉर्म पर एक बटन के नीचे एक ही कोड डालते हैं और लोड होने के बाद इसे क्लिक करते हैं (लोड के बजाय, कोड काम करेगा ... इसलिए स्टाइल लागू होने से पहले ग्रिड को दिखाना होगा)। विषय पर अधिकतर सलाह से पता चलता है कि आप ... ड्रमोल ... सेलफॉर्मेटिंग का उपयोग करते हैं। Aargh!

अंततः एक पोस्ट मिली जो ग्रिड की DataBindingComplete घटना का उपयोग करने का सुझाव देती है। और यह काम करता है।

वैसे, यह समाधान मेरी अवांछित विकल्प "4" का एक संस्करण है।

6

मेरे पास एक संभावित समाधान है - आपके निर्यात फ़ंक्शन में सेल का उपयोग करें। प्रत्येक सेल की FormattedValue प्रॉपर्टी। Microsoft के अनुसार, यह सेलफॉर्मेटिंग ईवेंट को आग लगाने के लिए मजबूर करता है।

+0

असल में, यह एक उचित सुझाव की तरह लगता है – hawbsl

+0

धन्यवाद। 'Dim strValue स्ट्रिंग के रूप में ' ' आर के रूप में पूर्णांक = 0 dgv.Rows.Count - 1' 'सी के रूप में पूर्णांक = 0 dgv.Columns.Count - 1' ' strValue = dgv.Rows (r) .Cells (सी) .FormattedValue() ' ' अगला' 'अगला' –

2

मैं एक ही समस्या थी और मैं काफी अपने समाधान # 4 के लिए इसी तरह कुछ के साथ समाप्त हो गया है। आपके जैसे, मैंने DataBindingComplete ईवेंट का उपयोग किया है।लेकिन, जब से मैं विस्तार पद्धति का उपयोग किया, मौजूदा कोड में परिवर्तन को सहने लायक हैं:

internal static class DataGridViewExtention 
{ 
    public static void SetGridBackColorMyStyle(this DataGridView p_dgvToManipulate) 
    { 
     p_dgvToManipulate.RowPrePaint += p_dgvToManipulate_RowPrePaint; 
     p_dgvToManipulate.DataBindingComplete += p_dgvToManipulate_DataBindingComplete; 
    } 

    // for the first part - Coloring the whole grid I used the `DataGridView.DataBindingComplete` event: 
    private static void p_dgvToManipulate_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
    { 
     foreach (DataGridViewRow objCurrRow in ((DataGridView)sender).Rows) 
     { 
      // Get the domain object from row 
      DomainObject objSelectedItem = (DomainObject)objCurrRow.DataBoundItem; 

      // if item is valid .... 
      if objSelectedItem != null) 
      { 
       // Change backcolor of row using my method 
       objCurrRow.DefaultCellStyle.BackColor = GetColorForMyRow(objSelectedItem); 
      } 
     } 
    } 

    // for the second part (disabling the Selected row from effecting the BackColor i've setted myself, i've used `DataGridView.RowPrePaint` event: 
    private static void p_dgvToManipulate_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
    { 
     // If current row about to be painted is selected by user 
     if (((DataGridView)sender).Rows[e.RowIndex].Selected) 
     { 
      // Get current grid row 
      var objGridRow = ((DataGridView)sender).Rows[e.RowIndex]; 

      // Get selectedItem 
      DomainObject objSelectedItem = (DomainObject)objGridRow.DataBoundItem; 

      // if item is valid .... 
      if (objSelectedItem != null && objSelectedItem.ObjectId != 0) 
      { 
       // Set color for row instead of "DefaultCellStyle" (same color as we used at DataBindingComplete event) 
       objGridRow.DefaultCellStyle.SelectionBackColor = GetColorForMyRow(objSelectedItem); 
      } 

      // Since the selected row is no longer unique, we need to let the used to identify it by making the font Bold 
      objGridRow.DefaultCellStyle.Font = new Font(((DataGridView)sender).Font.FontFamily, ((DataGridView)sender).Font.Size, FontStyle.Bold); 
     } 
     // If current row is not selected by user 
     else 
     { 
      // Make sure the Font is not Bold. (for not misleading the user about selected row...) 
      ((DataGridView)sender).Rows[e.RowIndex].DefaultCellStyle.Font = new Font(((DataGridView)sender).Font.FontFamily, 
                        ((DataGridView)sender).Font.Size, FontStyle.Regular); 
     } 
    } 
} 
1

सम्भावित समाधान यदि आप (Cellformatting-समारोह के दौरान प्रदान की स्वरूपण पुन: उपयोग करने की तरह जैसे cellstyle-तत्व चाहते हैं fontbold और पृष्ठभूमि रंग)।

: ये cellstyles 'cellformatting' और 'cellpainting' घटनाओं लेकिन DataGridView सेल की शैली में ही नहीं के बीच केवल उपलब्ध होने की ..

इस तरह एक दूसरे हैंडलर के साथ cellformatting-घटना के दौरान cellstyles कैद लगते हैं

  1. exportmodule में cellstyles स्टोर करने के लिए एक साझा सूची, सरणी या शब्दकोश जोड़ें:

    Dim oDataGridFormattingDictionary as Dictionary(Of String, DataGridViewCellStyle) = nothing 
    
  2. शब्दकोश प्रारंभ करने और अपने मुद्रण या निर्यात कोड में DataGridView के लिए एक दूसरी हैंडलर जोड़ने। इस तरह vb.net कुछ में:

    oDataGridFormattingDictionary = New Dictionary(Of String, DataGridViewCellStyle) 
    AddHandler MyDatagridviewControl.CellFormatting, AddressOf OnPrintDataGridView_CellFormatting 
    
  3. हैंडलर के लिए कोड जोड़ें

    Private Sub OnPrintDataGridView_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) 
    If e.RowIndex > -1 AndAlso e.ColumnIndex > -1 AndAlso Not e.CellStyle Is Nothing Then 
        If Not oDataGridFormattingDictionary Is Nothing andalso oDataGridFormattingDictionary.ContainsKey(e.RowIndex & "_" & e.ColumnIndex) = False Then 
        oDataGridFormattingDictionary.Add(e.RowIndex & "_" & e.ColumnIndex, e.CellStyle) 
        End If 
    End If 
    End Sub 
    
  4. बहुत महत्वपूर्ण: सुनिश्चित करने के लिए मूल cellformating घटना (और दूसरा cellformatting-हैंडलर उसके बाद) वास्तव में आपको कहा जाता है कि आपको प्रत्येक सेल के लिए स्वरूपित का अनुरोध करना है (उदाहरण के लिए

    oValue = Datagridview.rows(printRowIndex).Cells(printColumnIndex).FormattedValue) 
    

    !

  5. प्रिंटिंग करते समय आप जांच सकते हैं कि सेल स्वरूपण कर रहा है या नहीं। उदाहरण के लिए:

    if not oDataGridFormattingDictionary is nothing andalso oDataGridFormattingDictionary.ContainsKey(printRowIndex & "_" & printColumnIndex) Then 
    ... the cellstyle is accesible via: 
    oDataGridFormattingDictionary(printRowIndex & "_" & printColumnIndex) 
    end if 
    
  6. निर्यात या printcode के अंत में प्रबंधक को निकाल और कुछ भी नहीं करने के लिए शब्दकोश सेट

    RemoveHandler DirectCast(itemToPrint.TheControl, DataGridView).CellFormatting, AddressOf OnPrintDataGridView_CellFormatting 
    oDataGridFormattingDictionary = nothing 
    
1

अन्य उत्तर में बताया गया है, DataGridViewCell.FormattedValue तक पहुँचने के रूप में वास्तव में एक है एक विशिष्ट सेल के लिए CellFormatting ईवेंट (पुनः-) को बल देने के लिए आसान तरीका। हालांकि, मेरे मामले में, यह संपत्ति कॉलम के ऑटो-आकार बदलने से जुड़े अवांछित दुष्प्रभावों का भी कारण बन रही थी। एक व्यावहारिक समाधान के लिए लंबे समय तक खोज करते समय, मुझे अंततः निम्नलिखित जादू विधियों का सामना करना पड़ा जो पूरी तरह से काम करते हैं: DataGridView.Invalidate(), DataGridView.InvalidateColumn(), DataGridView.InvalidateRow(), और DataGridView.InvalidateCell()

ये 4 विधियां CellFormatting ईवेंट को निर्दिष्ट स्कोप (सेल, कॉलम, पंक्ति, या पूरी तालिका) के लिए फिर से कॉल करने के लिए मजबूर करती हैं, और बिना किसी ग़लत ऑटो-आकार बदलने वाली कलाकृतियों के भी।

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

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