让代码更简单

C#批量动态添加控件实现瀑布流

重要:本文最后更新于2024-05-09 22:02:08,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

最近在使用c#开发工业视觉软件时遇到一个需求,需要将每一个视觉处理结果图像显示在窗体中,并且视觉处理程序数量不定。要处理这种问题,一定要使用动态添加控件,下面是我的实现过程。

C#批量动态添加控件实现瀑布流

首先,行列数量的处理,我采用的是由列数控制行数,为什么这样做大家可以想想,或者试试使用行数控制列数会出现什么样的情况。

行数处理的时候需要采用对总控件数量开平方并向上取整的方法,这样在总数量为奇数时不至于导致控件显示不全,下面是我的代码分享

复制
//C#批量动态添加控件实现瀑布流
//https://www.daimadog.org/10581.html
public void AddDynamicImageControlsToPanel(SplitContainer splitContainer, int controlCount)
{
int columnCount = (int)Math.Ceiling(Math.Sqrt(controlCount)); // 计算列数,向上取整
int rowCount = (int)Math.Ceiling((double)controlCount / columnCount); // 计算行数

splitContainer.Panel1.Controls.Clear(); // 清空Panel1中的所有控件

int controlIndex = 0;
int controlWidth = splitContainer.Panel1.Width / columnCount;
int controlHeight = splitContainer.Panel1.Height / rowCount;

for (int row = 0; row < rowCount; row++)
{
for (int column = 0; column < columnCount && controlIndex < controlCount; column++)
{
PictureBox pictureBox = new PictureBox();
pictureBox.Name = "dynamicPictureBox" + controlIndex;
pictureBox.Image = Image.FromFile("C:\\Users\\daimadog\\Desktop\\test.png"); // 替换为图片路径
pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox.Width = controlWidth;
pictureBox.Height = controlHeight;
pictureBox.Top = row * controlHeight;
pictureBox.Left = column * controlWidth;

// 设置边框样式和颜色
pictureBox.BorderStyle = BorderStyle.FixedSingle;
pictureBox.BackColor = Color.White;

splitContainer.Panel1.Controls.Add(pictureBox);
controlIndex++;
}
}
}

注册容器大小改变和拆分器移动事件,以便在改变窗体大小以及拆分器移动时重绘

复制
 private void splitContainer1_Resize(object sender, EventArgs e)
{
AddDynamicImageControlsToPanel(splitContainer1, 7);
}

private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
AddDynamicImageControlsToPanel(splitContainer1, 7);
}

效果符合预期,这里我使用的splitContainer控件,也可以换成其它的,自由发挥。

感觉很棒!可以赞赏支持我哟~

0 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