none
Zオーダーが設定できない RRS feed

  • 質問

  • お世話になっております。

    表題の通りですが、手動でコントロールを追加した時に、コントロールが背面に行ってしまいます。

    以下がソースです。

    Form1

        private void Form1_Load(object sender, EventArgs e)
            {
                Label lbl = new Label();
                lbl.Text = "test";
                lbl.Top = 70;
                lbl.Left = 90;
    
                this.panel1.Controls.Add(lbl);
    
            }

    デザイナ

        partial class Form1
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null)) {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Windows Form Designer generated code
    
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.panel1 = new System.Windows.Forms.Panel();
                this.pictureBox1 = new System.Windows.Forms.PictureBox();
                this.label1 = new System.Windows.Forms.Label();
                this.panel1.SuspendLayout();
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
                this.SuspendLayout();
                // 
                // panel1
                // 
                this.panel1.AutoScroll = true;
                this.panel1.Controls.Add(this.label1);
                this.panel1.Controls.Add(this.pictureBox1);
                this.panel1.Location = new System.Drawing.Point(26, 23);
                this.panel1.Name = "panel1";
                this.panel1.Size = new System.Drawing.Size(364, 285);
                this.panel1.TabIndex = 0;
                // 
                // pictureBox1
                // 
                this.pictureBox1.Location = new System.Drawing.Point(100, 77);
                this.pictureBox1.Name = "pictureBox1";
                this.pictureBox1.Size = new System.Drawing.Size(100, 50);
                this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
                this.pictureBox1.TabIndex = 0;
                this.pictureBox1.TabStop = false;
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(143, 89);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(35, 12);
                this.label1.TabIndex = 1;
                this.label1.Text = "label1";
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(402, 324);
                this.Controls.Add(this.panel1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
                this.panel1.ResumeLayout(false);
                this.panel1.PerformLayout();
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
            private System.Windows.Forms.Panel panel1;
            private System.Windows.Forms.PictureBox pictureBox1;
            private System.Windows.Forms.Label label1;
        }

    デザイナで登録したときは、ピクチャボックスの上に出るのに、フォームロード時では下に行ってしまいます。

    また、lbl.BringToFront(); としても全面に移動しません。

    どうか、ご教示ください。


    2015年3月24日 5:48

回答

  • こんにちは。
    Addの後であれば前面に来ませんか?

    this.panel1.Controls.Add(lbl);
    lbl.BringToFront();

    • 回答としてマーク コーベル 2015年3月24日 6:46
    2015年3月24日 6:28
    モデレータ
  • あれ、何故でしょう・・・できそうなんですが。

    private void Form1_Load(object sender, EventArgs e)
    {
        panel1.BackColor = Color.Pink;          //add
        pictureBox1.BackColor = Color.Yellow;   //add
    
        Label lbl = new Label();
        lbl.Text = "test";
        lbl.Top = 70;
        lbl.Left = 90;
    
        this.panel1.Controls.Add(lbl);
    
        //add
        lbl.BringToFront();
    }

    #できましたか。良かったです。
    2015年3月24日 6:45
    モデレータ
  • >デザイナで登録したときは、ピクチャボックスの上に出るのに、フォームロード時では下に行ってしまいます。

    についても解決されましたでしょうか? 勘違いならそれで良いのですが、通常では引用しているような現象は発生しません。
    表示は追加された順に上から表示されます。
    この辺りを変更するのがBringToFrontメソッドですが、SetChildIndexメソッドを使うこともできます。例えば、
    panel1.Controls.SetChildIndex(lbl, 1);
    のような感じです。
    同様に、GetChildIndexで現在の表示順を取得できますので、参考にしてみて下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク コーベル 2015年3月25日 1:51
    2015年3月24日 9:16
    モデレータ

すべての返信

  • Form的に見れば、自分の子コントロールはpanel1・pictureBox1・label1のみであり、Loadイベントで追加されたlblはFormにおける配置の担当外です。lblはpanel1の子コントロールなので、lblの配置はpanel1が担当します。

    配置は再帰的に行うので、Formがpanel1を配置する→panel1はlblを配置する→FormがpictureBox1を配置するという手順になり、当然lblはpictureBox1よりも後ろになります。

    lbl.BringToFrontにしても、親コントロールであるpanel1の子コントロール群の中で先頭にもってくるという意味であり、Formから見た場合の配置順には影響を及ぼしません。


    <追記>割と見当違いでしたので、本投稿は無視してください。</追記>
    • 編集済み Hongliang 2015年3月24日 6:37
    2015年3月24日 6:08
  • こんにちは。
    Addの後であれば前面に来ませんか?

    this.panel1.Controls.Add(lbl);
    lbl.BringToFront();

    • 回答としてマーク コーベル 2015年3月24日 6:46
    2015年3月24日 6:28
    モデレータ
  • Hongliangさん

    ご回答ありがとうございます。

    内容は理解できたのですが

    Form的に見れば、自分の子コントロールはpanel1・pictureBox1・label1のみであり

    は、子コントロールは、panel1のみで
    panel1に、ピクチャーボックスとラベルが乗っているのではないのですか?

    this.panel1.Controls.Add(this.label1);
    this.panel1.Controls.Add(this.pictureBox1);

    そこに更に、フォームロードでlblを追加しているので、BringToFrontによって
    pictureBox⇒label1⇒lbl
    となると思っています。

    ご教示ください。

    2015年3月24日 6:34
  • Tak1waさん

    ご回答ありがとうございます。

    やってみましたが、見えません。

    何が悪いのでしょうか。

    2015年3月24日 6:40
  • Tak1waさん

    ご回答ありがとうございます。

    すみません、コーディングミスでした、全面に来ました!

    ありがとうございました!!

    配置する前に、全面に持ってきても意味ないですもんね

    すみません、凡ミスでしたーー;

    2015年3月24日 6:42
  • あれ、何故でしょう・・・できそうなんですが。

    private void Form1_Load(object sender, EventArgs e)
    {
        panel1.BackColor = Color.Pink;          //add
        pictureBox1.BackColor = Color.Yellow;   //add
    
        Label lbl = new Label();
        lbl.Text = "test";
        lbl.Top = 70;
        lbl.Left = 90;
    
        this.panel1.Controls.Add(lbl);
    
        //add
        lbl.BringToFront();
    }

    #できましたか。良かったです。
    2015年3月24日 6:45
    モデレータ
  • >デザイナで登録したときは、ピクチャボックスの上に出るのに、フォームロード時では下に行ってしまいます。

    についても解決されましたでしょうか? 勘違いならそれで良いのですが、通常では引用しているような現象は発生しません。
    表示は追加された順に上から表示されます。
    この辺りを変更するのがBringToFrontメソッドですが、SetChildIndexメソッドを使うこともできます。例えば、
    panel1.Controls.SetChildIndex(lbl, 1);
    のような感じです。
    同様に、GetChildIndexで現在の表示順を取得できますので、参考にしてみて下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク コーベル 2015年3月25日 1:51
    2015年3月24日 9:16
    モデレータ
  • trapemiyaさん

    いつも勉強させて頂いております。

    panel1.Controls.SetChildIndex(lbl, 1);

    こんな便利なメソッドがあったのですね、ありがとうございます
    活用させて頂きます!

    2015年3月25日 1:51