2010-12-22 26 views
5

मैं सूची के रूप में एक सूची दृश्य के साथ एक वृक्ष दृश्य का उपयोग कर रहा हूं। जब उपयोगकर्ता एक पंक्ति पर क्लिक करता है तो मैं कुछ क्रियाएं लेना चाहता हूं लेकिन कोशिकाओं में मानों का उपयोग नहीं करना चाहता, लेकिन डेटा का उपयोग करके मैंने पंक्ति बनाई ...GtkTreeView का सही उपयोग कैसे करें

वर्तमान में मेरे पास TreeView, TreeModel (ListStore) है और मेरे अपने डेटा (जो मैं विडंबना यह है कि मॉडल कहते हैं) ..

तो सवाल कर रहे हैं:

यह "सही" एक मॉडल के लिए है - डेटा की एक वस्तु प्रतिनिधित्व मैं प्रदर्शित करने और के साथ एक ListStore भरना चाहते हैं उस डेटा को ट्री व्यू में प्रदर्शित करने के लिए, या डेटा प्रदर्शित करने के लिए ट्रीमोडेल (मेरे डेटा-मॉडल को लपेटने) के अपने संस्करण को कार्यान्वित करना बेहतर होगा?

और यह भी:

अगर किसी एक पंक्ति में डबल-क्लिक मैं प्राप्त कर सकते हैं RowActivated घटना (का उपयोग करते हुए सी #/जीटीके #) जो सक्रिय पंक्ति करने के लिए एक पथ प्रदान करता है। इसके साथ में मैं एक वृक्ष प्राप्त कर सकता हूं और इसका उपयोग करके मैं एक सेल का मूल्य प्राप्त कर सकता हूं। लेकिन डेटा ऑब्जेक्ट को खोजने के लिए सबसे अच्छा अभ्यास क्या है जिससे पंक्ति पहली जगह बनाई गई थी? \ (किसी भी तरह से यह प्रश्न मुझे पहले के लिए मिला - सोचकर डेटा ऑब्जेक्ट को और आसान बनाना होगा अगर मैंने अपना कार्यान्वित करने की कोशिश की अपने TreeModel ...)

उत्तर

7

ट्रीमोडेल को लागू करने के लिए यह काफी अजीब/मुश्किल है, इसलिए अधिकांश लोग अपने "असली" मॉडल से डेटा को ट्रीस्टोर या लिस्टस्टोर में आसानी से सिंक करते हैं।

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

जब आप एक TreeView (विज़ुअल) कॉलम में सेलरेन्डरर जोड़ते हैं, तो आप इसके गुणों और स्टोर के कॉलम के बीच मैपिंग जोड़ सकते हैं। उदाहरण के लिए, आप एक स्टोर कॉलम को टेक्स्ट सेलरेन्डर के फ़ॉन्ट पर मैप कर सकते हैं, और एक ही स्टोर कॉलर उसी सेलरेन्डर की टेक्स्ट प्रॉपर्टी में मैप कर सकते हैं। प्रत्येक बार जब सेलरेन्डर का उपयोग किसी विशेष सेल को प्रस्तुत करने के लिए किया जाता है, तो मैपिंग का उपयोग स्टोर से मूल्यों को पुनर्प्राप्त करने के लिए किया जाएगा और इसे प्रस्तुत करने से पहले प्रस्तुतकर्ता के गुणों पर लागू किया जाएगा।

यहाँ एक मानचित्रण का एक उदाहरण है:

treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4); 

इस नक्शे की दुकान स्तंभ 0 editable संपत्ति को रेंडरर के text जीटीके संपत्ति और नक्शे की दुकान स्तंभ से 4। जीटीके संपत्ति के नामों के लिए आप GTK docs देख सकते हैं। ध्यान दें कि ऊपर दिया गया उदाहरण एक सुविधा विधि का उपयोग करता है जो एक कॉलम जोड़ता है, इसमें एक रेंडरर जोड़ता है और पैराम्स के माध्यम से मैपिंग की मनमानी संख्या जोड़ता है। सीधे कॉलम पर मैपिंग जोड़ने के लिए, उदाहरण के लिए एकाधिक रेंडरर वाले कॉलम, कॉलर में रेंडरर पैक करें, फिर TreeViewColumn.AddAttribute या TreeViewColumn.SetAttributes का उपयोग करें।

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

यहाँ एक डेटा समारोह है कि वास्तव में है क्या मानचित्रण उपरोक्त उदाहरण करता है की एक उदाहरण है:

treeColumn.SetCellDataFunc (renderer, delegate (TreeViewColumn col, 
    CellRenderer cell, TreeModel model, TreeIter iter) 
{ 
    var textCell = (CellRendererText) cell; 
    textCell.Text = (string) model.GetValue (iter, 0); 
    textCell.Editable = (bool) model.GetValue (iter, 4); 
}); 

जाहिर डेटा कार्यों कहीं अधिक शक्तिशाली है क्योंकि वे आप न केवल और अधिक जटिल जीटीके वस्तुओं के गुणों का उपयोग करने के लिए सक्षम हैं, लेकिन अधिक जटिल प्रदर्शन तर्क को लागू करने के लिए - उदाहरण के लिए, आलसी प्रसंस्करण केवल तभी प्राप्त होता है जब सेल वास्तव में प्रस्तुत किया जाता है।

+0

जानकारी के लिए धन्यवाद, मैंने अब सूची डेटा को अपने डेटा-ऑब्जेक्ट्स में से एक को पकड़ने के लिए संशोधित किया है और SetCellDataFunc के माध्यम से CellRenderer सेट किया है। क्या आप सेल रेन्डरर के स्टोर और गुणों के गुणों के बीच "मैपिंग" का उपयोग करने पर विस्तार कर सकते हैं? – Nils

+0

ठीक है, कुछ उदाहरण जोड़े गए :) –

+0

धन्यवाद, यह बहुत मदद करता है! – Nils