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

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

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

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

Q&A

解決済

2回答

1188閲覧

PictureBoxをデザインフォームで宣言せずに、ソース内部で2次元配列を使って宣言し、宣言したPictureBoxをフォームで表示されるようにしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2022/11/16 07:44

編集2022/11/17 02:13

前提

C#でテトリスを作っています。
テトリミノを表示する機能を実装中に以下の実現したいことが発生しました。
このようなソースがあるのですが、理解できなかったです。

namespace Tetris { internal class DataClass { internal class Storage : IEquatable<Storage> { internal bool Equals(Storage other) { throw new NotImplementedException(); } internal int PartId { get; set; } } internal List<Storage> piece = new List<Storage>(); } }

実現したいこと

  • PictureBoxをデザインフォームの方で作らずに、ソースで作って表示をしたい。

発生している問題・エラーメッセージ

ありません。

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.IO; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace Tetris 13{ 14 internal partial class Form1 : Form 15 { 16 //定数 17 private const byte length = 26;//フィールド用。縦の長さ 18 private const byte width = 12;//フィールド用。横の長さ 19 20 //画面に表示するためのPictureBox 21 internal PictureBox[,] gameBoard_P; 22 23 internal Form1() 24 { 25 InitializeComponent(); 26 } 27 28 //DataClassをnewして呼び出して使えるようにする 29 private static DataClass dataClass = new DataClass(); 30 31 //フォームのロード時に呼ばれるメソッド 32 private void Form1_Load(object sender, EventArgs e) 33 { 34 Initialization(sender, e); 35 } 36 37 //初期化用メソッド 38 private void Initialization(object sender, EventArgs e) 39 { 40 dataClass.GameBoardFormat(); 41 42 //PictureBoxのインスタンス 43 this.gameBoard_P = new PictureBox[length, width]; 44 45 //PictureBoxを初期盤面に設定する 46 for (int i = 0; i < length; i++) 47 { 48 for (int j = 0; j < width; j++) 49 { 50 gameBoard_P[i, j] = new PictureBox(); 51 52 //壁のPictureBoxにBitMapを入れる 53 if ((i == 0 || i == length - 1) && (j == 0 || j == width - 1)) 54 { 55 gameBoard_P[i, j].Size = new Size(25, 25); 56 gameBoard_P[i, j].SizeMode = PictureBoxSizeMode.StretchImage; 57 gameBoard_P[i, j].Location = new Point(i * 25, j * 25); 58 gameBoard_P[i, j].Image = dataClass.Tetrimino; 59 } 60 } 61 } 62 //フォームにコントロールを追加 63 this.Controls.AddRange(this.gameBoard_P); 64 this.ResumeLayout(false); 65 66 67 68 } 69 70 //タイマーカウント事に呼び出されるメソッド 71 private void TimerCount_Tick(object sender, EventArgs e) 72 { 73 74 } 75 } 76}

試したこと

List<T>やarrayList(これはやめておいた方がいいというのを見ました)なども見たのですが、
理解できませんでした。

補足情報(FW/ツールのバージョンなど)

Windows10 の ビジュアルスタジオ2022 の C# の Windows Forms アプリで自動生成してから、自分でソースコードを書いています。
Microsoft Visual Studio Community 2022
Version 17.4.1
VisualStudio.17.Release/17.4.1+33110.190
Microsoft .NET Framework
Version 4.7

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/11/16 07:57

何が聞きたいのか分かりません。一度読んでください⇒ https://teratail.com/help/question-tips 特に以下のところ: "人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。何がわからないかわからない人から質問を受けても、答える側も困ってしまいます"
退会済みユーザー

退会済みユーザー

2022/11/16 08:11 編集

前にも言いましたが何を何で作っているか書きましょう。Windows Forms アプリと言うことが書いてないです。PictureBox という言葉から分かるだろうとか思ってるかもしれませんが、手抜きしないで書いてください。 あと、「.Net 4.7」と言うのも手抜きです。
退会済みユーザー

退会済みユーザー

2022/11/16 08:13

失礼しました。わからないことが多く、皆様に失礼をしてしまっており修正いたします。
fana

2022/11/16 09:11

> デザインフォーム これ,フォームデザイナのことでしょうか? 仮にそうだとしたら, > PictureBoxをデザインフォームで宣言せずに、ソース内部で多重配列を使って宣言しデザインフォームで表示されるようにしたい。 というタイトルから質問内容を読み取ろうとすると,(「多重配列」もよくわからないがとりあえず無視して…) 【PictureBoxを(デザイナ上で配置するのではなく)自分で書いたコードでnewとかして作ったときに,それを デザイナ上で 表示させたい】 みたいな話に見えますが,合っていますか?
退会済みユーザー

退会済みユーザー

2022/11/16 09:28

fana様 いろいろ間違っておりすみません。 >デザインフォーム は、フォームデザイナの事だと思います。 フォームデザイナでピクチャーボックスを作らずに、2次元配列をnewしてそれをデザイナ上で表示させたいです。 わからないので、答えを知っていらっしゃると非常に助かります。 よろしくお願いいたします。
fana

2022/11/16 09:40

私自身,そんなことをしたことないですが,何か関係しそうな話: https://stackoverflow.com/questions/33532690/ ※でも,本当にやりたいことが「デザイナ上で」表示したいことなのか?っていうのは疑問. デザイナで見えようが見えまいが,動かしたら動けば良いのでは.
退会済みユーザー

退会済みユーザー

2022/11/16 09:45

ありがとうございます。URLの内容を見てきます。 デザイナ上でテトリスのブロックを動かしたいのでピクチャーボックスが動かないといけないのです。
YAmaGNZ

2022/11/16 15:35

貴方がやりたいことって、コード上で配列に入れたPictureBoxを「フォームデザイナ上で表示する」ことなのですか? それとも、「プログラムを実行したときにフォーム上に表示する」のですか?
退会済みユーザー

退会済みユーザー

2022/11/16 18:51

プログラムを実行したときにフォーム上で表示させたいです。 コードで書いて、フォームデザイナで設定しないようにできればと思っています。
YAmaGNZ

2022/11/16 22:06

「C# コントロール 配列 生成」とでも検索すればいいでしょう
退会済みユーザー

退会済みユーザー

2022/11/16 22:43

> Microsoft .NET Framework > Version 4.8.04084 それ違います。プロジェクトのプロパティの対象フレームワークを見てください。 それから、「インストールされているバージョン」以下の情報は不要です。
退会済みユーザー

退会済みユーザー

2022/11/16 22:57

最初にコメントしましたが、依然として何が聞きたいのか分かりません。 > PictureBoxをデザインフォームの方で作らずに、ソースで作って表示をしたい。 ・・・ということだけわかれば良いのですか? であれば、デザイナで自動生成されたコードを参考に自分でコードを書けば良いのでは? でも、聞きたいことはそれだけではなくて、 > C#でテトリスみたいなシステム ・・・を作るにはどうしたら良いかということでは? それをここで聞いて答えが出てくると期待するのは無理があります。 一番の問題は、話が通じないということにあると思います。上のコメントに書いた、 "人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです" ・・・ができてないからです。
KOZ6.0

2022/11/17 02:27

Controls.AddRange に2次元配列を入れられなくてコンパイルエラーが出るってことですか?
退会済みユーザー

退会済みユーザー

2022/11/17 02:55

はい。先ほどのように入れると型が違うとエラーが出ました。 Controls.Addに変えて、二次元配列一つ一つを表示させるように変えてみました。
len_souko

2022/11/17 03:18

根本的な問題として、本当の目的が > C#でテトリスみたいなシステム これなのだったら、「Windows Forms」でやるんじゃなくて「Unity」でやる方が良いのでは? 確かに「Windows Forms」のデザイナーで自動生成されたソースを研究すればできるとは思いますが、おそらくそれを行うレベルのスキルを身に付けられていない様なので、かなり時間はかかると思います 勿論、「Unity」で作成するとなってもC#の知識は必要になるため、C#の勉強を行う事は大前提となります
KOZ6.0

2022/11/17 04:46

>はい。先ほどのように入れると型が違うとエラーが出ました。 それを質問に書きましょう。 ないものは使えません。 「C# 入門講座 目次」 https://www.umayadia.com/CSNyumon/CSNyumonToc.htm このあたりを読んで勉強してみては
退会済みユーザー

退会済みユーザー

2022/11/19 21:37

ありがとうございます。ブックマークに入れました。 勉強になります。
guest

回答2

0

とりあえずコントロールを動的に生成して表示する方法はググればいくらでも出てきそうですし,デザイナが吐いたコードを参考にして同じようなのを書いてみるのでも良いでしょう.

以下の例は,PictureBox ではなく Label ですが,動的に生成してフォーム上に表示し,また,位置の移動もしています.
何というか, このくらいのことから試していくステップを面倒くさがらずにまずはやってみるべき 状況なのではないかと思います.

※コントロールをいつ生成すべきか等々は作る物次第でしょうから,ここではとりあえずデザイナでボタンを1個だけ配置して,件の処理はそのボタンのイベントハンドラ内に突っ込んでいます.

C#

1private List<Label> m_MyLabels; 2 3//ボタンのイベントハンドラ 4private void button1_Click(object sender, EventArgs e) 5{ 6 if( m_MyLabels == null ) 7 {//初回に生成作業をしている 8 m_MyLabels = new List<Label>(); 9 m_MyLabels.Add( CreateLabel( "Cat", new Point(10,10) ) ); 10 m_MyLabels.Add( CreateLabel( "Kitten", new Point(20,80) ) ); 11 m_MyLabels.Add( CreateLabel( "Meow", new Point(40,100) ) ); 12 13 foreach( var L in m_MyLabels ){ this.Controls.Add( L ); } 14 } 15 else 16 {//初回じゃないとき.てきとーに1個目のラベルの位置をちょっと変えてみる. 17 var Pos = m_MyLabels[0].Location; 18 Pos.Offset( 2,2 ); 19 m_MyLabels[0].Location = Pos; 20 } 21} 22 23//新しいLabelを生成して最低限のプロパティを設定して返すだけの作業をするメソッド 24private Label CreateLabel( string Text, Point Pos ) 25{ 26 var L = new Label(); 27 L.Text = Text; 28 L.Location = Pos; 29 L.AutoSize = true; 30 return L; 31}

投稿2022/11/17 02:35

fana

総合スコア11658

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

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

fana

2022/11/17 02:43 編集

二次元配列だとか何とか言うよりも前に,まずは単一コントロールで実現することを試す. それができたなら(この回答のサンプルみたいな)複数個のコントロールでやることには何の障害も無いハズ. コントロールの種類に依らないであろう話を試す際には最も扱いが単純なコントロールで試すのが手っ取り早いと思う(ので,ここでは Label を用いた). それでできたならコントロールを PictureBox に変えてみるだけの話であろう. (PicureBox の扱い方と「動的につくって表示してどうの」いう話とは独立した問題だ.いきなりまとめて面倒見ずに一個ずつ解決していけばいい)
fana

2022/11/17 02:47

最低限の基礎的事柄を学ぶステップをすっ飛ばして,どこぞに書かれていたコード(?)から出発しようとして > このようなソースがあるのですが、理解できなかったです。 とか言わないこと.取り組み順序が違う. 自信が参考にできるコードとは「自身が読めるコード」だ. だから,「読めるようになるための努力をするステップ」が必要なのだ.
退会済みユーザー

退会済みユーザー

2022/11/17 03:34

fanaさんの解答が分かるように頑張ります。 今回はありがとうございます。 大変参考になります。
guest

0

ベストアンサー

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.IO; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace Tetris 13{ 14 internal partial class Form1 : Form 15 { 16 //定数 17 private const byte length = 27;//フィールド用。縦の長さ 18 private const byte width = 12;//フィールド用。横の長さ 19 internal const byte LimitValue = 22;//フィールド用。ゲーム終了のライン 20 21 //画面に表示するためのPictureBox 22 internal PictureBox[,] gameBoard_P; 23 24 internal Form1() 25 { 26 InitializeComponent(); 27 } 28 29 //DataClassをnewして呼び出して使えるようにする 30 private static DataClass dataClass = new DataClass(); 31 32 //フォームのロード時に呼ばれるメソッド 33 private void Form1_Load(object sender, EventArgs e) 34 { 35 Initialization(sender, e); 36 } 37 38 //初期化用メソッド 39 private void Initialization(object sender, EventArgs e) 40 { 41 dataClass.GameBoardFormat(); 42 43 //PictureBoxのインスタンス 44 this.gameBoard_P = new PictureBox[length, width]; 45 46 //PictureBoxを初期盤面に設定する 47 for (int i = 0; i < length - 5; i++) 48 { 49 for (int j = 0; j < width; j++) 50 { 51 gameBoard_P[i, j] = new PictureBox(); 52 53 //壁のPictureBox関連 54 if ((i == 0 || i == length - 1) || (j == 0 || j == width - 1)) 55 { 56 gameBoard_P[i, j].Size = new Size(25, 25);//一つの画像の大きさを決める 57 gameBoard_P[i, j].SizeMode = PictureBoxSizeMode.StretchImage;//画像の比率をそのままに大きさを変える 58 gameBoard_P[i, j].Location = new Point(j * 25, i * 25);//画像が表示される場所 59 gameBoard_P[i, j].Image = dataClass.Tetrimino;//画像を設定する 60 this.Controls.Add(this.gameBoard_P[i, j]);//実際に画像をフォームに表示する 61 } 62 else if (i == LimitValue - 1 || i == length - 5) 63 { 64 gameBoard_P[i, j].Size = new Size(25, 25); 65 gameBoard_P[i, j].SizeMode = PictureBoxSizeMode.StretchImage; 66 gameBoard_P[i, j].Location = new Point(j * 25, i * 25); 67 gameBoard_P[i, j].Image = dataClass.Tetrimino; 68 this.Controls.Add(this.gameBoard_P[i, j]); 69 } 70 71 } 72 } 73 } 74 } 75}

イメージ説明

このような感じにデザイナーを使わず、ソースで表示したかったです。
多くの方に意図が伝わらず申し訳ありませんでした。

投稿2022/11/16 10:53

編集2022/11/17 03:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/11/16 11:28

BitmapやPictureBoxの二次元配列に関して書かれておりませんでした。 なので、使えなかったです。
退会済みユーザー

退会済みユーザー

2022/11/16 22:39

自己解決策を見つけてそれを書くのでなければ、質問者は回答欄に書かないでください。スレッド内容が訳がわからなくなります。上記のようなことは質問欄に書いてください。
退会済みユーザー

退会済みユーザー

2022/11/17 01:12

「試みた結果や再現する条件などがある場合は詳しく記入することで、マッチした回答がつきやすくなります。」 ともあるので、チャレンジした結果なども解決欄に書いてはいけないのでしょうか。
fana

2022/11/17 02:11

質問した後に,本当に自身で「チャレンジ」してみて,「本件の解決すべき課題に対してある程度の結果が得られた」とかそういう話になるなら自己回答として書いてもいいんじゃない? (でも今のところ,そうじゃないよね)
退会済みユーザー

退会済みユーザー

2022/11/17 02:14

そうじゃなかったです。すみませんでした。
退会済みユーザー

退会済みユーザー

2022/11/17 03:27

自己解決だそうですが、そもそも質問の課題は何だったのか、上に書かれたコードで何が解決できたのかが分かりません。それを追記してください。
退会済みユーザー

退会済みユーザー

2022/11/17 03:30

this.Controls.Addを使って、デザイナーを使わずにフォームにピクチャーボックスを表示させたかったのが目的でした。 分かっていただけるような内容でなくてすみませんでした。 分かってもらえるよう書いたのですが、内容がうすっぺらく申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問