开发者

Strange behaviour with dynamic form in VS2010

Following code should produce 5 identical groupbox elements filled with each a form, a button and a progress bar:

private void DrawControls()
    {
        for(int i=0; i<5; i++)
        {
            // define controls
            GroupBox gbxAttachmentName = new GroupBox();
            gbxAttachmentName.Text = "Datei.jpg";
            gbxAttachmentName.Font = new Font(gbxAttachmentName.Font, FontStyle.Bold);

         开发者_高级运维   TextBox tbxAttachmentLabel = new TextBox();
            tbxAttachmentLabel.Text = "Bezeichnung";
            tbxAttachmentLabel.Font = new Font(tbxAttachmentLabel.Font, FontStyle.Regular);

            Button btnUploadAttachment = new Button();
            btnUploadAttachment.Text = "übertragen";
            btnUploadAttachment.Font = new Font(btnUploadAttachment.Font, FontStyle.Regular);

            ProgressBar pbUploadProgress = new ProgressBar();
            pbUploadProgress.Step = 1;                

            // position controls
            gbxAttachmentName.Size = new Size(500, 75);
            gbxAttachmentName.Location = new Point(10, 10 + (i * 85));

            tbxAttachmentLabel.Size = new Size(375, 20);
            tbxAttachmentLabel.Location = new Point(10, 20 + (i * 85));

            btnUploadAttachment.Size = new Size(100, 22);
            btnUploadAttachment.Location = new Point(390, 19 + (i * 85));

            pbUploadProgress.Size = new Size(480, 20);
            pbUploadProgress.Location = new Point(10, 45 + (i * 85));

            // add controls to groupbox
            gbxAttachmentName.Controls.Add(tbxAttachmentLabel);
            gbxAttachmentName.Controls.Add(pbUploadProgress);
            gbxAttachmentName.Controls.Add(btnUploadAttachment);

            // add groupbox to form
            flpMain.Controls.Add(gbxAttachmentName);
        }

    }

Instead, I only get 1 Groupbox correctly filled. The other 4 are empty ones.

Has anyone a solution for this?

Thanks in advance


The controls are actually in the groupboxes, you just can't see them. You gave them the wrong Location. Child control locations are relative to their parent. Fix:

            tbxAttachmentLabel.Location = new Point(10, 20);

and fix this in the other ones as well.


You might also consider renaming your method as it does not "draw" controls, it creates them.

You might also consider using initializer syntax. Not only is it more concise, it shows the parent/child relationships better.

Updated

You might also consider using anchors so that the controls can resize along with their parent.

private static void CreateControls(Control parent)
{
    int baseWidth = parent.ClientSize.Width - 20;

    for (int i = 0; i < 5; i++)
    {
        parent.Controls.Add(
            new GroupBox {
                Text = "Datei.jpg",
                Font = new Font(parent.Font, FontStyle.Bold),
                Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right,
                Size = new Size(baseWidth, 75),
                MinimumSize = new Size(175, -1),
                Location = new Point(10, 10 + (i * 85)),
                Controls = {
                    new TextBox {
                        Text = "Bezeichnung",
                        Font = new Font(parent.Font, FontStyle.Regular),
                        Anchor = AnchorStyles.Left | AnchorStyles.Right,
                        Size = new Size(baseWidth - 100 - 30, 20),
                        Location = new Point(10, 20), },
                    new Button {
                        Text = "übertragen",
                        Font = new Font(parent.Font, FontStyle.Regular),
                        Anchor = AnchorStyles.Right,
                        Size = new Size(100, 22),
                        Location = new Point(baseWidth - 100 - 10, 19), },
                    new ProgressBar {
                        Step = 1,
                        Font = new Font(parent.Font, FontStyle.Regular),
                        Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right,
                        Size = new Size(baseWidth - 20, 20),
                        Location = new Point(10, 45) },
                },
            }
            );
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