JEV
JEV

Reputation: 2504

When dynamically adding controls to a form only one will show

I am adding two controls dynamically during runtime, however only the control that is made first is displayed.

Here is the code:

Label tempLab = new Label();
tempLab.text = "Test Label";
MyControl.Controls.Add(tempLab);
tempLab.Location = new Point(5,5);

Button tempBut = newButton()
tempBut.text = "Test Button";
MyControl.Controls.Add(tempBut);
tempBut.Location = new Point(20,20);

Isn't copypasta so ignore syntax errors with caps. Any ideas ?

They are being added to a groupbox. I have tried adding them to a panel or just the form and the same issue occurs. I don't need event handlers, so please don't cite that requirement.

Upvotes: 6

Views: 17054

Answers (4)

mrittunjay sharma
mrittunjay sharma

Reputation: 1

  string sql3 = "SELECT COUNT(*) from systeminfo";//counting no of element
        n = dm.countelement(sql3);
        int i, c = 1;
        int m = 100;

        for (i = 0; i < n; i++, c++)
        {
            sql3 = " SELECT Company_name FROM systeminfo LIMIT " + (i + 1) + " OFFSET " + i + "";
            string cname = dm.getlang(sql3);

            PictureBox pb = new PictureBox();
            Label lb = new Label();
           pb.Location = new System.Drawing.Point(m, 30 + (30 * i));
           lb.Location = new System.Drawing.Point(m-30, 30 + ((30 * i)-30));
           pb.Name = "p" + c;
           lb.Name = "l" + c;
           lb.Size = new System.Drawing.Size(100, 20);
           pb.Size = new System.Drawing.Size(30, 30);
           lb.Text = cname;
           lb.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
           lb.BackColor = Color.Transparent;
           pb.ImageLocation = @"..\image\image.jpg";
           pb.MouseDown += new         System.Windows.Forms.MouseEventHandler(this.picmap1_MouseDown_1);
           pb.MouseMove += new System.Windows.Forms.MouseEventHandler(this.picmap1_MouseMove_1);
           pb.MouseUp += new System.Windows.Forms.MouseEventHandler(this.picmap1_MouseUp_1);

            picmap1.Controls.Add(pb);
            picmap1.Controls.Add(lb);
            c++;

        }

private void picmap1_MouseMove_1(object sender, MouseEventArgs e) { var c = sender as PictureBox;

        if (!_dragging || null == c) return;
        c.Top = e.Y + c.Top - _yPos;
        c.Left = e.X + c.Left - _xPos;
        foreach (Control d in picmap1.Controls)
            if (d is Label)
            {

                d.Top = e.Y + d.Top - _yPos;
                d.Left = e.X + d.Left - _xPos;

            }
    }

    private void picmap1_MouseUp_1(object sender, MouseEventArgs e)
    {
        var c = sender as PictureBox;
        if (null == c) return;
        _dragging = false;
    }

    private void picmap1_MouseDown_1(object sender, MouseEventArgs e)
    {

        if (e.Button != MouseButtons.Left) return;
        _dragging = true;
        _xPos = e.X;
        _yPos = e.Y;
        foreach (Control d in picmap1.Controls)
            if (d is Label)
            {

                _xPos = e.X;
                _yPos = e.Y;

            }
    }

this is example of dynamic add control with move on mouse drag

Upvotes: 0

aked
aked

Reputation: 5815

hope this helps. I am adding a array of MyTextBox into panel.

         Point prevlocation = new Point(0,0);
         foreach (object key in keys)  //List of Objects or which make new controls
         {


            MyTextBoxControlArray[i] = new MyTextBoxUserControl(key);   //User control but could be any control like textbox etc
            MyTextBoxControlArray[i].Width = this.panel1.Width - 50;
            MyTextBoxControlArray[i].AutoSize = true;
            MyTextBoxControlArray[i].InfoLoad += new MyTextBoxUserControl.InfoLoadEventHandler(Form1_InfoLoad);

            if (i == 0)
            {
                //first control
                prevlocation.Y += 3;
                prevlocation.X += 3;
                MyTextBoxControlArray[i].Location = prevlocation;
            }
            else
            {
            //adjsuting height and width
                MyTextBoxControlArray[i].Location = new System.Drawing.Point(
                             prevlocation.X,
                             prevlocation.Y + MyTextBoxControlArray[i].Height+3);
            }

            prevlocation = MyTextBoxControlArray[i].Location;

            i++;
        }

        this.panel1.Controls.AddRange(MyTextBoxControlArray); //in panel i can add a array of controls , but this could be done one by one

Upvotes: 1

MethodMan
MethodMan

Reputation: 18843

it appears that the location does not have a Size which becomes a flat line so to speak which is not visible.. this tempBut.Location = new Point(20,20); try changing to this

this.tempBut.Location = new System.Drawing.Point(20,20); 
this.tempBut.Size = new System.Drawing.Size(30, 15); 

Upvotes: 2

Larry
Larry

Reputation: 18031

I quickly tried your code pasting it in a windows form constructor. It runs ok, but the label is slightly overlapping the button because of its size. You may want to autosize it:

Label tempLab = new Label();
tempLab.Text = "Test Label";
tempLab.AutoSize = true;
Controls.Add(tempLab);
tempLab.Location = new Point(5,5);

Button tempBut = new Button();
tempBut.Text = "Test Button";
Controls.Add(tempBut);
tempBut.Location = new Point(20,20);

Oh, by the way. You mentioned you are using MyControl as a Panel or a GroupBox. Please ensure that you are also adding MyControl to your Controls collection.

Upvotes: 8

Related Questions