2016-05-09 84 views
5

Veritabanından alınan iletileri içeren bir panelim var MessagesPanel. foreach döngüsünü kullanarak mesajların üzerinden geçiyorum. Döngüde, mesaj bilgileri ve içeriği ile panele bir GroupBox dinamik olarak ekleyen AddMessageToPanel işlevini çağırıyorum. Mesajlar en eskiden en yeniye, yukarıdan aşağıya (WhatsApp'ta olduğu gibi) alınır. Panel AutoScroll=true olarak ayarlanmıştır ve en alttaki mesaja en alta kaydırılmasını istiyorum. Ben bu çözümleri denedim: BunlardanBir paneli C# içine nasıl kaydırılır?

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

Yok benim için çalıştı. Panel, üstte kaydırma çubuğu ile aynı görünüyor. Özellikle

, aşağıdaki kodu denediniz:

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

ve ben olayı ControlAdded ile abone.

Ve ayrıca: With ve MessagesPanel.SuspendLayout() olmadan

MessagesPanel.VerticalScroll.Value = MessagesPanel.VerticalScroll.Maximum 

;

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); 
} 

Ben MessagesPanel aşağı tüm yönlü kaydırma istiyorum:

İşte benim fonksiyonudur. Bu nasıl yapılır? Teşekkürler!

+0

En son eklediğiniz öğenin örneğini ileterek ScrollControlIntoView' öğesini aramaya çalışın. Tercihen, Form.Shown' olayından daha erken değil. – Sinatr

cevap

3

-WrapContents mülkiyet

  • false için SetAutoScroll özelliğini ayarlayın panele kontroller eklendi.

  • +0

    Teşekkürler. Denedim ama değişiklik yok ... – Sipo

    +0

    Yukarıdaki Sinatr tarafından belirtildiği gibi, muhtemelen Form.Shown Olayı gerçekleşmeden önce bunu çalıştırın. AutoScrollPosition'ı uygulamadan önce bu etkinliği beklemeniz gerekir. – Gess

    1

    ScrollControlIntoView() yöntemini kullanın. Şunun gibi:

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

    Ayrıca yeni GroupBox pozisyonunu kullanabilirsiniz ekledi: flowLayoutPanel

      eklemek için

      deneyin: En iyi flowLayoutPanel yerine Panel kullanıyor

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

    1. Set myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
    2. Beldi en çözümüne alternatif, tüm sonra

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

      çağrı gibi

    3. Birden fazla satır veya sütunları istemiyorsanız gerçek
    +0

    Teşekkürler.İlk çözüm garip bir sonuca yol açar: kaydırma çubuğu panelin yaklaşık yarısına kadar çıkar ve tüm 'groupbox'ların üstünde garip bir alan vardır. İşte bir gösteri: http://i.imgur.com/hJyJ2yy.gifv. İkinci çözüm sadece bir şey yapmaz ... Kaydırma çubuğu üstte kalır, ancak alan eklenmez: http://i.imgur.com/7y4IZsh.png?1. Tekrar teşekkürler, – Sipo

    +0

    Bunu duymak için kullanıcıyım, lütfen cevabı işaretleyin –

    +0

    Üzgünüm, fakat cevap bana yardımcı olmadı ... Lütfen cevabındaki problemlerle ilgili önceki görüşüme bakın. Çok teşekkürler! – Sipo