Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 458
João Silva Avatar asked Nov 01 '22 10:11

João Silva


2 Answers

If I am properly understood your problem is.. The Label moves from right to left and then stuck in the Left side.

You are removing and adding the control. But it will not reset the controls position. You need to set Control.Location.X to 800 or some value, just before adding it again.

like image 114
Rajan Panneer Selvam Avatar answered Nov 12 '22 20:11

Rajan Panneer Selvam


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.

like image 24
João Silva Avatar answered Nov 12 '22 20:11

João Silva