2008-12-03 9 views
19

मैं डेटाग्रिड व्यू में एक सूची बाध्य कर रहा हूं। SomeObject क्लास की एक संपत्ति एक स्टेटस कोड (उदा। लाल, पीला, हरा) होगा। क्या मैं आसानी से सेल के पृष्ठभूमि रंग की स्थिति को "बांध" सकता हूं? टूलटिप को बाध्य करने के बारे में भी?डेटाग्रिड व्यू को बाध्यकारी - क्या सेल के पृष्ठभूमि रंग को "बांधने" का कोई तरीका है?

+0

मुझे उम्मीद है कि आपको इसका उत्तर मिल जाएगा, और यह संभव है, मैं इसे समझने में असमर्थ हूं, मैंने प्रत्येक सेल शैली को बदलकर डेटाबेस के बाद पृष्ठभूमि रंग सेट किया है। दुर्भाग्य से यह वास्तव में धीमा है :(डेटाग्रिडव्यू 1। पंक्तियां [1] .ल्स [2]। स्टाइल। बैककॉलर = रंग। रेड –

उत्तर

35

आप पृष्ठभूमि रंग को अनुकूलित करने के लिए डेटाग्रिड व्यू के सेलफॉर्मेटिंग ईवेंट के लिए हैंडलर लिख सकते हैं। यहाँ एक काम उदाहरण है (यदि आप एक हैंडलर बनाने के लिए डिफ़ॉल्ट प्रपत्र तो CellFormatting घटना पर डबल-क्लिक पर एक DataGridView खींची करने की आवश्यकता होगी):

using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private BindingSource _source = new BindingSource(); 

     public Form1() 
     { 
      InitializeComponent(); 

      _source.Add(new MyData(Status.Amber, "Item A")); 
      _source.Add(new MyData(Status.Red, "Item B")); 
      _source.Add(new MyData(Status.Green, "Item C")); 
      _source.Add(new MyData(Status.Green, "Item D")); 

      dataGridView1.DataSource = _source; 
      dataGridView1.Columns[0].Visible = false; 
     } 

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
     { 
      if (e.ColumnIndex == 1) 
      { 
       DataGridView dgv = sender as DataGridView; 
       MyData data = dgv.Rows[e.RowIndex].DataBoundItem as MyData; 

       switch (data.Status) 
       { 
        case Status.Green: 
         e.CellStyle.BackColor = Color.Green; 
         break; 
        case Status.Amber: 
         e.CellStyle.BackColor = Color.Orange; 
         break; 
        case Status.Red: 
         e.CellStyle.BackColor = Color.Red; 
         break; 
       } 
      } 
     } 
    } 

    public class MyData 
    { 
     public Status Status { get; set; } 
     public string Text { get; set; } 

     public MyData(Status status, string text) 
     { 
      Status = status; 
      Text = text; 
     } 
    } 

    public enum Status 
    { 
     Green, 
     Amber, 
     Red 
    } 
} 

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

वास्तव में चित्रकला करने के लिए, हम सेलफॉर्मेटिंग घटना का जवाब देते हैं। हमें प्रेषक को कास्ट करके डेटाग्रिड व्यू का संदर्भ मिलता है, फिर डेटाग्रिड व्यूफेलफॉर्मिंगिंगवेंटवेंट ऑब्जेक्ट की रोविंडेक्स प्रॉपर्टी का उपयोग डेटा आइटम पर प्राप्त करने के लिए करें (प्रत्येक पंक्ति में डेटाबाउंड इटैम प्रॉपर्टी है जो आसानी से हमें यह देती है)। चूंकि DataBoundItem एक ऑब्जेक्ट प्रकार है, इसलिए हमें इसे अपने विशिष्ट प्रकार पर डालना होगा, फिर हम वास्तव में स्थिति संपत्ति को प्राप्त कर सकते हैं ... phew!

मुझे टूलटिप प्रोग्रामिंग के साथ कोई अनुभव नहीं मिला है, लेकिन मैंने सोचा होगा कि आपको MouseHover ईवेंट का जवाब देना चाहिए, फिर यह पता लगाने पर काम करें कि किस पंक्ति को शुरू करने के लिए इंगित किया जा रहा है।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

अच्छा जवाब - धन्यवाद। – xyz

+1

+1, शानदार उत्तर। मैंने पाया कि आखिरी पंक्ति एक खाली पंक्ति थी, इसलिए यह जांचना था कि माईडाटा शून्य था या नहीं। इसके अलावा, बढ़िया! – Russell

+0

यह बहुत अच्छा काम करता है, केवल सवाल यह है कि सेल के बजाय एक समय में इस पंक्ति को करने का कोई तरीका है या नहीं। बस सोच रहा है कि आपके पास कोई प्रदर्शन है या नहीं 1000+ पंक्तियां, 10+ कॉलम। – Sint

2

बॉक्स के बाहर, किसी भी डेटाग्रिड व्यू कॉलम डेटासॉर में ऑब्जेक्ट्स की केवल एक संपत्ति के लिए बाध्य किया जा सकता है, प्रत्येक डेटाग्रिड व्यू कॉलम के डेटाप्रॉपर्टी नाम द्वारा दी जा रही संपत्ति का नाम (आपके पास विशिष्ट कॉलम प्रकार होंगे: DataGridViewTextBoxColumn, ...)।

डाटाबेस आइटम के आधार पर सेल की शैली बदलने के लिए आप DataGridView.CellFormatting ईवेंट का उपयोग कर सकते हैं। इस घटना के DataGridViewCellFormattingEventArgs में आपको पंक्ति अनुक्रमणिका मिलती है, वहां से आप वर्तमान ऑब्जेक्ट (पंक्ति का स्रोत) प्राप्त कर सकते हैं। वहां से, आप अपने सेल को प्रभावित करने के लिए ऑब्जेक्ट की किसी भी प्रॉपर्टी का उपयोग कर सकते हैं।

एक अच्छा प्रारंभिक बिंदु (समान विचार): here

एक दूसरा विचार अपनी खुद की DataGridViewColumn प्रकार के विकास और अन्य बातों के आप के लिए बाध्य करने की जरूरत के लिए गुण जोड़ सकता हूँ होगा। उदाहरण के लिए, उसी तरह से इसे DataPropertyName में बनाया गया है, आप अपना खुद का जोड़ सकते हैं: BackgroundColorPropertyName। कस्टम DataGridViewColumns के निर्माण के लिए एक प्रारंभिक बिंदु here पाया जा सकता है।

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