【发布时间】:2009-04-06 14:19:26
【问题描述】:
我必须创建可变数量的标签,并在它们旁边创建文本框控件 - 将整个内容排列成一列,每行一个标签和一个文本框。如果我的主窗口小于所有 TextBox 控件的总高度,不知何故我需要一个可以滚动 TextBoxes 列表的滚动条。按回车键必须将焦点转移到下一个文本框,并且在文本框过多的情况下也需要滚动。
这是一个相当普遍的问题,我想已经有一些预先准备好的解决方案。
有什么建议吗?
【问题讨论】:
我必须创建可变数量的标签,并在它们旁边创建文本框控件 - 将整个内容排列成一列,每行一个标签和一个文本框。如果我的主窗口小于所有 TextBox 控件的总高度,不知何故我需要一个可以滚动 TextBoxes 列表的滚动条。按回车键必须将焦点转移到下一个文本框,并且在文本框过多的情况下也需要滚动。
这是一个相当普遍的问题,我想已经有一些预先准备好的解决方案。
有什么建议吗?
【问题讨论】:
使用TableLayoutPanel。您可以动态添加控件specify their row/column,它会为您维护一个滚动条(使用适当的设置)。它有其怪癖,但应该适合这种情况。
如果您使用 WinForms 设计器来放置 TableLayoutPanel,那么您也可以使用它来定义列的样式。您还可以按照 Tcks 的建议改变每一行的样式。
添加具有指定行/列的控件:
int column = 42;
int row = 7;
myTableLayoutPanel.Controls.Add(new TextBox(), column, row);
【讨论】:
您可以使用 TableLayoutPanel 作为控件(标签和文本框)的容器,并在代码中动态创建它们。
例子:
void Form1_Load( object sender, EventArgs e ) {
const int COUNT = 10;
TableLayoutPanel pnlContent = new TableLayoutPanel();
pnlContent.Dock = DockStyle.Fill;
pnlContent.AutoScroll = true;
pnlContent.AutoScrollMargin = new Size( 1, 1 );
pnlContent.AutoScrollMinSize = new Size( 1, 1 );
pnlContent.RowCount = COUNT;
pnlContent.ColumnCount = 3;
for ( int i = 0; i < pnlContent.ColumnCount; i++ ) {
pnlContent.ColumnStyles.Add( new ColumnStyle() );
}
pnlContent.ColumnStyles[0].Width = 100;
pnlContent.ColumnStyles[1].Width = 5;
pnlContent.ColumnStyles[2].SizeType = SizeType.Percent;
pnlContent.ColumnStyles[2].Width = 100;
this.Controls.Add( pnlContent );
for ( int i = 0; i < COUNT; i++ ) {
pnlContent.RowStyles.Add( new RowStyle( SizeType.Absolute, 20 ) );
Label lblTitle = new Label();
lblTitle.Text = string.Format( "Row {0}:", i + 1 );
lblTitle.TabIndex = (i * 2);
lblTitle.Margin = new Padding( 0 );
lblTitle.Dock = DockStyle.Fill;
pnlContent.Controls.Add( lblTitle, 0, i );
TextBox txtValue = new TextBox();
txtValue.TabIndex = (i * 2) + 1;
txtValue.Margin = new Padding( 0 );
txtValue.Dock = DockStyle.Fill;
txtValue.KeyDown += new KeyEventHandler( txtValue_KeyDown );
pnlContent.Controls.Add( txtValue, 2, i );
}
}
void txtValue_KeyDown( object sender, KeyEventArgs e ) {
if ( e.KeyCode == Keys.Enter ) {
SendKeys.Send( "{TAB}" );
}
}
【讨论】:
另外,在添加一些控件后检查窗口/用户控件的生成代码。它应该让您很好地了解如何动态完成此操作。 (我说的是 somename.cs.designer 文件)
【讨论】: