我有一个自定义控件,该控件在[没有设计人员的帮助下]会手动初始化:
// Form1.cs
private byte totalControls;
private List<MyControl> controls;
public Form1()
{
InitializeComponent();
totalControls = 22;
controls = new List<MyControl>(totalControls);
for (byte i = 0; i < totalControls; i++)
{
controls.Add(new MyControl(i));
panel1.Controls.Add(controls[i]);
// My Problem:
controls[i].Location = new Point(3 + (32 * i), 3);
if ((i % 10 == 0) && (i != 0))
{
controls[i].Location = new Point(3 + (32 * i), 3 + (32 * i));
}
controls[i].Name = "myControl" + i.ToString();
controls[i].Size = new Size(32, 32);
controls[i].TabIndex = i;
controls[i].Text = string.Empty;
}
}
因此,正如您从Location
为每个控件设置的I所看到的,我试图将每个32x32
大小的控件按彼此相邻的水平顺序放置。但我也想增量Location.Y
由Size.Y
每10次迭代-这将使得控制开始另一行。我还需要以Location.X
某种方式重置。
我需要让每 10 个控件出现在前 10 个下方 32 个像素的位置。使用模数运算符只对第 10 个控件执行此操作,甚至没有将其位置设置正确......
提前致谢!
你对模的想法很好,这是一个工作版本
int verticalOffset = 32;
var horizontalOffset = 32;
var numberOfControlsPerRow = 10;
controls[i].Location = new Point(
3 + horizontalOffset*(i%numberOfControlsPerRow),
3 + verticalOffset*(i/numberOfControlsPerRow)
);
// remove the if-statement
如您所见,我%
用于 x 坐标。在 10 个项目的情况下,i%10
将是 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 然后在 0, 1, 2, ... 重新开始,所以它总是环绕。
对于 y 坐标,我使用i/10
. 请注意,这是一个整数除法,因此大括号很重要。在十个项目的情况下,i/10
将是 0, 0, 0, 0, 0, 0, 0, 0, 0 然后是 1, 1, 1, 1, 1, ...
这样你甚至可以摆脱if
声明。
(请注意,我引入了一些变量来摆脱“幻数”。您可能会将它们转换为常量以进行优化。并且您应该进一步为这两个幻数 3 引入一个名称,即horizontalMargin 和 verticalMargin)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句