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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

3013閲覧

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

ryota_2000

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

1グッド

0クリップ

投稿2020/06/18 16:52

編集2020/06/19 05:18

コード

C#

1namespace RubikCube 2{ 3 public partial class RubikCubeForm : Form 4 { 5 private SetupForm _setupForm; 6 private Label[] digitLabel; 7 private Button[] moveVerticalUpButton; 8 private Button[] moveVerticalDownButton; 9 private Button[] moveHorizonLeftButton; 10 private Button[] moveHorizonRightButton; 11 private bool IsClickButton = false; 12 private int _rubiksize; 13 private int _digitLabelSize; 14 public RubikCubeForm() 15 { 16 _setupForm = new SetupForm(); 17 _setupForm.ShowDialog(); 18 InitializeComponent(); 19 } 20 21 private void RubikCubeForm_Load(object sender, EventArgs e) 22 { 23 if (!IsClickButton) 24 { 25 _rubiksize = int.Parse(_setupForm._rubikSize); 26 _tempDigitLabel = new string[_rubiksize]; 27 CreateRubikCube(); 28 } 29 } 30 31 32 private void backToSetupbutton_Click(object sender, EventArgs e) 33 { 34 IsClickButton=false; 35 _setupForm.ShowDialog(); 36 } 37 38 private void CreateRubikCube() 39 { 40 int tempCreateRubikCube = _rubiksize / 2; 41 _digitLabelSize = 50; 42 var startDigitLabelX = Width / 2 - (tempCreateRubikCube * _digitLabelSize); 43 var startDigitLabelY = Height / 2 - (tempCreateRubikCube * _digitLabelSize) - 50; 44 digitLabel = new Label[_rubiksize * _rubiksize]; 45 moveVerticalUpButton = new Button[_rubiksize]; 46 moveVerticalDownButton = new Button[_rubiksize]; 47 moveHorizonLeftButton = new Button[_rubiksize]; 48 moveHorizonRightButton = new Button[_rubiksize]; 49 SuspendLayout(); 50 for (var i = 0; i < _rubiksize; i++) 51       { 52 for (var j = 0; j < _rubiksize; j++) 53 { 54 55 //数字配置 56 digitLabel[j + _rubiksize * i] = new Label(); 57 digitLabel[j + _rubiksize * i].Text = (1 + j + _rubiksize * i).ToString(); 58 digitLabel[j + _rubiksize * i].Location = new Point(startDigitLabelX + j * _digitLabelSize, 59 startDigitLabelY + i * _digitLabelSize); 60 digitLabel[j + _rubiksize * i].Size = new Size(_digitLabelSize, _digitLabelSize); 61 digitLabel[j + _rubiksize * i].TextAlign = ContentAlignment.MiddleCenter; 62 digitLabel[j + _rubiksize * i].Font = new Font("MS UI Gothic", 18, FontStyle.Bold); 63 Controls.Add(digitLabel[j + _rubiksize * i]); 64 65 } 66 //ボタン配置 67 //上 68 moveVerticalUpButton[i] = new Button(); 69 moveVerticalUpButton[i].Text = "↓"; 70 moveVerticalUpButton[i].Name = i.ToString(); 71 moveVerticalUpButton[i].Location = 72 new Point(startDigitLabelX + i * _digitLabelSize, 73 startDigitLabelY - _digitLabelSize); 74 moveVerticalUpButton[i].Size = new Size(_digitLabelSize, _digitLabelSize); 75 moveVerticalUpButton[i].TextAlign = ContentAlignment.MiddleCenter; 76 moveVerticalUpButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular); 77 moveVerticalUpButton[i].Click += new EventHandler(MoveUp_Click); 78 //下 79 moveVerticalDownButton[i] = new Button(); 80 moveVerticalDownButton[i].Text = "↑"; 81 moveVerticalDownButton[i].Name = i.ToString(); 82 moveVerticalDownButton[i].Location = 83 new Point(startDigitLabelX + i * _digitLabelSize, 84 startDigitLabelY + (_rubiksize * _digitLabelSize)); 85 moveVerticalDownButton[i].Size = new Size(_digitLabelSize, _digitLabelSize); 86 moveVerticalDownButton[i].TextAlign = ContentAlignment.MiddleCenter; 87 moveVerticalDownButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular); 88 moveVerticalDownButton[i].Click += new EventHandler(MoveDown_Click); 89 //左 90 moveHorizonLeftButton[i] = new Button(); 91 moveHorizonLeftButton[i].Text = "→"; 92 moveHorizonLeftButton[i].Name = i.ToString(); 93 moveHorizonLeftButton[i].Location = 94 new Point(startDigitLabelX - _digitLabelSize, 95 startDigitLabelY + i * _digitLabelSize); 96 moveHorizonLeftButton[i].Size = new Size(_digitLabelSize, _digitLabelSize); 97 moveHorizonLeftButton[i].TextAlign = ContentAlignment.MiddleCenter; 98 moveHorizonLeftButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular); 99 moveHorizonLeftButton[i].Click += new EventHandler(MoveLeft_Click); 100 //右 101 moveHorizonRightButton[i] = new Button(); 102 moveHorizonRightButton[i].Text = "←"; 103 moveHorizonRightButton[i].Name = i.ToString(); 104 moveHorizonRightButton[i].Location = 105 new Point(startDigitLabelX + (_rubiksize * _digitLabelSize), 106 startDigitLabelY + i * _digitLabelSize); 107 moveHorizonRightButton[i].Size = new Size(_digitLabelSize, _digitLabelSize); 108 moveHorizonRightButton[i].TextAlign = ContentAlignment.MiddleCenter; 109 moveHorizonRightButton[i].Font = new Font("MS UI Gothic", 18, FontStyle.Regular); 110 moveHorizonRightButton[i].Click += new EventHandler(MoveRight_Click); 111 } 112 Controls.AddRange(moveVerticalUpButton); 113 Controls.AddRange(moveVerticalDownButton); 114 Controls.AddRange(moveHorizonLeftButton); 115 Controls.AddRange(moveHorizonRightButton); 116 ResumeLayout(); 117 } 118 119 private int _clickButtonNum; 120 private string[] _tempDigitLabel; 121 private void MoveUp_Click(object sender, EventArgs e) 122 { 123 IsClickButton = true; 124 _clickButtonNum = int.Parse(((Button)sender).Name); 125 label2.Text = ((Button)sender).Name; 126 for (var i = 0; i < _rubiksize; i++) 127 { 128 _tempDigitLabel[i] = digitLabel[_clickButtonNum + i * _rubiksize].Text; 129 } 130 for (var i = 0; i < _rubiksize; i++) 131 { 132 if (i == 0) 133 { 134 digitLabel[_clickButtonNum + i * _rubiksize].Text = _tempDigitLabel[_rubiksize - 1]; 135 } 136 else 137 digitLabel[_clickButtonNum + i * _rubiksize].Text = _tempDigitLabel[i - 1]; 138 139 } 140 } 141 142 private void MoveDown_Click(object sender, EventArgs e) 143 { 144 145 } 146 147 private void MoveLeft_Click(object sender, EventArgs e) 148 { 149 150 } 151 152 private void MoveRight_Click(object sender, EventArgs e) 153 { 154 155 } 156 157 } 158}

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

C#

1 // RubikCubeForm 2 // 3 this.AutoScaleDimensions = new System.Drawing.SizeF(27F, 48F); 4 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 5 this.ClientSize = new System.Drawing.Size(778, 644); 6 this.Controls.Add(this.label2); 7 this.Controls.Add(this.label1); 8 this.Controls.Add(this.backToSetupbutton); 9 this.Controls.Add(this.resetbutton); 10 this.Font = new System.Drawing.Font("MS UI Gothic", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(128))); 11 this.Margin = new System.Windows.Forms.Padding(9, 8, 9, 8); 12 this.Name = "RubikCubeForm"; 13 this.StartPosition = 14 System.Windows.Forms.FormStartPosition.CenterScreen; 15 this.Text = "RubikCubeForm"; 16 17 // this.Activated += new System.EventHandler(this.RubikCubeForm_Load); 18 19 this.Load += new System.EventHandler(this.RubikCubeForm_Load); 20 this.ResumeLayout(false); 21 this.PerformLayout(); 22 23
今年のLINEのインターンシップのコーディングテストであったような二次元ルービックキューブを作ろうとしており、動作としては、各列・行にあるボタンをクリックするとクリックした列もしくは行が縦・横に一つずつずれるというものです。しかし上に配置したボタン(Text="↓"のボタンです)をクリックしても列がずれません。ずれるはずの列の各Label(ここではdigitLabel)のTextプロパティの文字はしっかりとずれているのですが画面上に反映されません。 どうすれば画面も反映されるでしょうか。 お詳しいかたお助けください。 追記 ここに出していないコードに問題がありました。というのも、子フォーム(ここでいうsetupForm)で再びサイズ変更をできるようにしようとしており、子フォームで設定したサイズをもとに親フォームの画面も更新させる、ということでActiveになったら発生するActivatedイベントにもRubikCubeForm_Loadメソッドを追加していました。そのActivatedにも追加している文を削除したらうまくいきました。しかし、そこで新たな質問が生まれてしまいました。。なぜ、Activatedに追加するとうまくいかなかったのでしょうか。Activatedの解釈が間違っていますか。質問に追加します。
TN8001👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/18 22:11

コードは ``` と ``` で囲ってください (``` はバッククォート 3 つ)。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 赤の他人の閲覧者・回答者はなおさらです。
退会済みユーザー

退会済みユーザー

2020/06/18 22:21 編集

コードは全く見てませんが・・・ Label にコードでなにか変化を与えても表示に変化がないということだと理解してますが、変化を与えたコードの直後に Application.DoEvents() を一行入れて実行させたらどうなりますか?
YAmaGNZ

2020/06/18 23:05 編集

イベントハンドラに何も書いてないからボタンを押しても何も起こらないのは当たり前なのではないですか? って、画面の上にあるからMoveUpなのか・・・下にずらす処理だろうからMoveDownかと思ってました
YAmaGNZ

2020/06/19 01:09

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

2020/06/19 02:08 編集

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

2020/06/19 05:04

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

回答1

0

ベストアンサー

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

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

あと、

cs

1for(var i = 0; i < _rubiksize; i++) 2 for(var j = 0; j < _rubiksize; j++) 3 { 4 { 5 //数字配置 6 7 } 8 //ボタン配置 9 10 }

ここは、

cs

1for(var i = 0; i < _rubikSize; i++) 2{ 3 for(var j = 0; j < _rubikSize; j++) 4 { 5 //数字配置 6 7 } 8 //ボタン配置 9 10}

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


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

cs

1private void CreateRubikCube() 2{ 3 if(digitLabel != null) 4 { 5 //数字削除 6 foreach(var label in digitLabel) 7 { 8 Controls.Remove(label); 9 } 10 } 11 if(moveVerticalUpButton != null) 12 { 13 //上ボタン削除 14 foreach(var button in moveVerticalUpButton) 15 { 16 button.Click -= new EventHandler(MoveUp_Click); 17 Controls.Remove(button); 18 } 19 } 20 //下左右ボタンも同様 21 22 //以下元の作成コード 23}

投稿2020/06/19 03:22

編集2023/07/22 07:48
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryota_2000

2020/06/19 05:04

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

2020/06/19 05:35

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

2020/06/19 05:39 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問