2009-01-08 14 views
11

के भीतर नियंत्रणों की पुनरावृत्ति मुझे सी # Winform एप्लिकेशन में flowlayoutPanel का उपयोग करने में समस्या हो रही है। मेरे पास मूल रूप से एक प्रवाह लेआउट पैनल है जिसमें 3 अनुभाग हैं।प्रवाह लेआउट पैनल

धारा # 1 2 नियंत्रण .. दो लटकती नियंत्रणों का एक सेट है, वे सभी उदाहरणों

धारा # 2 5 अलग नियंत्रणों का एक सेट है में दिखाई दे उसी क्रम में हमेशा से रहे हैं, हमेशा ... आधारित कारकों की एक श्रृंखला पर, 5 नियंत्रणों में से 1 दिखाई देता है, अन्य सभी के पास दृश्यमान गुण झूठे

अनुभाग # 3 3 नियंत्रणों का एक सेट है .. जैसे अनुभाग # 1 वे हमेशा एक ही क्रम में होते हैं और हमेशा दिखाई देता है।

तो यह क्या उबलता है कि धारा # 2 परिवर्तनीय है, अन्य स्थिर हैं।

समस्या अनुभाग # 2 के साथ आता है ... जब मैं किसी भी नियंत्रण की दृश्यता को बदलता हूं तो वे ठीक दिखाई देते हैं (आईई ... धारा 1 तब धारा 2 तब धारा 3) ... जब मैं सेट करता हूं कम्बोबॉक्स नियंत्रण दृश्यमान होना .... उस मामले में, और केवल उस मामले में .. आदेश बन जाता है (धारा 1 तब धारा 3 तब धारा 2) ... मैं यह नहीं समझ सकता कि ऑर्डरिंग का कारण क्या होगा बस उस मामले में सिंक की।

जो मैं मूल रूप से अपनी विधि की शुरुआत में करता हूं वह सभी नियंत्रणों को दृश्यमान = झूठी पर सेट करता है ... फिर मैंने धारा 1 दृश्यमान = सत्य सेट किया है ... फिर अनुभाग 2 की शर्तों के माध्यम से लूप करें और उपयुक्त नियंत्रण दृश्यमान सेट करें = सत्य और आखिरकार धारा 3 को दृश्यमान = सत्य सेट करें।

क्या किसी को प्रवाह लेआउट पैनल नियंत्रण आदेश के साथ कोई अनुभव है? मैं यह नहीं समझ सकता कि कॉम्बोबॉक्स के लिए क्या हो रहा है।

उत्तर

5

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

26

FlowLayoutPanel.Controls के अंदर SetChildIndex (Control c, int अनुक्रमणिका) नामक एक विधि फ़ंक्शन है जो आपको किसी ऑब्जेक्ट को किसी विशिष्ट अनुक्रमणिका पर सेट करने की अनुमति देता है।

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

यहाँ एक flowlayoutpanel में पुन: क्रम PictureBoxes की मेरी blog से स्निपेट है

// एक Winform पर FlowLayoutPanel जोड़ने - flowLayoutPanel1

public partial class TestForm: Form 
{ 
     public TestForm() 
     { 
      InitializeComponent(); 
      this.flowLayoutPanel1.AllowDrop = true 
     } 
     private void AddImageToBlog(System.Drawing.Image image) 
     { 
      PictureBox pbox = new PictureBox(); 
      pbox.SizeMode = PictureBoxSizeMode.Zoom;    
      pbox.Height = (_picturebox_height * _ScaleFactor); 
      pbox.Width = (_picturebox_width * _ScaleFactor); 
      pbox.Visible = true; 
      pbox.Image = image; 

      pbox.MouseDown += new MouseEventHandler(pbox_MouseDown); 
      pbox.DragOver += new DragEventHandler(pbox_DragOver);    
      pbox.AllowDrop = true; 
      flpNewBlog.Controls.Add(pbox); 
     } 
     void pbox_DragOver(object sender, DragEventArgs e) 
     { 
      base.OnDragOver(e); 
      // is another dragable 
      if (e.Data.GetData(typeof(PictureBox)) != null) 
      { 
       FlowLayoutPanel p = (FlowLayoutPanel)(sender as PictureBox).Parent;     
       //Current Position    
       int myIndex = p.Controls.GetChildIndex((sender as PictureBox)); 

       //Dragged to control to location of next picturebox 
       PictureBox q = (PictureBox) e.Data.GetData(typeof(PictureBox));     
       p.Controls.SetChildIndex(q, myIndex); 
      }   
     } 
     void pbox_MouseDown(object sender, MouseEventArgs e) 
     { 
      base.OnMouseDown(e); 
      DoDragDrop(sender, DragDropEffects.All); 
     } 



} 
0

SetChildIndex नामित flowlayout पैनल में नियंत्रण के क्रम में रीसेट नहीं होता । तो जब हम FlowLayoutPanel.GetNextControl(q, true) निष्पादित करते हैं तो आउटपुट सही नहीं होता है।

+0

आपको टैबऑर्डर को भी बदलने की आवश्यकता है। इंडेक्स में भी बदलाव होने पर आप इसे सेट कर सकते हैं। –

2

आप फ्लोपेनल पर नियंत्रण को पुन: व्यवस्थित कर सकते हैं, नियंत्रण की मूल संपत्ति बदल सकते हैं और आपको आवश्यक ऑर्डर के साथ मूल संपत्ति को पुन: असाइन कर सकते हैं।

1

इस सामान्य समाधान का प्रयास करें जहां आप उपयोगकर्ता नियंत्रण में किसी संपत्ति के अनुसार नियंत्रण को सॉर्ट कर सकते हैं।

// When adding and removing controls, the order is not kept. 
var runsOrderedByStartDate = this.nodesFlowLayoutPanel.Controls.Cast<RunNodeControl>().Select(_ => new { StartDate = _.StartDateTime, RunControl = _ }).OrderBy(_ => _.StartDate).ToList(); 

// Sets index of controls according to their index in the ordered collection 
foreach (var anonKeyValue in runsOrderedByStartDate) 
{ 
    this.nodesFlowLayoutPanel.Controls.SetChildIndex(anonKeyValue.RunControl, runsOrderedByStartDate.IndexOf(anonKeyValue)); 
} 

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

  • कोई संबंधित समस्या नहीं^_^