【发布时间】:2013-03-25 19:49:23
【问题描述】:
大家好,我正在将PictureBoxes 添加到TableLayoutPanel 单元格,但是对于 10x10 网格,它需要大约 10 秒,这太长了。我的代码看起来像这样,你能告诉我如何改进它,所以PictureBoxes 会立即添加吗?这是我的做法:
private void x10ToolStripMenuItem_Click(object sender, EventArgs e)
{
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.ColumnStyles.Clear();
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.ColumnCount = 10;
tableLayoutPanel1.RowCount = 10;
int sliderval = trackBar1.Value;
//tableLayoutPanel1.Controls.Add(new PictureBox(),2,1);
for (int i = 0; i < tableLayoutPanel1.RowCount; i++)
{
tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, (100 / tableLayoutPanel1.RowCount)));
for (int j = 0; j < tableLayoutPanel1.ColumnCount; j++)
{
tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, (100 / tableLayoutPanel1.ColumnCount)));
PictureBox picture = new PictureBox
{
Name = "pictureBox" + i,
Size = new Size(49, 35),
Visible = true,
Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))),
BackColor = colors[random.Next(0, sliderval)],
TabIndex = 0,
TabStop = false
};
tableLayoutPanel1.Controls.Add(picture, j, i);
picture.Dock = DockStyle.Fill;
// picture.Margin = new Thickness(40, 16, 0, 0);
// picture.Padding = new Padding(0);
picture.SizeMode = PictureBoxSizeMode.Normal;
picture.Margin = new Padding(0);
}
}
AssignClickEvent();
}
【问题讨论】:
-
这是调用控件的 SuspendLayout() 方法很重要的少数情况之一。
-
不知道汉斯为什么没有发布这个答案。无论这意味着什么,WinForms 都不是“太慢”。即使是这样,面板上的几个图片框也不能算作“图形密集型应用程序”。多年来,人们一直在使用作为 WinForms 基础的技术来制作 Windows 应用程序,从那时起,计算机的速度就变得更快了。如果它曾经是可行的,那么它现在肯定是可行的。你只需要知道如何使用它。通过调用
tableLayoutPanel1.SuspendLayout()开始该方法并通过调用tableLayoutPanel.ResumeLayout()结束它。查看文档以了解原因。 -
非常感谢 Hans Passant 它帮助了 :)
-
@CodyGray 在这里没有看到你的 hackforms 评论......我还在等着用this one 上的赏金奖励你
-
@HighCore 对不起,我不玩那个游戏。它被操纵了。一旦我浪费大量时间发布解决方案,目标就会改变。此外,我认为您对答案并不真正感兴趣,这也是我在这里回答问题的唯一原因——帮助人们。我不在乎声誉。 two bounties I've earned,是我不小心赚到的。如果您真的在寻找一个好的答案,我是否建议每个问题只问一个问题?你有 8 在那里。
标签: c# winforms tablelayoutpanel