前提
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
何が聞きたいのか分かりません。一度読んでください⇒ https://teratail.com/help/question-tips
特に以下のところ:
"人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです。何がわからないかわからない人から質問を受けても、答える側も困ってしまいます"
前にも言いましたが何を何で作っているか書きましょう。Windows Forms アプリと言うことが書いてないです。PictureBox という言葉から分かるだろうとか思ってるかもしれませんが、手抜きしないで書いてください。
あと、「.Net 4.7」と言うのも手抜きです。

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

fana様
いろいろ間違っておりすみません。
>デザインフォーム
は、フォームデザイナの事だと思います。
フォームデザイナでピクチャーボックスを作らずに、2次元配列をnewしてそれをデザイナ上で表示させたいです。
わからないので、答えを知っていらっしゃると非常に助かります。
よろしくお願いいたします。
私自身,そんなことをしたことないですが,何か関係しそうな話:
https://stackoverflow.com/questions/33532690/
※でも,本当にやりたいことが「デザイナ上で」表示したいことなのか?っていうのは疑問.
デザイナで見えようが見えまいが,動かしたら動けば良いのでは.

ありがとうございます。URLの内容を見てきます。
デザイナ上でテトリスのブロックを動かしたいのでピクチャーボックスが動かないといけないのです。
貴方がやりたいことって、コード上で配列に入れたPictureBoxを「フォームデザイナ上で表示する」ことなのですか?
それとも、「プログラムを実行したときにフォーム上に表示する」のですか?

プログラムを実行したときにフォーム上で表示させたいです。
コードで書いて、フォームデザイナで設定しないようにできればと思っています。
「C# コントロール 配列 生成」とでも検索すればいいでしょう
> Microsoft .NET Framework
> Version 4.8.04084
それ違います。プロジェクトのプロパティの対象フレームワークを見てください。
それから、「インストールされているバージョン」以下の情報は不要です。
最初にコメントしましたが、依然として何が聞きたいのか分かりません。
> PictureBoxをデザインフォームの方で作らずに、ソースで作って表示をしたい。
・・・ということだけわかれば良いのですか? であれば、デザイナで自動生成されたコードを参考に自分でコードを書けば良いのでは?
でも、聞きたいことはそれだけではなくて、
> C#でテトリスみたいなシステム
・・・を作るにはどうしたら良いかということでは? それをここで聞いて答えが出てくると期待するのは無理があります。
一番の問題は、話が通じないということにあると思います。上のコメントに書いた、
"人に質問をするには、自分が何を尋ねたいかを知っている必要があります。これは、「自分が今『何がわからないのか』がわかっていて、言語化できている」ということです"
・・・ができてないからです。
Controls.AddRange に2次元配列を入れられなくてコンパイルエラーが出るってことですか?

はい。先ほどのように入れると型が違うとエラーが出ました。
Controls.Addに変えて、二次元配列一つ一つを表示させるように変えてみました。
根本的な問題として、本当の目的が
> C#でテトリスみたいなシステム
これなのだったら、「Windows Forms」でやるんじゃなくて「Unity」でやる方が良いのでは?
確かに「Windows Forms」のデザイナーで自動生成されたソースを研究すればできるとは思いますが、おそらくそれを行うレベルのスキルを身に付けられていない様なので、かなり時間はかかると思います
勿論、「Unity」で作成するとなってもC#の知識は必要になるため、C#の勉強を行う事は大前提となります
>はい。先ほどのように入れると型が違うとエラーが出ました。
それを質問に書きましょう。
ないものは使えません。
「C# 入門講座 目次」
https://www.umayadia.com/CSNyumon/CSNyumonToc.htm
このあたりを読んで勉強してみては

ありがとうございます。ブックマークに入れました。
勉強になります。
回答2件
あなたの回答
tips
プレビュー