2011-11-10 16 views
5

मैं अपने एक्सेल ऐप को WPF डेटाग्रिड में स्थानांतरित करने का प्रयास कर रहा हूं। मैं कॉलम ए में डेटा दर्ज करने जा रहा हूं और कॉलम बी में मैं प्रीवीस सेल और ए कॉलम के वर्तमान सेल को लेने और गणना बी प्रीवियस सेल जोड़ने की गणना करना चाहता हूं। गणना उदाहरण: बी 2 = बी 1 + (ए 2-ए 1)। ऐसा करने का सबसे अच्छा तरीका क्या है?डेटाग्रिड गणना कॉलम

+0

हैंग पर। बस इसे पकड़ा। "पिछले सेल" से आपका मतलब पिछली * पंक्ति * पर है? –

+0

हां, उसी कॉलम की पिछली पंक्ति का सेल। वर्तमान पंक्ति 2 है, इसलिए सेल (बी 2) में मैं गणना करना चाहता हूं = बी 1 + (ए 2-ए 1) – Jim

उत्तर

4

व्यक्तिगत रूप से, मैं एक वर्ग है कि रिकॉर्ड का प्रतिनिधित्व करता है और उस वर्ग पर INotifyPropertyChanged लागू बनाने के द्वारा शुरू कर दूं।

public class recordObject : INotifyPropertyChanged 
{ 
    private int a; 
    public int A 
    { 
     get 
     { 
      return a; 
     } 
     set 
     { 
      a = value; 
      OnPropertyChanged("A"); 
     } 
    } 

    private int b; 
    public int B 
    { 
     get 
     { 
      return b; 
     } 
     set 
     { 
      b = value; 
      OnPropertyChanged("B"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

फिर, खिड़की पर पीछे अपने कोड में आप datagrid दिखा रहे हैं, तो आप सूची में प्रत्येक वस्तु पर PropertyChanged की सदस्यता के लिए चाहता हूँ। फिर जब भी वे गुण बदलते हैं तो आपको कॉलम मानों को मैन्युअल रूप से गणना करना होगा। आईक, मुझे पता है, लेकिन यह काम करेगा।

संपत्ति बदली हुई घटना दिखाई देगा:

void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    var objectList = DataGrid.ItemsSource as List<recordObject>; 
    var myRecord = sender as recordObject; 
    if (objectList != null && myRecord != null) 
    { 
     int idx = objectList.IndexOf(myRecord); 
     // Perform your calculations here using idx to access records before and after the current record 
     // making sure to check for list boundaries for top and bottom. 
     // Also note that this will likely kick off cascading event calls so make sure you're only changing 
     // the previous or following record object. 
    } 
} 

आप अपने बाध्य सूची में सभी रिकॉर्ड पर इस घटना को हुक है, तो यह जब भी किसी भी संपत्ति बदल गया है आग जाएगा। उपर्युक्त वर्ग में, यह ए और बी दोनों पर लागू होगा। आप e.PropertyName (एक साधारण स्ट्रिंग तुलना) के माध्यम से निगरानी में रुचि रखने वाले गुणों को फ़िल्टर कर सकते हैं और तदनुसार व्यवसाय तर्क को गेज कर सकते हैं। यदि आप encapsulation को बनाए रखना चाहते हैं, या कम से कम, ऑब्जेक्ट पर ऑब्जेक्ट के लिए व्यवसाय तर्क डाल दें, तो यह विधि क्लास रिकॉर्ड ऑब्जेक्ट पर एक स्थिर हो सकती है। आपको उस स्थैतिक विधि से डेटाग्रिड को पकड़ने के लिए प्रदान करना होगा, हालांकि (आपकी खिड़की पर एक स्थिर संपत्ति के माध्यम से)। तो:

public static void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e) 

और इतने जुड़े:

record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged); 
+0

वाह में जोड़ें, यह वास्तव में विस्तृत उत्तर धन्यवाद है। जहां तक ​​मुझे लगता है कि आपका उत्तर कॉलम बी के स्वचालित अपडेट पर केंद्रित है, जिसका स्वागत है लेकिन वर्तमान समय में नहीं। जो मैं अभी ढूंढ रहा हूं वह दृश्य के पीछे व्यापार तर्क है। – Jim

+0

क्या आप अधिक विशिष्ट हो सकते हैं, जिम? आपके प्रश्न में व्यवसाय तर्क के माध्यम से आपको जो कुछ मिला है वह बी 2 = बी 1 + (ए 2-ए 1) है। मैंने सोचा कि आपका प्रश्न अधिक सामान्य था इसलिए मुझे यकीन नहीं है कि आप क्या प्राप्त कर रहे हैं। –

+1

मैं इसे उत्तर के रूप में चिह्नित करूंगा, हालांकि मुझे आपके द्वारा सुझाई गई चीजों का अध्ययन करना है और बहुत सारी कोशिशें और इरॉस बनाना है :) – Jim

4

सबसे अच्छी बात यह है कि कक्षा में उस तर्क को लागू करना और ग्रिड को संबंधित गुणों में बांधना है। उदाहरण के लिए:

class SomeData 
{ 
    int A { get; set; } 
    int B { get; set; } 
    int AminusB { get { return A - B; } } 
} 
+1

यह सटीक समाधान पूरा करने की कोशिश करने के लिए काम नहीं करेगा। पिछले कुछडेटा पर ए और बी के मानों पर निर्भर करते समय बी को गणना करने के लिए कुछ डेटा के प्रत्येक उदाहरण को पिछले कुछ डेटा का संदर्भ होना होगा। –

+0

अच्छी पकड़, एडम। मैं भी अपने जवाब में याद किया था। –

+0

धन्यवाद, मैंने बिना किसी समस्या के एक ही पंक्ति पर गणना करने के लिए अपना समाधान (निक और जैकब) लागू किया है। हालांकि मैं अभी भी समझ नहीं पा रहा हूं कि पिछली पंक्ति सेल कैसे प्राप्त करें और इसे वर्तमान पंक्ति के सेल बी 2 = बी 1 + (ए 2-ए 1) – Jim

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