質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

フォームデザイナーでコントロールを追加ではなく、コードで追加したLabelのテキスト内容が画面上に反映されない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 326

ryota_2000

score 3

コード

namespace RubikCube
{
    public partial class RubikCubeForm : Form
    {
        private SetupForm _setupForm;
        private Label[] digitLabel;
        private Button[] moveVerticalUpButton;
        private Button[] moveVerticalDownButton;
        private Button[] moveHorizonLeftButton;
        private Button[] moveHorizonRightButton;
        private bool IsClickButton = false;
        private int _rubiksize;
        private int _digitLabelSize;
        public RubikCubeForm()
        {
            _setupForm = new SetupForm();
            _setupForm.ShowDialog();
            InitializeComponent();
        }

        private void RubikCubeForm_Load(object sender, EventArgs e)
        {
            if (!IsClickButton)
            {
                _rubiksize = int.Parse(_setupForm._rubikSize);
                _tempDigitLabel = new string[_rubiksize];
                CreateRubikCube();
            }
        }


        private void backToSetupbutton_Click(object sender, EventArgs e)
        {
            IsClickButton=false;
            _setupForm.ShowDialog();
        }

        private void CreateRubikCube()
        {
            int tempCreateRubikCube = _rubiksize / 2;
            _digitLabelSize = 50;
            var startDigitLabelX = Width / 2 - (tempCreateRubikCube * _digitLabelSize);
            var startDigitLabelY = Height / 2 - (tempCreateRubikCube * _digitLabelSize) - 50;
            digitLabel = new Label[_rubiksize * _rubiksize];
            moveVerticalUpButton = new Button[_rubiksize];
            moveVerticalDownButton = new Button[_rubiksize];
            moveHorizonLeftButton = new Button[_rubiksize];
            moveHorizonRightButton = new Button[_rubiksize];
            SuspendLayout();
            for (var i = 0; i < _rubiksize; i++)
       {
                for (var j = 0; j < _rubiksize; j++)
                {

                        //数字配置
                        digitLabel[j + _rubiksize * i] = new Label();
                        digitLabel[j + _rubiksize * i].Text = (1 + j + _rubiksize * i).ToString();
                        digitLabel[j + _rubiksize * i].Location = new Point(startDigitLabelX + j * _digitLabelSize,
                                      startDigitLabelY + i * _digitLabelSize);
                        digitLabel[j + _rubiksize * i].Size = new Size(_digitLabelSize, _digitLabelSize);
                        digitLabel[j + _rubiksize * i].TextAlign = ContentAlignment.MiddleCenter;
                        digitLabel[j + _rubiksize * i].Font = new Font("MS UI Gothic", 18, FontStyle.Bold);
                        Controls.Add(digitLabel[j + _rubiksize * i]);

                    }
                    //ボタン配置
                    //上
                    moveVerticalUpButton[i] = new Button();
                    moveVerticalUpButton[i].Text = "↓";
                    moveVerticalUpButton[i].Name = i.ToString();
                    moveVerticalUpButton[i].Location =
                            new Point(startDigitLabelX + i * _digitLabelSize,
                                      startDigitLabelY - _digitLabelSize);
                    moveVerticalUpButton[i].Size = new Size(_digitLabelSize, _digitLabelSize);
                    moveVerticalUpButton[i].TextAlign = ContentAlignment.MiddleCenter;
                    moveVerticalUpButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular);
                    moveVerticalUpButton[i].Click += new EventHandler(MoveUp_Click);
                    //下
                    moveVerticalDownButton[i] = new Button();
                    moveVerticalDownButton[i].Text = "↑";
                    moveVerticalDownButton[i].Name = i.ToString();
                    moveVerticalDownButton[i].Location =
                            new Point(startDigitLabelX + i * _digitLabelSize,
                                      startDigitLabelY + (_rubiksize * _digitLabelSize));
                    moveVerticalDownButton[i].Size = new Size(_digitLabelSize, _digitLabelSize);
                    moveVerticalDownButton[i].TextAlign = ContentAlignment.MiddleCenter;
                    moveVerticalDownButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular);
                    moveVerticalDownButton[i].Click += new EventHandler(MoveDown_Click);
                    //左
                    moveHorizonLeftButton[i] = new Button();
                    moveHorizonLeftButton[i].Text = "→";
                    moveHorizonLeftButton[i].Name = i.ToString();
                    moveHorizonLeftButton[i].Location =
                            new Point(startDigitLabelX - _digitLabelSize,
                                      startDigitLabelY + i * _digitLabelSize);
                    moveHorizonLeftButton[i].Size = new Size(_digitLabelSize, _digitLabelSize);
                    moveHorizonLeftButton[i].TextAlign = ContentAlignment.MiddleCenter;
                    moveHorizonLeftButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular);
                    moveHorizonLeftButton[i].Click += new EventHandler(MoveLeft_Click);
                    //右
                    moveHorizonRightButton[i] = new Button();
                    moveHorizonRightButton[i].Text = "←";
                    moveHorizonRightButton[i].Name = i.ToString();
                    moveHorizonRightButton[i].Location =
                            new Point(startDigitLabelX + (_rubiksize * _digitLabelSize),
                                      startDigitLabelY + i * _digitLabelSize);
                    moveHorizonRightButton[i].Size = new Size(_digitLabelSize, _digitLabelSize);
                    moveHorizonRightButton[i].TextAlign = ContentAlignment.MiddleCenter;
                    moveHorizonRightButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular);
                    moveHorizonRightButton[i].Click += new EventHandler(MoveRight_Click);
                }
            Controls.AddRange(moveVerticalUpButton);
            Controls.AddRange(moveVerticalDownButton);
            Controls.AddRange(moveHorizonLeftButton);
            Controls.AddRange(moveHorizonRightButton);
            ResumeLayout();
        }

        private int _clickButtonNum;
        private string[] _tempDigitLabel;
        private void MoveUp_Click(object sender, EventArgs e)
        {
            IsClickButton = true;
            _clickButtonNum = int.Parse(((Button)sender).Name);
            label2.Text = ((Button)sender).Name;
            for (var i = 0; i < _rubiksize; i++)
            {
                _tempDigitLabel[i] = digitLabel[_clickButtonNum + i * _rubiksize].Text;
            }
            for (var i = 0; i < _rubiksize; i++)
            {
                if (i == 0)
                {
                    digitLabel[_clickButtonNum + i * _rubiksize].Text = _tempDigitLabel[_rubiksize - 1];
                }
                else
                    digitLabel[_clickButtonNum + i * _rubiksize].Text = _tempDigitLabel[i - 1];

            }
        }

        private void MoveDown_Click(object sender, EventArgs e)
        {

        }

        private void MoveLeft_Click(object sender, EventArgs e)
        {

        }

        private void MoveRight_Click(object sender, EventArgs e)
        {

        }

    }
}


