82862


以下の画像の逆で0が一番上にくるようにしたいのですが、逆になってしまいます。  
どのようにプロパティを設定すればうまくいくのでしょうか？

環境: c# .Net Framework 4.8

[code]

    using System.Windows.Forms;
    
    namespace WindowsFormsApp3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                for (int i = 0; i < 10; i++)
                {
                    TextBox textBox = new TextBox
                    {
                        Dock = DockStyle.Top,
                        Text = i.ToString()
                    };
    
                    this.panel1.Controls.Add(textBox);
                }
            }
        }
    }
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/fCBCl.png)](https://i.stack.imgur.com/fCBCl.png)


CC BY-SA 4.0
2021-10-04T01:57:01.020
82856
2021-10-04T06:12:52.507
40856
question
c# .net
.NetでControlのDockStyle.Topを使ってControlを上に詰めていきたいが、逆になってしまう。


`Add`による通常の挿入では既存の子コントロールより上に配置されてしまうため、解法のような対策があります。

  1. コントロールを`Add`した時に`BringToFrontで一番下に持っていく
  2. `Controls`は配列なので、任意のコントロールを配列から取得し、`SetChildIndex`で任意のインデックスに挿入する
  3. `for (int i = 0; i < 10; i++)`の代わりに`for(int i = 9; i >= 0; i--)`またはそれと類似のロジックを使用する

**サンプルコード**

[code]

    using System;
    using System.Data;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                for (int i = 0; i < 10; i++)
                {
                    TextBox textBox = new TextBox
                    {
                        Dock = DockStyle.Top,
                        Text = i.ToString()
                    };
    
                    this.panel1.Controls.Add(textBox);
                    // 解法1: コントロールを一番下に持っていく
                    textBox.BringToFront();
                }
                // 解法2: インデックスを入れ替えて配置換えする(下はインデックス1と8を入れ替える例)
                var index1 = panel1.Controls[1];
                panel1.Controls.SetChildIndex(index1, 8);
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                panel1.Controls.Clear();
                // 解法3: 単純に逆順でコントロールを挿入する
                // ※下記の Range(0, 10).Reverse() と Controls.AddRange は for(int i = 9; i >= 0; i--) と同様に動作する
                var textBoxes = Enumerable.Range(0, 10).Reverse().Select(i => new TextBox { Dock = DockStyle.Top, Text = i.ToString() }).ToArray();
                panel1.Controls.AddRange(textBoxes);
            }
        }
    }
    
[/code]

**参考資料**

[Windowsフォームでコントロールの配置や重なりを調整するには？](https://atmarkit.itmedia.co.jp/ait/articles/0505/13/news116.html)


CC BY-SA 4.0
2021-10-04T02:28:18.790
82862
2021-10-04T03:55:02.277
2021-10-04T03:55:02.277
9820
9820
82856
answer


Panelでの解法はpayanecoさんが回答されているので割愛しますが、他にもTableLayoutPanelやFlowLayoutPanel等のコントロールを決まった並べ方をするのに適したコンテナもありますので、それらを使った方法を紹介しておきます。

[code]

    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
    
                InitializeComponent();
    
                for (int i = 0; i < 10; i++)
                {
                    TextBox textBox = new TextBox
                    {
                        Dock = DockStyle.Top,
                        Text = i.ToString()
                    };
    
                    this.panel1.Controls.Add(textBox);
                }
    
                //TableLayoutPanel
                tableLayoutPanel1.ColumnStyles.Clear();
                tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
                tableLayoutPanel1.RowStyles.Clear();
                for (int i = 0; i < 10; i++)
                {
                    TextBox textBox = new TextBox
                    {
                        Dock = DockStyle.Top,
                        Text = i.ToString(),
                        Margin = new Padding(0, 0, 0, 0)
                    };
                    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, textBox.Height));
                    tableLayoutPanel1.Controls.Add(textBox, 0, i);
                }
    
                //FlowLayoutPanel
                flowLayoutPanel1.FlowDirection = FlowDirection.TopDown;
                for (int i = 0; i < 10; i++)
                {
                    TextBox textBox = new TextBox
                    {
                        Width = flowLayoutPanel1.ClientRectangle.Width,
                        Text = i.ToString(),
                        Margin = new Padding(0, 0, 0, 0)
                    };
                    flowLayoutPanel1.Controls.Add(textBox);
                }
            }
        }
    }
    
[/code]

[![実行結果](https://i.stack.imgur.com/EgQtf.png)](https://i.stack.imgur.com/EgQtf.png)


CC BY-SA 4.0
2021-10-04T06:12:52.507
82866
2021-10-04T06:12:52.507
41943
82856
answer