【发布时间】: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。
-
也许您应该考虑使用
TableLayoutPanel或FlowLayoutPanel而不是尝试手动定位。另外,不要手动将多个控件添加到多个Panels。设计一个用户控件,然后将它的多个实例添加到表单中。 -
@MarkHall 我不明白......您建议将我的按钮和标签位置放在我的 newpan 面板上,但这正是我正在做的......即。
new Point(newpan.Location.X + 2,newpan.Location.Y + 2) -
您将它基于 newpan 面板的位置,该面板基于您的面板位置并且不断变化。我会取消它并使用固定偏移量或由您的边框宽度设置的偏移量
-
这仍然没有意义......我一定是遗漏或不理解某些东西,但我会重申我的面板都完美显示,而且我确实基于我的按钮和标签位置关闭每个新面板,第一个标签和按钮显示得很好。查看值,按钮和标签应该出现在正确的位置。所以,除此之外,我需要查看一个替代的工作示例,看看有什么问题。