InitializeComponentメソッド内(コントロールは省略しています)

   // RubikCubeForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(27F, 48F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(778, 644);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.backToSetupbutton);
            this.Controls.Add(this.resetbutton);
            this.Font = new System.Drawing.Font("MS UI Gothic", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
            this.Margin = new System.Windows.Forms.Padding(9, 8, 9, 8);
            this.Name = "RubikCubeForm";
            this.StartPosition = 
            System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "RubikCubeForm";

           // this.Activated += new System.EventHandler(this.RubikCubeForm_Load);

            this.Load += new System.EventHandler(this.RubikCubeForm_Load);
            this.ResumeLayout(false);
            this.PerformLayout();


```### 前提・実現したいこと
今年のLINEのインターンシップのコーディングテストであったような二次元ルービックキューブを作ろうとしており、動作としては、各列・行にあるボタンをクリックするとクリックした列もしくは行が縦・横に一つずつずれるというものです。しかし上に配置したボタン(Text="↓"のボタンです)をクリックしても列がずれません。ずれるはずの列の各Label(ここではdigitLabel)のTextプロパティの文字はしっかりとずれているのですが画面上に反映されません。
どうすれば画面も反映されるでしょうか。

お詳しいかたお助けください。

追記
ここに出していないコードに問題がありました。というのも、子フォーム(ここでいうsetupForm)で再びサイズ変更をできるようにしようとしており、子フォームで設定したサイズをもとに親フォームの画面も更新させる、ということでActiveになったら発生するActivatedイベントにもRubikCubeForm_Loadメソッドを追加していました。そのActivatedにも追加している文を削除したらうまくいきました。しかし、そこで新たな質問が生まれてしまいました。。なぜ、Activatedに追加するとうまくいかなかったのでしょうか。Activatedの解釈が間違っていますか。質問に追加します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2020/06/19 10:09

    実際に動作させて見ましたが、表示は変わりました。

    キャンセル

  • Daregada

    2020/06/19 11:08 編集

    矢印の向きが謎ですよね。
    それはまあいいとして、「不足している部分を推測しつつ」、手元の
    Visual Studioでコードを組んでみたら、何事もなく画面上でラベルの数値が縦にローテーションしているので、ここに出してないコードに問題があるのでは。

    キャンセル

  • ryota_2000

    2020/06/19 14:04

    ここに出していないコードに問題がありました。というのも、子フォーム(ここでいうsetupForm)で再びサイズ変更をできるようにしようとしており、子フォームで設定したサイズをもとに親フォームの画面も更新させる、ということでActivatedイベントにもRubikCubeForm_Loadメソッドを追加していました。そのActivatedにも追加している文を削除したらうまくいきました。しかし、そこで新たな質問が生まれてしまいました。。なぜ、Activatedに追加するとうまくいかなかったのでしょうか。質問に追加します。

    キャンセル

回答 1

checkベストアンサー

+1

手元で動かしたところ、↓ボタンで下にずれました(SetupFormlabel2に関連するところのコメント化、Load += RubikCubeForm_Loadの追加)

CreateRubikCube()もしくはRubikCubeForm_Load()を複数回呼んでいませんか?
ラベルが重なって、変更されたラベルが見えていない可能性があります。

あと、

for(var i = 0; i < _rubiksize; i++)
    for(var j = 0; j < _rubiksize; j++)
    {
        {
            //数字配置

        }
        //ボタン配置

    }


ここは、

for(var i = 0; i < _rubikSize; i++)
{
    for(var j = 0; j < _rubikSize; j++)
    {
        //数字配置

    }
    //ボタン配置

}


こうですよね?
ボタンが_rubikSize倍、無駄に作られます。捨てているので動作自体には影響しないはずですが。


コメントを受けての追記
すでに作っていたら削除するのがお手軽でしょうか。

private void CreateRubikCube()
{
    if(digitLabel != null)
    {
        //数字削除
        foreach(var label in digitLabel)
        {
            Controls.Remove(label);
        }
    }
    if(moveVerticalUpButton != null)
    {
        //上ボタン削除
        foreach(var button in moveVerticalUpButton)
        {
            button.Click -= new EventHandler(MoveUp_Click);
            Controls.Remove(button);
        }
    }
    //下左右ボタンも同様

    //以下元の作成コード
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/19 14:04

    ここに出していないコードに問題がありました。というのも、子フォーム(ここでいうsetupForm)で再びサイズ変更をできるようにしようとしており、子フォームで設定したサイズをもとに親フォームの画面も更新させる、ということでActivatedイベントにもRubikCubeForm_Loadメソッドを追加していました。そのActivatedにも追加している文を削除したらうまくいきました。しかし、そこで新たな質問が生まれてしまいました。。なぜ、Activatedに追加するとうまくいかなかったのでしょうか。質問に追加します。

    キャンセル

  • 2020/06/19 14:35

    回答者さんのコードを追加したらうまくいきました!!ありがとうございました!!ずっと悩んでいたので本当に助かりました~~

    キャンセル

  • 2020/06/19 14:38 編集

    ええと、Controls.Addした大量のラベルとボタンをフォームに残したまま、さらにラベルとボタンを追加することになる点は理解されていますか? ってもう解決してたわ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • フォームデザイナーでコントロールを追加ではなく、コードで追加したLabelのテキスト内容が画面上に反映されない