2008-11-04 16 views
19

मेरे पास TreeView विंडोज़ ImageList के साथ नियंत्रण करता है, और मैं कुछ नोड्स छवियों को प्रदर्शित करना चाहता हूं, लेकिन दूसरों के पास छवियां नहीं हैं।मैं कुछ के लिए एक छवि कैसे सेट करूं लेकिन TreeView में सभी नोड्स कैसे नहीं?

I एक रिक्त स्थान चाहते हैं जहां छवि होनी चाहिए। I कोई ऐसी छवि नहीं है जो उस छवि की तरह दिखती है जो TreeView खींचेगी यदि उसके पास छविसूची नहीं है। मैं कुछ वस्तुओं के लिए छवियों को आकर्षित करने के लिए कैसे प्राप्त करूं, न कि दूसरों को, इस तरह बेकार हैक्स का उपयोग किए बिना?

+0

आपके द्वारा निर्दिष्ट किया जा सका बराबर या अधिक है में मदद करता है Winforms ऐप, कृपया? – splattne

+0

हो गया - Winforms। – Simon

उत्तर

7

मैंने इसे एक बार कोशिश की और मुझे नहीं लगता कि यह संभव है।

तुम दोनों ImageKey और ImageIndex सेट करने के लिए "सेट नहीं" के लिए मान नियंत्रण बस चूक ImageIndex 0. के लिए निम्न कोड का प्रयास करें:

treeView.ImageKey = "Value"; 
Debug.WriteLine(treeView.ImageIndex); 
treeView.ImageKey = null; 
Debug.WriteLine(treeView.ImageIndex); 
treeView.ImageIndex = -1; 
Debug.WriteLine(treeView.ImageIndex); 

उत्पादन उत्पादन:

-1 
0 
0 

इस तरह की आपको बताता है कि नियंत्रण डेवलपर्स यह सुनिश्चित करना चाहते थे कि हमेशा एक डिफ़ॉल्ट छवि होती। यह आपको हैक विकल्पों के साथ छोड़ देता है मुझे डर है।

+1

Thats क्योंकि TreeView.ImageIndex Setter में यह शामिल है (मैंने ILSpy का उपयोग किया): यदि (value == -1) value = 0; अगर (मान <0) नया ArgumentOutOfRangeException ("ImageIndex", SR.GetString ("InvalidLowBoundArgumentEx" फेंक देता है, नई वस्तु [] {"ImageIndex", value.ToString (CultureInfo.CurrentCulture), 0.ToString (CultureInfo.CurrentCulture)}); .... – toong

+0

बस रिक्त 1 पिक्सेल x 1 पिक्सेल आइकन शामिल करें और उन नोड्स को लोड करें जिन्हें आप आइकन नहीं चाहते हैं। –

12

आपको ImageIndex और SelectedImageIndex को अपने ImageList में मानों की संख्या से अधिक संख्या में सेट करने की आवश्यकता है। उदाहरण के लिए, अगर आप इस नोड बनाते हैं और अपने TreeView में जोड़ें:

TreeNode node1 = new TreeNode(string.Empty, 12, 12); // imageList1.Count = 5 

आप एक अदृश्य TreeNode अपने TreeView में डाला होगा। मैंने अपने TreeView का पृष्ठभूमि रंग बदल दिया और यह अभी भी अदृश्य था।

(मैं कुछ समय के लिए इस googled, और मैं अंत में जवाब मिला: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.windowsforms/2006-09/msg00322.html)

+2

क्या यह एमएस द्वारा कहीं दस्तावेज है? मैं इस तरह की तकनीक का उपयोग करके सतर्क रहूंगा जैसा कि ऐसी चीज की तरह लगता है जो ढांचे के भविष्य के संस्करणों में संगत नहीं रखा जा सकता है। –

+1

अदृश्य नोड्स बहुत उपयोगी नहीं हैं। यदि पाठ है, तो आप देखेंगे कि छवि के लिए स्थान अभी भी आरक्षित, खाली है या नहीं। –

+0

मुझे लगता है कि यह स्वीकार्य उत्तर होना चाहिए :) –

