我有一个自定义控件,我手动初始化[没有设计师的帮助]:
// 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
看,我试图将每个32x32
大小的控件按水平顺序放在彼此旁边。但我也希望每10次迭代将Location.Y
增加Size.Y
- 这会使控件开始另一行。我还需要以某种方式重置Location.X
。
我需要让每10个控件出现在前10个下方32个像素处。使用模数运算符仅对第10个控件执行此操作,并且甚至不能将其位置设置为正确...
提前致谢!
答案 0 :(得分:1)
你对模数的想法非常好,这是一个有效的版本
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)