みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#の配列の定数

BCCを使用していたのですが、最近VS2013でC#を勉強し始めました

フォームの指定した位置にいくつかのボタンを設置し、あらかじめ定義しておいた
テーブルからボタンのtextを表示したいと思い、以下のようにコーディングしたのですが
エラーが出てしまい思ったような結果に持って行くことができません
C#ならこうした方がいいという指摘も含めて どうやるのがいいのか
ご教授ください
足りない情報があれば追加します

ちなみにまだテスト段階だから2列定義して1列しか表示するようにしかなってません

-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace haneda
{
public partial class Form1 : Form
{
private Button[] buttons;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
int i;

//ボタンコントロール配列の作成
this.buttons = new Button[table.MAX_R];
for (i = 0; i < buttons.Length; i++)
{
//ボタンコントロールのインスタンス作成
this.buttons[i] = new Button();

//プロパティ設定
this.buttons[i].Name = "btn" + i.ToString();
this.buttons[i].Text = table.roomNo[1, i]; <=ここがエラー
this.buttons[i].Top = table.roomX01[i]; <=ここがエラー
this.buttons[i].Left = table.roomY01[i]; <=ここがエラー
this.buttons[i].Click += new System.EventHandler(button_Click);

//コントロールをフォームに追加
this.Controls.Add(this.buttons[i]);
}
}

private void button_Click(object sender, System.EventArgs e)
{
Button btn = (Button)sender;
MessageBox.Show(btn.Name);
}
}

public class define
{
public const bool IGNORE = false;//非表示
public const bool EFFECT = true; //表示
/* 最大値 */
public const int MAX_F = 2; //フロア数
public const int MAX_R = 3; //ルーム数
}

public class table
{
/* ナンバー */
public readonly string[,] roomNo = new string[define.MAX_F, define.MAX_R]
{
{ "101", "102", "103"},
{ "201", "202", "203"}
}

/* 表示・非表示 */
public readonly bool[,] effectRoom = new bool[define.MAX_F, define.MAX_R]
{
{EFFECT, IGNORE, EFFECT},
{EFFECT, EFFECT, EFFECT}
}

public readonly int[] roomX01 = new int[define.MAX_R]
{
5, 70, 135
}

public readonly int[] roomY01 = new int[define.MAX_R]
{
100, 100, 100
}
}
}

投稿日時 - 2015-03-12 18:35:08

QNo.8934382

困ってます

質問者が選んだベストアンサー

>として初めて中身を入れることができるようになるので
>そこから中身をセットしないとできないよ
>ということですかね?

そうです。
ただ#2で書いてる事の半分だけですね。
インスタンスメンバーとクラスメンバーが、それぞれどういったものなのか理解された方がよろしいかと思います。
これはC#に限らずC++,Javaなども同じですし。

投稿日時 - 2015-03-19 19:01:55

お礼

インスタンスメンバー、クラスメンバーについて
勉強してみます
そうしないと先に進めなそうな感じがするので (^^;

ありがとうございました

投稿日時 - 2015-03-20 17:32:14

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>エラー内容は「静的でないフィールド、メソッド、またはプロパティ。。。。オブジェクト参照が必要です」というエラーです

このメッセージの意味は理解してますか?
エラーの原因は、このメッセージに書かれてる通りなんですけど。

roomNo
roomX01
roomY01
は、tableクラスのインスタンス(オブジェクト)のメンバ変数(readonlyは読み取り専用変数で定数ではないです)ですから、tableクラスのインスタンスなしにはアクセスできません。
ですのでstaticを付けて静的変数にするかtableクラスのインスタンスを作るかなりしてください。

投稿日時 - 2015-03-13 20:39:18

お礼

返事が遅くなりすみません。
ご回答ありがとうございます

Form1_Loadで
table tbl;
tbl = new table();

として初めて中身を入れることができるようになるので
そこから中身をセットしないとできないよ
ということですかね?

投稿日時 - 2015-03-17 17:22:54

ANo.1

>this.buttons[i].Text = table.roomNo[1, i]; <=ここがエラー
>this.buttons[i].Top = table.roomX01[i]; <=ここがエラー
>this.buttons[i].Left = table.roomY01[i]; <=ここがエラー

単純にエラーと書かれていますけど、エラーメッセージは「エラー」としか書かれていなかったんですか?

とりあえず
https://msdn.microsoft.com/ja-jp/library/aa645629%28v=vs.71%29.aspx
を参照してください。

投稿日時 - 2015-03-12 19:47:54

補足

ご指摘ありがとうございます
エラー内容は「静的でないフィールド、メソッド、またはプロパティ。。。。オブジェクト参照が必要です」というエラーです

投稿日時 - 2015-03-13 08:54:46

あなたにオススメの質問