2

यह TreeNode पाठ जहां छवि, किया जाना चाहिए था सफेद स्थान से छुटकारा पाने आकर्षित करेगा।

आपको TreeView की DrawMode संपत्ति OwnerDrawText पर सेट करने की आवश्यकता होगी। आप गुण पैनल में DrawMode संपत्ति पा सकते हैं।

अगला जब आप कोई नोड जोड़ते हैं, तो इसे ImageIndex और SelectedImageIndex अपने yourImageListName.Images.Count मान के मान से अधिक सेट करें। ऐसा इसलिए है कि कोई छवि खींची नहीं जाएगी, लेकिन फिर भी वह सफेद जगह होगी जो आप नहीं चाहते हैं।

अब सफेद स्थान से छुटकारा पाने के लिए। वृक्षदृश्य DrawNode घटना के लिए एक हैंडल जोड़ें। यह वृक्षदृश्य संपत्ति पैनल पर जाकर और पैनल में आइकन पर क्लिक करके किया जा सकता है जो प्रकाश बोल्ट की तरह दिखता है, फिर जब तक आप DrawNode टेक्स्ट को तब तक स्क्रॉल करें, इसे डबल क्लिक करें।

अब आप बस कॉपी और बनाया विधि

if (e.Node.ImageIndex >= e.Node.TreeView.ImageList.Images.Count) // if there is no image 
{ 
    int imagewidths = e.Node.TreeView.ImageList.ImageSize.Width; 
    int textheight = TextRenderer.MeasureText(e.Node.Text, e.Node.NodeFont).Height; 
    int x = e.Node.Bounds.Left - 3 - imagewidths/2; 
    int y = (e.Bounds.Top + e.Bounds.Bottom)/2+1; 

    Point point = new Point(x - imagewidths/2, y - textheight/2); // the new location for the text to be drawn 

    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, point, e.Node.ForeColor); 
} 
else // drawn at the default location 
    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.TreeView.Font, e.Bounds, e.Node.ForeColor); 
+0

काफी काम नहीं करता है। चयन अभी भी इसके मूल स्थान पर खींचा गया है (चित्रों के बिना नोड्स के दायीं तरफ से दाएं)। –

+0

आपके उत्तर ने मेरी मदद की, लेकिन मैंने तर्क को पूरा किया। यह सिर्फ 'बाउंड्स' लेफ्ट 'है जिसे आपको व्हाइटस्पेस को छिपाने के लिए हेरफेर करने की आवश्यकता है। –

9

मुझे क्या करना उन TreeView नोड्स एक छवि के लिए नहीं जा सकते के लिए डॉट्स की एक छवि का उपयोग करने के लिए है चुना है पेस्ट करें।

TreeNode with image dots

मैं सूची में अंतिम छवि के रूप में इस छवि को जोड़ने के लिए, और यदि आइटम एक छवि मैं इसे ImageList.Images.Count-1

+0

मुझे नहीं लगता कि आपके पास यह छवि कहीं है? :-) –

+1

एक स्क्रीन शॉट लें और अपने उद्देश्य के अनुरूप इसे संशोधित करें – MtnManChris

+0

यही वह है जो मैंने किया है, अगर आप चारों ओर झूठ बोल रहे थे तो बस आलसी हो :-) –

1

करने के लिए सेट हेई भाई है माना जाता नहीं है, मैं एक रास्ता मिल गया। , एक खाली छवि के रूप में पहली छवि सेट इस तरह ...

TreeView treeView = new TreeView(); 
treeView.ImageList.Images.Add(new Bitmap(1,1)); 

तो, सूचकांक 0 एक खाली छवि है। मुझे आशा है कि इस

2

मैंने पाया कि ImageList के बजाय TreeView पर StateImageList का उपयोग कर केवल छवि प्रदर्शित करेगा जब StateImageIndex TreeNode पर अगर यह या एक वेब में प्रयोग किया जाता है की तुलना में 0

+0

यह पूरी तरह से अच्छी तरह से काम कर रहा है। –

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