2016-05-09 6 views
5

मेरे पास एक पैनल MessagesPanel है जिसमें डेटाबेस से पुनर्प्राप्त संदेशों को शामिल किया गया है। मैं foreach लूप का उपयोग कर संदेशों पर जाता हूं। लूप में, मैं एक फंक्शन AddMessageToPanel कहता हूं जो संदेश की जानकारी और सामग्री के साथ पैनल में GroupBox गतिशील रूप से जोड़ता है। संदेश सबसे पुराने, ऊपर से नीचे (व्हाट्सएप की तरह) के लिए सबसे पुराना पुनर्प्राप्त किया जाता है। पैनल AutoScroll=true पर सेट है, और मैं इसे नवीनतम संदेश पर बहुत नीचे स्क्रॉल करना चाहता हूं। मैं उन समाधानों की कोशिश की:सी # में नीचे पैनल को स्क्रॉल कैसे करें?

  1. autoscroll panel to bottom
  2. How to Programmatically Scroll a Panel
  3. How to scroll a panel manually?

उनमें से कोई भी मेरे लिए काम किया। पैनल शीर्ष पर स्क्रॉल बार के साथ, वही दिखता है।

विशेष रूप से, मैं निम्नलिखित कोड की कोशिश की है:

private void MessagePanel_ControlAdded(object sender, ControlEventArgs e) 
{ 
    MessagesPanel.ScrollControlIntoView(e.Control); 
} 

और मैं घटना ControlAdded के साथ की सदस्यता लें।

और यह भी:

MessagesPanel.VerticalScroll.Value = MessagesPanel.VerticalScroll.Maximum 
के साथ और MessagesPanel.SuspendLayout() बिना

;

private void AddMessageToPanel(string sender, string datetime, string content) 
{ 
    GroupBox groupBox = new GroupBox(); 
    groupBox.Location = new Point(0, 120 * MessagesPanel.Controls.Count); 
    groupBox.RightToLeft = RightToLeft.Yes; 
    groupBox.Size = new Size(500, 100); 
    groupBox.Text = string.Format("{0} ({1})", sender, datetime); 

    TextBox textBox = new TextBox(); 
    textBox.Enabled = false; 
    textBox.BackColor = Color.White; 
    textBox.BorderStyle = BorderStyle.None; 
    textBox.Multiline = true; 
    textBox.Size = new Size(495, 95); 
    textBox.Location = new Point(0, 20); 
    textBox.Text = content; 

    groupBox.Controls.Add(textBox); 
    MessagesPanel.Controls.Add(groupBox); 
} 

मैं MessagesPanel नीचे सभी तरह से स्क्रॉल करने के लिए करना चाहते हैं:

यहाँ मेरी कार्य है। यह कैसे करना है? धन्यवाद!

+0

'ScrollControlIntoView' को कॉल करने का प्रयास करें जिसे आपने अंतिम बार जोड़ा था। पसंदीदा रूप से 'Form.Shown' ईवेंट से पहले नहीं। – Sinatr

उत्तर

3

को WrapContents संपत्ति false

  • को SetAutoScroll गुण सेट Beldi के समाधान के लिए विकल्प है, तो आप सब के बाद

    MessagesPanel.AutoScrollPosition = new Point(0, MessagesPanel.DisplayRectangle.Height); 
    

    कॉल कर सकते हैं के रूप में पैनल में नियंत्रण जोड़ा गया है।

  • +0

    धन्यवाद। मैंने कोशिश की है, लेकिन कोई बदलाव नहीं होता है ... – Sipo

    +0

    उपरोक्त सिनाटर द्वारा बताए गए अनुसार, आप शायद फॉर्म से पहले इसे चलाएं। दिखाया गया घटना हुई है। AutoScrollPosition लागू करने से पहले आपको उस ईवेंट की प्रतीक्षा करनी होगी। – Gess

    1

    ScrollControlIntoView() विधि का उपयोग करें। इस तरह:

    groupBox.Controls.Add(textBox); 
        MessagesPanel.Controls.Add(groupBox); 
        MessagesPanel.ScrollControlIntoView(groupBox); 
    

    तुम भी नए GroupBox की स्थिति का उपयोग कर सकते कहा:

    MessagesPanel.AutoScrollPosition = new Point(
          groupBox.Right - MessagesPanel.AutoScrollPosition.X, 
          groupBox.Bottom - MessagesPanel.AutoScrollPosition.Y); 
    

    सबसे अच्छा flowLayoutPanel बजाय Panel उपयोग कर रहा है:

    कोशिश flowLayoutPanel

      जोड़ने के लिए
    1. सेट myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
    2. आप एक से अधिक पंक्तियों या स्तंभों नहीं करना चाहते हैं सच
    +0

    धन्यवाद।पहला समाधान एक अजीब परिणाम की ओर जाता है: स्क्रॉल बार पैनल के आधे हिस्से तक पहुंच जाता है, और सभी 'ग्रुपबॉक्स' के ऊपर एक अजीब जगह जोड़ा जाता है। यहां एक प्रदर्शन है: http://i.imgur.com/hJyJ2yy.gifv। दूसरा समाधान कुछ भी नहीं करता है ... स्क्रॉल बार शीर्ष पर रहता है, लेकिन कोई स्थान नहीं जोड़ा जाता है: http://i.imgur.com/7y4IZsh.png?1। धन्यवाद, – Sipo

    +0

    मुझे यह सुनकर गॉड है, कृपया उत्तर –

    +0

    पर माफ़ करें, मुझे खेद है, लेकिन जवाब मेरी मदद नहीं करता है ... कृपया उत्तर में समस्याओं के साथ मेरी पिछली टिप्पणी देखें। आपका बहुत बहुत धन्यवाद! – Sipo

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