मैं कुछ के लिए एक छवि कैसे सेट करूं लेकिन TreeView में सभी नोड्स कैसे नहीं?

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

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

0
क्या आप निर्दिष्ट कर सकते हैं कि यह किसी वेब या Winforms ऐप में उपयोग किया जाता है, कृपया?
जोड़ा लेखक splattne, स्रोत
हो गया - Winforms।
जोड़ा लेखक Simon, स्रोत
स्वीकृत उत्तर नीचे ऑस्ट्रेलियाई एश द्वारा किया जाना चाहिए। परीक्षण किया, और यह काम करता है।
जोड़ा लेखक erict, स्रोत

6 उत्तर

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

यदि आप दोनों 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

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

0
जोड़ा
Thats क्योंकि TreeView.ImageIndex Setter में यह शामिल है (मैंने ILSpy का उपयोग किया): यदि (value == -1) value = 0; अगर (मान <0) नया ArgumentOutOfRangeException ("ImageIndex", SR.GetString ("InvalidLowBoundArgumentEx", नया फेंक दें वस्तु [] { "ImageIndex", value.ToString (CultureInfo.CurrentCult और जेडडब्ल्यूएनजे; ure), 0.ToString (कल्ट और जेडडब्ल्यूएनजे; ureInfo.CurrentCultu और जेडडब्ल्यूएनजे; फिर से)})); ....
जोड़ा लेखक toong, स्रोत
बस एक रिक्त 1 पिक्सेल x 1 पिक्सेल आइकन शामिल करें और उन नोड्स को लोड करें जिन्हें आप आइकन नहीं चाहते हैं।
जोड़ा लेखक John Lamberis, स्रोत

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

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

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

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

0
जोड़ा
क्या यह कहीं एमएस द्वारा दस्तावेज है? मैं इस तरह की तकनीक का उपयोग करके सतर्क रहूंगा जैसा कि ऐसी चीज की तरह लगता है जो ढांचे के भविष्य के संस्करणों में संगत नहीं रखा जा सकता है।
जोड़ा लेखक Martin Brown, स्रोत
अदृश्य नोड्स बहुत उपयोगी नहीं हैं। यदि पाठ है, तो आप देखेंगे कि छवि के लिए स्थान अभी भी आरक्षित, खाली है या नहीं।
जोड़ा लेखक Eugene Ryabtsev, स्रोत
मुझे लगता है कि यह स्वीकार्य उत्तर होना चाहिए :)
जोड़ा लेखक Joey Novak, स्रोत

यह TreeNode टेक्स्ट खींचा जाएगा जहां छवि होनी चाहिए, सफेद स्थान से छुटकारा पाएं।

आपको TreeView की DrawMode प्रॉपर्टी OwnDrText पर सेट करने की आवश्यकता होगी। आप प्रॉपर्टी पैनल में 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
जोड़ा
काफी काम नहीं करता है। चयन अभी भी इसके मूल स्थान पर खींचा गया है (चित्रों के बिना नोड्स के दायीं तरफ से दाएं)।
जोड़ा लेखक Eugene Ryabtsev, स्रोत
आपके उत्तर ने मेरी मदद की, लेकिन मैंने तर्क को पूरा किया। यह सिर्फ Bounds.Left है जिसे आपको व्हाइटस्पेस को छिपाने के लिए हेरफेर करने की आवश्यकता है।
जोड़ा लेखक Darren Hale, स्रोत

मैंने जो किया है वह उन TreeView नोड्स के लिए बिंदुओं की एक छवि का उपयोग करना है, जिनके पास छवि नहीं है।

TreeNode with image dots

I add this image as the last image in the list, and if the item is not supposed to have an image I set it to ImageList.Images.Count-1

0
जोड़ा
मुझे नहीं लगता कि आपके पास यह छवि कहीं है? :-)
जोड़ा लेखक Gary Ewan Park, स्रोत
यही वह है जो मैं कर रहा था, अगर आप चारों ओर झूठ बोल रहे थे तो बस आलसी हो रहा था :-)
जोड़ा लेखक Gary Ewan Park, स्रोत
एक स्क्रीन शॉट लें और अपने उद्देश्य के अनुरूप इसे संशोधित करें
जोड़ा लेखक MtnManChris, स्रोत
भविष्य के संदर्भ के लिए, मैंने इसे करने के लिए निर्देशों और एक छवि (16x16) के साथ थोड़ा गिटहब प्रोजेक्ट बनाया: github.com/cmbankester/tree-view-no-image-dots/blob/mas‌ ter/& hellip;
जोड़ा लेखक Christian Bankester, स्रोत

हे भाई, मुझे एक रास्ता मिला। पहली छवि को खाली छवि के रूप में सेट करें, इस तरह ...

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

तो, सूचकांक 0 एक खाली छवि है। आशा है कि ये आपकी मदद करेगा

0
जोड़ा

मैंने पाया कि ImageList के बजाय TreeView पर StateImageList का उपयोग केवल छवि दिखाएगा जब TreeIode पर StateImageIndex 0 से बराबर या अधिक है

0
जोड़ा
यह पूरी तरह से अच्छी तरह से काम कर रहा है।
जोड़ा लेखक Jason Ching, स्रोत