众所周知,要添加控件到WinForm的Control中,首先是目标控件必须是容器控件,例如Panel和GroupBox,然后新建控件,然后调用Control.Controls.Add/Insert/AddRange即可,这没有什么蹊跷和争论的地方,但是要实现细微的调整,则比较复杂一些。

我的目标是要实现动态添加参数的输入框到界面上,并且可以收集这些输入的值,具体的要求是:

  • 每个输入控件(例如文本框、日期选择框、下拉列表等等)都要有一个说明的Label在前面,形成一个组。
  • 每个组按照顺序依次的排列,组元素(Label和输入控件)需要对其,目前采用的是纵向单列排列,每组一行。
  • 组内的输入控件可以按下Tab键进行输入焦点自动切换。

我不准备谈如何创建输入控件,这是一个枯燥而且简单的活。我的实现方案是每组是一个Panel,内置Label设置Docking到左边,设置AutoSize=false并设置固定的宽度值。Panel内部的输入控件设置Docking为Fill。这样保证每组的标签能够完全对其。

每组在容器控件中设置Docking为Top保证顶对齐。

容器控件依次添加这些组的Panel,然后设置TabIndex以实现如上的功能。在实际测试中,我发现组Panel的显示顺序正好和Panel加入到容器中的顺序相反,而且TabIndex的顺序不稳定,如下调整可能能够帮助您:

  • 反向加入控件,例如从上往下排列的组控件,设置所有的组控件的Docking为Top,则需要将最底下的组控件最先添加到容器的Controls中,否则产生顺序倒置。
  • 设置输入控件的TabIndex为0,Label的TableIndex为1
  • 依次设置组Panel的TabIndex,必须是从0开始,依次递增1.

貌似完工!


Jeason Zhao (沈胜衣,斛律光) ------雪饮再现,一个人的江湖
我知道我是谁,我是沈胜衣,默默的活着,就像空气。