2009-10-02 10 views
7

आप चांदी की रोशनी डेटाग्रिड पंक्तियों का रंग कैसे बदलते हैं ?!सी # सिल्वरलाइट डाटाग्रिड - पंक्ति रंग बदलें

मैं इस की कोशिश की है, लेकिन यह काम करने के लिए मैं इसे कैसे ... करने के लिए रैंडम पंक्तियों को गलत ढंग से रंग मिल चाहते प्रतीत नहीं होता:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      var c = e.Row.DataContext as Job; 
      if (c != null && c.Status.Contains("complete")) 
       e.Row.Background = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Background = new SolidColorBrush(Colors.Red); 
     } 
+0

मैं इस कोड के साथ अपने संभव हो बेतरतीब ढंग से रंग करने के लिए पंक्तियों में नहीं सोचता - लेकिन यह संभव है यदि आप हमेशा निर्धारित नहीं करते हैं एक पृष्ठभूमि रंग - –

उत्तर

6

माइक्रोसॉफ्ट प्रलेखन:

प्रदर्शन में सुधार करने के लिए, EnableRowVirtualization संपत्ति डिफ़ॉल्ट रूप से सही पर सेट है। जब EnableRowVirtualization प्रॉपर्टी सत्य पर सेट की जाती है, तो डेटाग्रिड के लिए डेटाग्रिडरो ऑब्जेक्ट को बाध्य डेटा स्रोत में प्रत्येक डेटा आइटम को तत्काल नहीं करता है। इसके बजाए, डेटाग्रिड डेटाग्रिडरो ऑब्जेक्ट्स केवल तभी प्राप्त करता है जब उन्हें आवश्यकता हो, और उन्हें कर सकते हैं। उदाहरण के लिए, डेटाग्रिड प्रत्येक डेटा आइटम के लिए डेटाग्रिडरो ऑब्जेक्ट बनाता है जो वर्तमान में दृश्य में है और जब यह दृश्य को स्क्रॉल करता है तो पंक्ति को पुन: उपयोग करता है।

स्रोत: http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

इस व्यवहार आप

अनुभव कर रहे हैं बताते हैं उचित (हालांकि नहीं आसान मैं मानता) समाधान किया जा रहा है, इसलिए, शैली आप था अनसेट करने के लिए UnloadingRow घटना उपयोग करने के लिए सेट।

3

मैं इस के बाद किया गया था:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      DataGridRow row = e.Row; 
      var c = row.DataContext as Job;   
      if (c != null && c.Status.Contains("omplete")) 
       e.Row.Foreground = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Foreground = new SolidColorBrush(Colors.Red); 
     } 
+0

नीचे मेरा उत्तर देखना यह आपके लिए काम करता है, आपको इसे उत्तर के रूप में स्वीकार करना चाहिए। – kersny

+0

मुझे नहीं लगता कि यह चीजों को कैसे ठीक करता है। जब तक कोई स्पष्ट समस्या प्रस्तुत नहीं की जा सकती है, तो इस पूरे प्रश्न को हटा दिया जाना चाहिए। – AnthonyWJones

+0

@Kersny 2 दिनों के लिए अपना जवाब स्वीकार नहीं कर सकता। @ एंथनीजोन, आपके जैसे लोग मुझे परेशान करते हैं, बड़े हो जाते हैं। – Goober

5

मेरे पास यह वही मुद्दा था और इसे कम से कम परीक्षण और कुछ कटौतीत्मक तर्क देने के बाद पता चला!

मूल रूप से समाधान हमेशा आप पृष्ठभूमि रंग (या वास्तव में किसी भी शैली) सेट करना है। पंक्ति स्टाइल के लिए कोई भी डिफ़ॉल्ट मान न लें। मैं सफेद का एक डिफ़ॉल्ट मान रहा था - जो उचित धारणा है लेकिन वास्तव में यह मामला नहीं था।

अधिक विवरण:

ऐसा लगता है कि क्रम की तरह पंक्ति वर्ग के उदाहरण पुनः उपयोग कर लेता जब एकाधिक पंक्तियों प्रतिपादन। मैंने यह बिल्कुल सत्यापित नहीं किया है, लेकिन ऐसा लगता है कि ऐसा होने वाले लक्षणों से निर्णय लेना चाहिए।

मेरे पास केवल एक या दो पंक्तियां थीं जिन्हें अलग-अलग रंगीन होना चाहिए। ऊपर और नीचे स्क्रॉल करते समय मैं यादृच्छिक रूप से रंगीन पंक्तियां देख रहा था।

यहां मेरी टेस्ट क्लास है। प्रत्येक पांचवीं पंक्ति लाल और इटालिक माना जाता है।

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

जैसा कि मैंने उपरोक्त कहा है कि समाधान हमेशा डिफ़ॉल्ट के लिए शैलियों को निर्दिष्ट करना है और किसी भी डिफ़ॉल्ट को मानना ​​नहीं है।

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person() 
     { 
      FirstName = "John", 
      LastName = "Smith", 
      ID = x, 
      Delinquent = (x % 5 == 0)  // every fifth person is 'delinquent' 
     }); 
    } 

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var person = (Person)e.Row.DataContext; 

     if (person.Delinquent) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      // e.Row.Background = new SolidColorBrush(Colors.Green); 
      // e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      // e.Row.FontStyle = FontStyles.Normal; 
     } 

    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int ID { get; set; } 
     public bool Delinquent { get; set; } 
    } 
} 
0

ऐसा करने का सबसे अच्छा तरीका है अपने डेटाग्रिड पर रोस्टाइल को बदलना। इसके लिए बहुत सारे xaml की आवश्यकता है, लेकिन आप इसे here से कॉपी कर सकते हैं और इसमें कुछ शैलियों को बदल सकते हैं।

इसके अलावा, यदि आपको पंक्ति डेटा के आधार पर पंक्ति रंग बदलने की आवश्यकता है, तो आप शैली में ब्रशिंग को अपने डेटा पर ब्रश प्रॉपर्टी में जोड़ सकते हैं।

उन्होंने प्रतिबिंबक खोला और SystemGindows.Controls.Data.dll से डेटाग्रिड के लिए जेनेरिक.एक्सएएमएल लिया, और फिर इसे बदलने के लिए कुछ नया xaml लिखा।

0

यह मेरे लिए काम करता है। =)

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var row = e.Row.GetIndex(); 
     if (row % 2 == 0) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      e.Row.Background = new SolidColorBrush(Colors.Green); 
      e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      e.Row.FontStyle = FontStyles.Normal; 
     } 
    } 
संबंधित मुद्दे