【问题标题】:Buttons do not show up when specifying location property in Windows Forms在 Windows 窗体中指定位置属性时不显示按钮
【发布时间】:2015-09-22 01:15:37
【问题描述】:

我正在尝试在表单加载时使用以下代码在面板中根据列表中的人数动态添加面板:

private void Form1_Load(object sender, EventArgs e)
{
    const int xConst = 2;
    var people = new List<string>
    {
        "Person1",
        "Person2",
        "Person3",
        "Person4",
    };
    var y = 2;
    for (var x = 0; x < people.Count; x++)
    {
        var newpan = new MyPanel
        {
            BorderStyle = BorderStyle.None,
            Height = 25,
            Width = panel1.Width - 5,
            Location = new Point(xConst, y)
        };
        var newlbl = new Label
        {
            BorderStyle = BorderStyle.None,
            AutoSize = false,
            Text = people[x],
            Font = new Font("Segoe UI", 9.5F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(0))),
            Size = new Size(75,20),
            Location = new Point(newpan.Location.X + 2, newpan.Location.Y + 2),
        };
        var newbtn = new Button
        {
            FlatStyle = FlatStyle.Flat,
            FlatAppearance = { BorderSize = 0 },
            UseVisualStyleBackColor = true,
            Text = @"+",
            Size = new Size(15,21),
            Location = new Point(newpan.Width - 20,newpan.Location.Y - 1),
            Font = new Font("Segoe UI", 9.0F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)))
        };
        newpan.Controls.Add(newlbl);
        newpan.Controls.Add(newbtn);
        panel1.Controls.Add(newpan);
        y += 27;
    }
}

问题是,如果我在按钮和标签中都指定了 Location 属性,那么Person1 迭代只会显示标签和按钮的第一次迭代。但是,如果我将 Location 属性排除在外,它们都会出现。问题是我有一个自定义面板,它覆盖了一些东西,允许我在面板周围放置客户边框和颜色,如果我没有指定位置,标签和按钮在面板上的位置不正确,所以它覆盖了我的边界,看起来很邋遢。

有人可以帮我弄清楚为什么会这样吗?我已经完全完成了程序,并在观察窗口中观察了我能想到的所有值相应地增加。所有面板都正确显示,所以我不明白为什么在我指定位置时它们各自的标签和按钮不显示。

【问题讨论】:

  • 您正在使用面板位置属性将 y 位置分配给控件。此属性基于您的 panel1 位置。因此,您的第一个组件的 y 坐标将为 4,下一次迭代将是 29,下一次将是 56,等等。这最终会将您的组件移出视图。您想使用基于 newpan 面板的坐标,很可能是 0。
  • 也许您应该考虑使用TableLayoutPanelFlowLayoutPanel 而不是尝试手动定位。另外,不要手动将多个控件添加到多个Panels。设计一个用户控件,然后将它的多个实例添加到表单中。
  • @MarkHall 我不明白......您建议将我的按钮和标签位置放在我的 newpan 面板上,但这正是我正在做的......即。 new Point(newpan.Location.X + 2,newpan.Location.Y + 2)
  • 您将它基于 newpan 面板的位置,该面板基于您的面板位置并且不断变化。我会取消它并使用固定偏移量或由您的边框宽度设置的偏移量
  • 这仍然没有意义......我一定是遗漏或不理解某些东西,但我会重申我的面板都完美显示,而且我确实基于我的按钮和标签位置关闭每个新面板,第一个标签和按钮显示得很好。查看值,按钮和标签应该出现在正确的位置。所以,除此之外,我需要查看一个替代的工作示例,看看有什么问题。

标签: c# winforms


【解决方案1】:

查看您的代码,我注意到您将 newpan 高度设置为 25,并且每次迭代其位置偏移 27。你也在使用

 'Location = new Point(newpan.Location.X + 2, newpan.Location.Y + 2)

在 newpan 面板中设置按钮和标签的位置。 newpan.Location 在您的 panel1 的坐标中引用,您的按钮和标签的位置在您的 newpan 面板的坐标中引用,因此在 For 语句的第一次迭代之后,您的标签和按钮 y 位置值为 29,大于高度您的 newpan 面板使其无法被看到,之后的下一次迭代将是 y 将是 56,依此类推。每个内容控件,在这种情况下,您的面板都有自己的坐标系,最简单的解决方法是执行以下操作:

'Location = new Point( 2, 2) //for your label
'Location = new Point(newpan.Width - 20, - 1) //for your button

另一种选择是按照 jmcilhinney 的建议进行操作,并使用您的按钮和标签制作一个 UserControl,然后您将创建它的各个实例并将其分配给您的 panel1。

【讨论】:

  • 我需要查看@jmcilhinney 解决方案的示例。我最有可能不知道如何实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多