c# - Label in UserControl (Winforms) don't show -


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

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

इंटरफ़ेस और सहायक वर्ग

  सार्वजनिक इंटरफ़ेस IKindForm {शून्य प्रदर्शन टेक्स्ट (DisplayText t); } सार्वजनिक श्रेणी के डिस्प्ले टेक्स्ट {सार्वजनिक स्ट्रिंग पाठ {get; संरक्षित सेट; } सार्वजनिक फ़ॉन्ट फ़ॉन्ट {get; संरक्षित सेट; } सार्वजनिक ब्रश ब्रश {प्राप्त करें; संरक्षित सेट; } सार्वजनिक बिंदु बिंदु {प्राप्त करें; संरक्षित सेट; } सार्वजनिक डिस्प्ले टेक्स्ट (स्ट्रिंग टेक्स्ट, फ़ॉन्ट फ़ॉन्ट, रंग का रंग, int x, int y) {text = text; फ़ॉन्ट = फ़ॉन्ट; ब्रश = नया सॉलिडब्रश (रंग); बिंदु = नया बिंदु (एक्स, वाई); }}  

इंटरफ़ेस और ओवरराइड ऑन-पेन्ट लागू करने वाले रूप में विधि

  निजी सूची & lt; DisplayText & gt; TextsToDisplay = नई सूची & lt; DisplayText & gt; (); सार्वजनिक व्यर्थ डिस्प्ले टेक्स्ट (डिस्प्लेटेक्स्ट टी) {यदि (टेक्सट्सटीओडिसप्ले.संगत (टी)) रिटर्न; टेक्सटटोडडिस्क। जोड़ें (टी); अमान्य (); } सुरक्षित ओवरराइड शून्य OnPaint (PaintEventArgs ई) {foreach (textsToDisplay में डिस्प्ले टेक्स्ट) e.Graphics.DrawString (t.ext, t.font, t.Brush, t.Point); आधार। OnPaint (ई); }  

और अंत में, यूज़र कंट्रोल में कोड

  bool labelRegistered = false; सुरक्षित ओवरराइड शून्य OnPaint (PaintEventArgs ई) {int textStart = 0; SizeF ssize = नया आकार एफ (0, 0); अगर (लेबल टेक्स्ट! = नल & amp; लेबल टेक्स्ट! = स्ट्रिंग.एप्टी) {ssize = e.Graphics.MeasureString (लेबल टेक्स्ट, लेबलफॉन्ट); पाठस्टार्ट = (इंट) ssize.Width; } यदि (ssize.Width & gt; 0) {यदि (यह.TopLevelControl IKindForm है) {यदि (! LabelRegistered) {int yPos = this.Location.Y + मार्जिन + ComboText.Size.Highight / 4; Int xPos = this.Location.X - (पाठस्टार्ट + लेबलऑफ़सेट); (IKindForm) this.TopLevelControl)। प्रदर्शन पाठ (नया डिस्प्ले टेक्स्ट (लेबल टेक्स्ट, लेबलफॉन्ट, लेबल कॉलर, एक्सपीएस, yPos)); }} LabelRegistered = true; }  

केवल दोष यह है कि जब डिजाइनर में, TopLevelControl IKindForm एक नहीं है, तो आप "लेबल" नहीं देख सकते हैं।


Comments

Popular posts from this blog

sqlite3 - UPDATE a table from the SELECT of another one -

c# - Showing a SelectedItem's Property -

javascript - Render HTML after each iteration in loop -