今天工作中遇到一个场景,有一个对象数组的内容,从后台传到前台的C#程序中。需要用一个GroupBox展示每一个对象的详细信息,要求GroupBox的数量是可以随传入对象的个数动态添加的,因此我设计了如下解决方案:
1、建立一个C#窗体应用程序MultiItemsDemo
2、将主窗体命名为FormMain,里面放置上下两个Panel,上方Panel的Dock属性为Fill,下方Panel的Dock属性为Bottom。将panel1的AutoScroll属性设置为True。
3、建立一个自定义控件,这里取名为UserControl1
4、在自定义控件的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;
5、在FormMain的构造函数中就可以添加这些自定义控件了,下面这段代码要放在VS自动生成的函数InitializeComponent后面:
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),如果希望在生成这些控件后再对这些控件进行操作,可以通过操作这个链表实现)
6、在Load函数中,一定要加上这两句话:
this.btnOper.Select();
panel1.VerticalScroll.Value = 0;
第一句话的目的是让焦点从新加入控件的文本输入框中挪开,第二句话的目的是将panel1右侧出现的滚动条滚动到最上方
这些步骤执行完毕后,运行程序,效果如下图所示:
END