पैनल। अन्य सेटिंग को अनदेखा करते हुए भरें


154

यदि आप एक फॉर्म पर एक पैनल बनाते हैं और इसे डॉक = टॉप पर सेट करते हैं और दूसरे पैनल को ड्रॉप करते हैं और इसका डॉक = फिल सेट करते हैं, तो यह पहले पैनल को अनदेखा करते हुए पूरे फॉर्म को भर सकता है। टैब ऑर्डर बदलने से कुछ नहीं होता है।

जवाबों:


335

डॉकिंग लेआउट सिबलिंग नियंत्रण के आदेश पर निर्भर करता है। नियंत्रण "बटन अप" डॉक किए जाते हैं, इसलिए संग्रह में अंतिम नियंत्रण पहले डॉक किया जाता है । डॉक किए गए नियंत्रण केवल पहले से डॉक किए गए भाई-बहनों के लेआउट को ध्यान में रखते हैं। इसलिए सिबलिंग ऑर्डर में डॉक = फिल के साथ नियंत्रण पहले (शीर्ष) होना चाहिए, यदि आप चाहते हैं कि यह अन्य डॉक किए गए नियंत्रणों को ध्यान में रखे। यदि यह पहला नियंत्रण नहीं है, तो पहले के नियंत्रण इसे ओवरलैप कर देंगे।

यह भ्रामक हो सकता है क्योंकि सिबलिंग-ऑर्डर जरूरी नहीं कि विज़ुअल ऑर्डर के समान हो, और सिबलिंग ऑर्डर हमेशा डिज़ाइन दृश्य से स्पष्ट नहीं होता है।

दस्तावेज़ रूपरेखा विंडो (देखें -> अन्य विंडोज -> दस्तावेज़ रूपरेखा) नियंत्रण पदानुक्रम और व्यवस्था पर एक उपयोगी पेड़-दृश्य देता है, और आप नियंत्रण के भाई क्रम बदलने के लिए अनुमति देता है।

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

नियत नियत नियंत्रणों के साथ, 2 डी स्थिति भाई के आदेश से स्वतंत्र होती है, लेकिन जब नियंत्रण अतिव्यापी हो जाता है, तो क्रम में जल्द से जल्द नियंत्रण "शीर्ष पर" होगा, भाई-बहन के हिस्से को बाद में क्रम में छिपाते हुए। इस संदर्भ में सामने लाओ / भेजें वापस समझ में आता है।

अंदर प्रवाह- या तालिका-लेआउट पैनल, निर्माण क्रम नियंत्रण के दृश्य क्रम को निर्धारित करता है। कोई अतिव्यापी नियंत्रण नहीं है। तो सामने लाओ / वापस भेजें वास्तव में इसका मतलब है कि नियंत्रण के क्रम में पहले या आखिरी करें।

डॉक किए गए लेआउट के साथ, सामने लाने / वापस भेजने के लिए और भी अधिक भ्रामक हो सकता है क्योंकि यह निर्धारित करता है कि डॉकिंग की गणना किस क्रम में की जाती है, इसलिए डॉक किए गए नियंत्रण पर "सामने लाएं" अभिभावक के मध्य में नियंत्रण को स्थापित करेगा खाते में सभी किनारे-डॉक किए गए नियंत्रणों को लेना।


1
मेरे पास एक पैनल, स्टेटस स्ट्रिप, और मेन्यू स्ट्रिप सभी एक फॉर्म में हैं और ऐसा लगता है कि जब मैं मेन्यू स्ट्रिप को ऊपर से डॉक करता हूं, तो स्टेटस स्ट्रिप को बॉटम पर, और पैनल को फिल करने के लिए, पैनल के बीच में जगह नहीं भरता है दो स्ट्रिप्स जब तक कि यह पहली सिबलिंग नहीं है (दो स्ट्रिप्स के ऊपर डॉक्यूमेंट आउटलाइन विंडो के शीर्ष पर)। पैनल को नीचे ले जाना ("अंतिम" की ओर) स्ट्रिप्स के ऊपर कवर होता है। तो क्या डॉक = भरण नियंत्रण वास्तव में आदेश में पहला भाई होना चाहिए? क्या मैं यह गलत पढ़ रहा हूँ? मैं 3.5 (2008) का उपयोग कर रहा हूं। क्या यह बदल गया?
jrsconfitto

53
tl; डॉ; Dock = Fill वाले पैनल पर राइट क्लिक करें और with फ्रंट टू फ्रंट ’पर क्लिक करें।
क्रिस्तिपांप

20
दस्तावेज़ आउटलाइन विंडो के लिए +1। कभी नहीं पता था कि यह अस्तित्व में है, फिर भी यह इतना उपयोगी है।
ग्लेगोरैन

2
मैं इसे कैसे प्रोग्राम कर सकता हूं? मेरा मतलब है, मैं नियंत्रणों को गतिशील रूप से जोड़ रहा हूं इसलिए मैं ऐसा करने के लिए डिजाइनर का उपयोग नहीं कर सकता।
कैमिलो मार्टिन

2
@ कैमिलो: यदि आप गतिशील रूप से नियंत्रण जोड़ते हैं, तो आपको उन्हें अपने इच्छित क्रम में जोड़ना चाहिए।
जैक्सबी

110

