Search code examples
c#scrolllabelflowlayout

c# flow layout labels got stuck


I have a form with two custom panels and I'm adding some labels to them and in the end i want they to scroll from the right to the left but they are just stucking in the same position. There is a screenshot of what i have enter image description here There are two panels and the 4 labels and they just stay stuck in there... This is the code in my form:

  private MyPanel topPanel;  // the red bar
  private MyPanel botPanel;  // the white bar

        public SmsBar()
    {
        InitializeComponent();

        this.Width = 500000;

        this.Location = new Point(x, y);
 
        topPanel = new MyPanel(System.Drawing.Color.White, System.Drawing.Color.Red, (new Font("Tahoma", 10, FontStyle.Bold)));
        botPanel = new MyPanel(System.Drawing.Color.Black, System.Drawing.Color.White, (new Font("Tohama", 10, FontStyle.Regular)));

        msgPanel.Controls.Add(topPanel);
        adPanel.Controls.Add(botPanel);
        botPanel.addMsg(new MsgForDisplay(0, AppData.getInstance().getAdMsg()));
        botPanel.addMsg(new MsgForDisplay(0, AppData.getInstance().getAdMsg2()));

        topPanel.addMsg(new MsgForDisplay(0, "test top"));
        topPanel.addMsg(new MsgForDisplay(0, "test top 2"));

        adPanel.Refresh();
        msgPanel.Refresh();
  
    }

And there is some code of my custom panel (Constructor):

  public MyPanel(Color corLabel, Color back, Font text){
    this.color = corLabel;
    this.backg = back;
    this.textFont = text;
    this.Width = 500000;

    txt= new LinkedList<string>();
    msgs = new LinkedList<MsgForDisplay>();
    labels = new LinkedList<Label>();
    var it = labels.GetEnumerator();
    var it2 = msgToRemove.GetEnumerator();

    this.FlowDirection = FlowDirection.LeftToRight;
    this.BackColor = backg;
    this.Size = new Size(500000, 35);
    this.Refresh();
 
    }

The running:

         public void run() {

         while (true) {
             
              var it = labels.GetEnumerator();
                while(it.MoveNext()){
               Label lb = it.Current;

                    if (lb.Location.X + lb.Width < 0) {

                        if (msgsRemover.Contains(lb.Text.ToString())) {
                            labels.Remove(lb);
                            this.Invoke(new MethodInvoker(() => { this.Controls.Remove(lb); }));
                            msgsRemover.Remove(lb.Text.ToString());
                        } else {
                            // if there is no message to be removed, they will just continue
                            // going to the end of the queue
                            this.Invoke(new MethodInvoker(() => { this.Controls.Remove(lb); }));
                            this.Invoke(new MethodInvoker(() => { this.Controls.Add(lb); }));

                        }
                        this.Invoke(new MethodInvoker(() => { this.Refresh(); }));

                    }
                    
                    this.Invoke(new MethodInvoker(() => { lb.Location = new Point(lb.Location.X - 3, lb.Location.Y); }));
             
             }

             System.Threading.Thread.Sleep(30);

         }
     
     }

And the addMsg function:

      public void addMsg(MsgForDisplay msg) {
        Label lbl = new Label();
        lbl.Text = ("- " + msg.getText() + " -");
        lbl.ForeColor = color;
        lbl.Font = textFont;
        lbl.BackColor = backg;
        lbl.Visible = true;
        lbl.AutoSize = true;
        labels.AddLast(lbl);
        this.Controls.Add(lbl);
    }

I guess that the problem must be with the layouts but I doesn't really know what I should use... Thank you in advance for the help!


Solution

  • For solve this i removed the flowlayout and let the panel as a panel and not as a FlowLayoutPanel, that way I was able to move the labels, the diference is that i had to create an algorithm to add each label in the panel.