今天工做中遇到一个场景,有一个对象数组的内容,从后台传到前台的C#程序中。须要用一个GroupBox展现每个对象的详细信息,要求GroupBox的数量是能够随传入对象的个数动态添加的,所以我设计了以下解决方案:c#
一、创建一个C#窗体应用程序MultiItemsDemo数组
二、将主窗体命名为FormMain,里面放置上下两个Panel,上方Panel的Dock属性为Fill,下方Panel的Dock属性为Bottom。将panel1的AutoScroll属性设置为True。函数
三、创建一个自定义控件,这里取名为UserControl1this
四、在自定义控件的Designer文件中,将各个控件的可见性约束从private改成public设计
public System.Windows.Forms.GroupBox groupBox1; public System.Windows.Forms.Button button1; public System.Windows.Forms.Label label4; public System.Windows.Forms.TextBox textBox4; public System.Windows.Forms.Label label3; public System.Windows.Forms.TextBox textBox3; public System.Windows.Forms.Label label2; public System.Windows.Forms.TextBox textBox2; public System.Windows.Forms.Label label1; public System.Windows.Forms.TextBox textBox1;
五、在FormMain的构造函数中就能够添加这些自定义控件了,下面这段代码要放在VS自动生成的函数InitializeComponent后面:code
int count = 5; for (int i = count - 1; i >= 0; i--) { UserControl1 userControl1 = new UserControl1(); userControl1.Parent = panel1; userControl1.Dock = DockStyle.Top; userControl1.groupBox1.Text = "GROUPBOX - " + i.ToString(); userControl1.textBox1.Text = "TEXT1 - " + i.ToString(); userControl1.textBox2.Text = "TEXT2 - " + i.ToString(); userControl1.textBox3.Text = "TEXT3 - " + i.ToString(); userControl1.textBox4.Text = "TEXT4 - " + i.ToString(); userControl1.button1.Click += (obj, arg) => { MessageBox.Show(userControl1.groupBox1.Text); }; list.AddFirst(userControl1); } panel1.AutoScroll = true;
(因为这只是个Demo,并无写将对象的值逐一赋到自定义控件中各字段的代码,list为一个链表(LinkedList),若是但愿在生成这些控件后再对这些控件进行操做,能够经过操做这个链表实现)orm
六、在Load函数中,必定要加上这两句话:对象
this.btnOper.Select(); panel1.VerticalScroll.Value = 0;
第一句话的目的是让焦点重新加入控件的文本输入框中挪开,第二句话的目的是将panel1右侧出现的滚动条滚动到最上方it
这些步骤执行完毕后,运行程序,效果以下图所示:class
END