Daniel Frear
Daniel Frear

Reputation: 1459

Why am I having positioning problems while adding controls at runtime?

I'm having a rather odd problem with a C# user control. Basically it's a panel wherein you can add rows of controls by pressing a button.

When the user presses the button, a new set of controls is added as a row. The code is pretty simple, just setting properties and adding them to the panel, as follows:

    private void AddCommentControls()
    {
        _noOfComments++;

        ComboBox tempCbCategory = new ComboBox();
        TextBox tempTxtRoomNo = new TextBox();
        ComboBox tempPositive = new ComboBox();
        TextBox tempTxtComment = new TextBox();

        tempCbCategory.Name = "cbCategory" + _noOfComments.ToString();
        tempTxtRoomNo.Name = "txtRoomNo" + _noOfComments.ToString();
        tempPositive.Name = "cbPositive" + _noOfComments.ToString();
        tempTxtComment.Name = "txtComment" + _noOfComments.ToString();

        tempCbCategory.Location = controls["cbCategory" + (_noOfComments - 1).ToString()].Location;
        tempCbCategory.FormattingEnabled = true;
        tempCbCategory.Size = new Size(119, 21);
        tempCbCategory.Location = new Point(tempCbCategory.Location.X, (tempCbCategory.Location.Y + tempCbCategory.Height + 50));

        controls.Add("cbCategory" + _noOfComments.ToString(), tempCbCategory);

        pnlBg.Controls.Add(tempCbCategory);

        tempTxtRoomNo.Location = controls["txtRoomNo" + (_noOfComments - 1).ToString()].Location;
        tempTxtRoomNo.Size = new Size(68, 21);
        tempTxtRoomNo.Location = new Point(tempTxtRoomNo.Location.X, (tempTxtRoomNo.Location.Y + tempTxtRoomNo.Height + 50));
        controls.Add("txtRoomNo" + _noOfComments.ToString(), tempTxtRoomNo);

        pnlBg.Controls.Add(tempTxtRoomNo);

        tempPositive.Location = controls["cbPositive" + (_noOfComments - 1).ToString()].Location;
        tempPositive.Size = new Size(46, 21);
        tempPositive.FormattingEnabled = true;
        tempPositive.Items.AddRange(new object[] {"Yes", "No"});
        tempPositive.Text = "Yes";
        tempPositive.Location = new Point(tempPositive.Location.X, (tempPositive.Location.Y + tempPositive.Height + 50));

        controls.Add("cbPositive" + _noOfComments.ToString(), tempPositive);

        pnlBg.Controls.Add(tempPositive);

        tempTxtComment.Location = controls["txtComment" + (_noOfComments - 1).ToString()].Location;
        tempTxtComment.Size = new Size(437, 57);
        tempTxtComment.Location = new Point(tempTxtComment.Location.X, (tempTxtComment.Location.Y + tempTxtComment.Height + 50));
        tempTxtComment.Multiline = true;

        controls.Add("txtComment" + _noOfComments.ToString(), tempTxtComment);

        pnlBg.Controls.Add(tempTxtComment);
    }

My problem comes after adding a few controls, the combo boxes (or the text boxes, I cant quite decide which) appear to move up/down by an ever increasing amount as the amount of "rows" increases, as shown here:

Example

I've been through this quite a few times and must be missing something glaringly obvious but I need to get it sorted so I can move on!

Any help would be greatly appreciated.

Regards, Daniel.

EDIT: If anyones interested, this was the result after implementing the accepted answer:

enter image description here

Upvotes: 0

Views: 192

Answers (2)

Bolu
Bolu

Reputation: 8786

put tempCbCategory;tempTxtRoomNo;tempPositive;tempTxtComment into a usercontrol. or set tempTxtRoomNo and tempTxtComment: AutoSize to False before set their size.

Upvotes: 0

Samich
Samich

Reputation: 30175

  1. Make your row custom control
  2. Use FlowLayoutPanel to layout your rows from the top to bottom + you will have scrollbars if it will overflow main container.

Upvotes: 2

Related Questions