【问题标题】:WinForms: variable number of dynamic TextBox controlsWinForms:可变数量的动态文本框控件
【发布时间】:2009-04-06 14:19:26
【问题描述】:

我必须创建可变数量的标签,并在它们旁边创建文本框控件 - 将整个内容排列成一列,每行一个标签和一个文本框。如果我的主窗口小于所有 TextBox 控件的总高度,不知何故我需要一个可以滚动 TextBoxes 列表的滚动条。按回车键必须将焦点转移到下一个文本框,并且在文本框过多的情况下也需要滚动。

这是一个相当普遍的问题,我想已经有一些预先准备好的解决方案。

有什么建议吗?

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    使用TableLayoutPanel。您可以动态添加控件specify their row/column,它会为您维护一个滚动条(使用适当的设置)。它有其怪癖,但应该适合这种情况。

    如果您使用 WinForms 设计器来放置 TableLayoutPanel,那么您也可以使用它来定义列的样式。您还可以按照 Tcks 的建议改变每一行的样式。

    添加具有指定行/列的控件:

    int column = 42;
    int row = 7;
    myTableLayoutPanel.Controls.Add(new TextBox(), column, row);
    

    【讨论】:

      【解决方案2】:

      您可以使用 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}" );
          }
      }
      

      【讨论】:

        【解决方案3】:

        另外,在添加一些控件后检查窗口/用户控件的生成代码。它应该让您很好地了解如何动态完成此操作。 (我说的是 somename.cs.designer 文件)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          相关资源
          最近更新 更多