如何在winforms中水平放置列表项

时间:2017-02-25 18:06:44

标签: c# winforms

我有一个自定义控件,我手动初始化[没有设计师的帮助]:

// 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个控件执行此操作,并且甚至不能将其位置设置为正确...

提前致谢!

1 个答案:

答案 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的名称,即horizo​​ntalMargin和verticalMargin)