【问题标题】:Adding GUI controls dynamically动态添加 GUI 控件
【发布时间】:2015-06-13 00:45:38
【问题描述】:

我在添加一个面板时遇到问题,一个可滚动(通过另一个面板)组框中的两个按钮。我不擅长在没有设计师的情况下添加 UI 元素,所以很自然地,我的界面杂乱无章,无法按预期工作。

代码如下:

    private void client_DownloadFileCompleted(object sender, 
        System.ComponentModel.AsyncCompletedEventArgs e)
    {
        LinksParser<Track>.Results.Foreach<Uri, Track[]>(
            new Action<Uri, Track[]>( // this is an extension method
        delegate(Uri key, Track[] value)
        {
            GroupBox GB = new GroupBox()
            {
                Text = key.AbsoluteUri,
                Size = new Size(550, value.Length * 30),
                TabIndex = 0,
                TabStop = false
            };
            flwLayout.Controls.Add(GB); // flwLayout already created by designer
            Panel GB_panel = new Panel()
            {
                Size = GB.Size,
                TabIndex = 0,
                TabStop = false,
                Location = GB.Location,
                AutoScroll = false
            };
            VScrollBar VS = new VScrollBar() { Dock = DockStyle.Right };
            VS.Scroll += (_sender, _e) => GB_panel.VerticalScroll.Value = VS.Value;
            if (LinksParser<Track>.Results[key] == null)
            {
                GB.Controls.Add(new Label() { Text = "No tracks were found" });
            }
            else
            {
                for (int index = 0; index < 1; ++index)
                {
                    Track track = value[index];

                    Panel panel = new Panel()
                    {
                        BorderStyle = BorderStyle.FixedSingle,
                        Location = new Point(GB.Bounds.X + 6,
                             GB.Bounds.Y + 15 + (40 * index)),
                        Size = new Size(525, 40),
                        TabIndex = 0,
                        TabStop = false
                    };

                    Label lblTrack;
                    Button playOnline;

                    lblTrack = new Label()
                    {
                        Text = track.Name,
                        AutoSize = true,
                        TabIndex = 0,
                        Location = new Point(panel.Bounds.X + 6, panel.Bounds.Y)
                    };

                    playOnline = new Button()
                    {
                        Text = "Play Online",
                        TabIndex = 2,
                        Size = new Size(75, 23),
                        UseVisualStyleBackColor = true,
                        Location = new Point(
                            TextRenderer.MeasureText(lblTrack.Text,
                            lblTrack.Font).Width +
                            lblTrack.Bounds.X + 5, panel.Bounds.Y - 5)
                    };

                    playOnline.Click += delegate
                    {
                        track.PlayOnline();
                    };

                    panel.Controls.Add(lblTrack);
                    logger.Trace("Attached lblTrack at {0}", lblTrack.Location);
                    panel.Controls.Add(playOnline);
                    logger.Trace("Attached playOnline at {0}", playOnline.Location);

                    GB_panel.Controls.Add(panel);
                    logger.Trace("Attached panel at {0}", panel.Location);
                }
            }

            GB_panel.Controls.Add(VS);
            GB.Controls.Add(GB_panel);

        }));
    }

这是我得到的:

这就是我想要的:

【问题讨论】:

  • Form.Controls.Add(your_controll);看这里:msdn.microsoft.com/en-us/library/…
  • @GlennFerrie:是的,我没有错过。我将所有内容添加到设计师已经添加的flwLayout
  • “我的界面杂乱无章,无法按预期工作。”我们无法知道你的意图。给我们一张你所拥有的截图,告诉我们它是怎么错的,或者以某种方式向我们传达你真正想要的东西。
  • 如果您的问题中有明确的问题陈述,我看不到。如果没有a good, minimal, complete code example 清楚地说明您的问题,以及对您问题中的代码示例的作用以及它的作用与您想要的有何不同的精确和完整描述,那么即使不是不可能,也很难获得回答。
  • 它不在工具箱中。在菜单中,点击Project --> Add User Control --> Add,然后像使用表单一样设计用户控件。

标签: c# .net winforms user-interface


【解决方案1】:

感谢Idle_Mind,他关于使用 UserControls 的建议(直到他指出我才听说过)帮助我将问题分解为更小的部分,并找出了the size of a panel has to absorb its controls,所以根据那个答案问题,我改用FlowLayoutPanel,所有控件都正确显示。

如果有人感兴趣,这是最终形式:

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多