Dock = Fill वाले पैनल पर राइट क्लिक करें और with फ्रंट टू फ्रंट ’पर क्लिक करें।

यह इस नियंत्रण को अंतिम बनाता है, जो एक ही कंटेनर में अन्य नियंत्रणों पर डॉक सेटिंग्स को ध्यान में रखता है।


1
सिंपल, गॉडसेंड, यह वास्तव में मुझे परेशान कर रहा था
स्मरकिंगमैन

एक बार जब आप इसके बारे में सोचते हैं तो समझ में आता है।
गैरी किंडल

7

एक अन्य, संभावित क्लीनर विकल्प टेबललाइट कंट्रोल का उपयोग करना है। अपने शीर्ष डॉक के लिए वांछित ऊंचाई की एक पंक्ति सेट करें, और अपने नीचे के लिए 100% भरने के लिए एक और पंक्ति। फिल के अंदर दोनों पैनल सेट करें, और आप कर रहे हैं।

(TableLayout कुछ करने के लिए इस्तेमाल किया जा रहा है, हालांकि)


1
TableLayout लेआउट प्रदर्शन के लिए डॉकिंग कंटरोल्स की तुलना में भी धीमा है, खासकर यदि आपके पास नेस्ट्रोइंट्रोल्स हैं जो TableLayout का उपयोग करते हैं। हालाँकि, यह सुनिश्चित करने के लिए एक अच्छा लेआउट देता है।
निक

1
क्या यह प्रदर्शन कुछ ऐसा है जो एक औसत उपयोगकर्ता दो पैनलों के एक साधारण मामले में देखेगा, जैसा कि ऊपर वर्णित है? या यह कुछ ऐसा है जब वे दर्जनों यूसी, लेआउट के साथ, सभी एक लेआउट में देखते हैं? (विडंबना यह है कि वर्तमान में मैं जिस ऐप पर काम कर रहा हूं, वह ऐसा ही है, और प्रदर्शन ठीक लगता है ...)
जॉन रूडी

TableLayout बहुत हल्के वजन का है। यदि आप अभी कुछ नियंत्रण कर रहे हैं तो आपको प्रदर्शन समस्याएँ नहीं दिखेंगी।
टिम

7

मुझे एक ही समस्या है और मैं इसे हल करने में कामयाब रहा।
यदि आपके पास DockStyle.Fillदूसरों के साथ एक कंटेनर है , तो डॉकस्टाइल भी होना चाहिए लेकिन शीर्ष या जो आप चाहते हैं।
नियंत्रण के साथ जोड़ना महत्वपूर्ण बात है DockStyle.Fill पहले फिर दूसरों है।

उदाहरण:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

लेकिन अगर हम पहले सी.बी.

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.

2

यदि आप कोड के अंदर तत्वों के क्रम को बदलना नहीं चाहते हैं, तो आप कंटेनर कंटेनर विधि का उपयोग कर सकते हैं। कॉन्ट्रोल्स।सीटिलहिल्डेक्स () कंटेनर के साथ जैसे कि फॉर्म, पैनल आदि आप अपने नियंत्रणों को जोड़ना चाहते हैं।

उदाहरण:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;

1

दस्तावेज की रूपरेखा के साथ जैक्सबी का विचार था लेकिन पदानुक्रम ने मेरी समस्या का समाधान नहीं किया। मेरे नियंत्रण एक पदानुक्रमित शैली में नहीं थे, वे सिर्फ एक ही माता-पिता के साथ सूचीबद्ध थे।

मैंने सीखा है कि यदि आपने आदेश को बदल दिया है तो यह उस तरीके को ठीक कर देगा जैसे आप उसे देखना चाहते हैं।

सूची के निचले भाग पर नियंत्रण दस्तावेज़ की रूपरेखा विंडो में इसके शीर्ष पर नियंत्रण को ओवरलैप करेगा। आपके मामले में आप यह सुनिश्चित करेंगे कि पहला पैनल दूसरे पैनल के नीचे है और आगे है।


0

यहाँ एक चाल है कि मेरे लिए काम किया है ..

शीर्ष आइटम रखें और इसे शीर्ष डॉक करें।

एक स्प्लिटर रखें, और इसे शीर्ष पर डॉक भी करें, फिर इसे अक्षम करें (जब तक आप शीर्ष का आकार बदलना नहीं चाहते हैं)।

फिर Fill ऑब्जेक्ट रखें और Docking को Fill पर सेट करें। वस्तु फाड़नेवाला से नीचे रहेगी।


0

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

object.dock = Fill
Panel.Controls.Add(object)

0

मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन मैंने कुछ उपयोगी की खोज की। गतिशील रूप से बनाए गए नियंत्रण (ओं) के लिए सिबलिंग ऑर्डर को प्रोग्रामेटिक रूप से समायोजित करने के लिए, आप कुछ ऐसा कर सकते हैं:

parentForm.Controls.SetChildIndex (myPanel, 0) 

मेरे मामले में, मैंने अपने फॉर्म में पहला नियंत्रण होने के लिए डॉक / फिल पैनल को स्थानांतरित करने के लिए ऐसा किया ताकि यह डॉक / टॉप (एक मेनू स्ट्रिप) पर सेट किए गए दूसरे डॉक किए गए नियंत्रण के साथ ओवरलैप न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.