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

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

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

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

Visual Studio

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

3回答

8657閲覧

ASP.NETにおける、実行時にコントロールの配列の作成する方法を教えてほしい

ehyai

総合スコア43

C#

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

Visual Studio

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2016/11/22 17:16

編集2016/11/22 17:18

###前提・実現したいこと
私は、Visual Studioの環境で、とあるWebページを作るために、ASP.NETを用いて、プログラムの実行時に指定した数のボタンを作成するプログラムを構築したいと考えています。その際、以下のサイトを参考にして構築しました。
C#でボタンを動的に複数配置させる
コントロールの配列を作成する
手順としては、Visual Studioのファイル→新規作成→Webサイト→ASP.NET Web Siteを選択し、次にWeb SiteにWeb フォームを追加し、作られた「Default.aspx.cs」にコードを書きました。
###発生している問題・エラーメッセージ
[C#でボタンを動的に複数配置させる]のプログラムを真似してみて、実際にWebフォームに実装しようとしても、以下のようなエラーが出てしまい、うまく実装することができません。普通のC#とは異なり、Webフォームにおいての型Buttonには「Name」と「Top」の定義が含まれていないらしく、新たに定義をすればよいのならその方法を、そうでないのなら具体的にどのような書き方をすれば良いのかを教えていただきたいのです。

エラーメッセージ 'Button'に'Name'の定義が含まれておらず、型'Button'の最初の引数を受け付ける拡張メソッド'Name'が見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足していないことを確認してください。 'Button'に'Top'の定義が含まれておらず、型'Button'の最初の引数を受け付ける拡張メソッド'Name'が見つかりませんでした。usingディレクティブまたはアセンブリ参照が不足していないことを確認してください。

###該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8public partial class _Default : System.Web.UI.Page 9{ 10 private Button[] buttons; 11 protected void Page_Load(object sender, EventArgs e) 12 { 13 //ボタンコントロール配列の作成 14 this.buttons = new Button[10]; 15 for (int i = 0; i < buttons.Length; i++) 16 { 17 //ボタンコントロールのインスタンス作成 18 this.buttons[i] = new Button(); 19 20 //プロパティ設定 21 this.buttons[i].Name = "btn" + i.ToString(); 22 this.buttons[i].Text = "ボタン" + i.ToString(); 23 this.buttons[i].Top = i * 30; 24 25 //コントロールをフォームに追加 26 this.Controls.Add(this.buttons[i]); 27 } 28 } 29}

###試したこと
[コントロールの配列を作成する]の方のプログラムも試してみたのですが、「private System.Windows.Forms.Button[] testButtons;」の箇所で「型または名前空間の名前'Forms'が名前空間'System.Windows'に存在しません(アセンブリ参照があることを確認してください)。」というエラーが発生してしまいました。

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

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

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

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

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

ehyai

2016/11/22 18:11

返信してくださってありがとうございます。Windowsのプロパティーだったから上手くいかなかったということはわかりました。もう一つ、Windowsのプロパティーにおける「Name」と「Top」のプロパティは、ASP.NETのプロパティーでは具体的にどのプロパティーに該当するのか、などはわかりますでしょうか。もしそちらさえよろしければ教えていただきたいです。
guest

回答3

0

ベストアンサー

プロパティはインテリセンスで見えますよね?

とりあえず並べるだけでしたら、

C#

1private Button[] buttons; 2 protected void Page_Load(object sender, EventArgs e) 3 { 4 buttons = new Button[10]; 5 for (int i = 0; i < buttons.Length; i++) 6 { 7 //ボタンコントロールのインスタンス作成 8 this.buttons[i] = new Button(); 9 //プロパティ設定 10 this.buttons[i].CommandName = "btn" + i.ToString(); 11 this.buttons[i].Text = "ボタン" + i.ToString(); 12 this.buttons[i].Click += new System.EventHandler(Btn_Click); 13 14 //コントロールをフォームに追加 15 this.Form.Controls.Add(this.buttons[i]); 16 } 17 } 18 protected void Btn_Click(object sender, EventArgs e) 19 { 20 //押されたときの処理 押されたボタン名は ((Button)sender).CommandName 21 }

思う位置にデザインするためにはhtmlの知識が必要になります。

投稿2016/11/23 00:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/11/23 02:37

this.Form.Controls.Add(this.buttons[i]); の Form は何でしょうか?
退会済みユーザー

退会済みユーザー

2016/11/23 02:54

ボタンコントロールは ページのform内に配置しないとダメなんです、のformです。
退会済みユーザー

退会済みユーザー

2016/11/23 03:02

返答ありがとうございます。了解しました。
ehyai

2016/11/23 18:33

回答してくださってありがとうございます。どの方をベストアンサーに決めるのか迷いましたが、この中で一番的確で具体的な回答を書いてくださったのであなたに決めました。あなたの書いたコード通りにプログラムを書くことで、選択した数だけボタンの配置を行うことができました。ただ、ボタンの位置を決めるプログラムは、おそらくhtml(デザイナ)の方に書くことはできないのです。なぜなら、自分の最終的に構築したいと考えているプログラムは、指定したtextファイルに書かれた数字を読み込み、その数だけボタンを配置するというものだからです。cs側で作成したボタンの位置をhtmlで決めることはできるのか、またはhtml側でtextファイルを読み込み、その数だけボタンの配置を行えるのか、今後はそのあたりも考えて学習していきたいと思います。もし、そのためのアドバイスを何か教えていただけましたら助かります。
退会済みユーザー

退会済みユーザー

2016/11/24 00:00

実のところ、自分であれば(多分ほかの方も)、この方法はまず使いません。 リピーターコントロールなどを使います。
ehyai

2016/11/24 18:40

質問の回答のみならず、他の方法に関しても教えてくださってありがとうございます。textファイルの読み込みとは組み合わせられなさそうに感じましたが、こちらの方法もまた使用する機会があればその時は活用させていただきたいと思います。
退会済みユーザー

退会済みユーザー

2016/11/24 23:52

guest

0

そもそも配列にする意味が分かりませんが・・・

Windowsのプロパティーだったから上手くいかなかったということはわかりました。

そうではありません。

アプリケーションには Windows Forms, WPF, ASP.NET Web Forms などはあるのはご存知ですか? そして、当然ながら、それに使用するコントロール(今回の例では Button ですが)は全て異なるものと言うことは理解していますか?

言い方の違いだけで理解されているのかもしれませんが、もし理解していなければまずそのあたりを理解してください。

もう一つ、Windowsのプロパティーにおける「Name」と「Top」のプロパティは、ASP.NETのプロパティーでは具体的にどのプロパティーに該当するのか、などはわかりますでしょうか。

ズバリ該当するものはありません。

ただし、どういう目的で Windows Forms アプリの Button の「Name」と「Top」のプロパティを、Web アプリで使いたいかを明確にしてもらえれば、それなりの方法はあると思います。

例えば、noricyan2 さんのコード例で「Name」に代えて CommandName を使用されていますが、参考にされている記事の「Name」の使い方のようにどのボタンがクリックされたかを識別する目的ということであれば利用できます。

「Top」は代替になるようなプロパティもありません。CSS という全く別の手段を使います。大雑把な位置でいいのであれば、デザイン画面で Panel または PlaceHolder を適当な場所に配置し、Button は動的にその中に配置するという手段が使えます。

【2016/11/24 10:55 追記】

私の 2016/11/24 10:20 のコメントで「別途回答欄に追記します」と書きましたが、それを以下に書きます。

まず、上の私の回答で、

大雑把な位置でいいのであれば、デザイン画面で Panel または PlaceHolder を適当な場所に配置し、Button は動的にその中に配置するという手段が使えます。

と書いた意味ですが、たとえば以下のような .aspx ページで、「該当する Button をクリックしてください」と「使い方の説明・・・」の間に Button を動的に配置する場合を考えてください。

<body> <form id="form1" runat="server"> <h1>Button の動的配置</h1> <p>該当する Button をクリックしてください</p> <p>使い方の説明・・・</p> </form> </body>

this.Form.Controls.Add(this.buttons[i]); ではページの一番最後に Button が追加されるので NG です。

なので、Panel を以下のように配置して、それに this.Panel1.Controls.Add(this.buttons[i]); で追加するということを言っています。

<body> <form id="form1" runat="server"> <h1>Button の動的配置</h1> <p>該当する Button をクリックしてください</p> <asp:Panel ID="Panel1" runat="server"> </asp:Panel> <p>使い方の説明・・・</p> </form> </body>

「デザイン画面で」と書いたのは初学者の方には「ソース」画面で操作するより「デザイン」画面でツールボックスからドラッグ&ドロップした方が分かりやすいと思ったからで、「ソース」画面でもドラッグ&ドロップはできます。

ということで、上の話は質問者さんのやりたいこと、

acの方でtextファイルから読み込んだ数字の数だけ・・・

とは直接関係ないのは理解いただけるでしょうか?

ただ、「acの方でtextファイルから読み込んだ数字」で Button の配列を作ってというのは自分としてはピンと来ません。

Text ファイル等の情報で表のようなものを作り、それの各行に Button を追加し、ユーザーに選択させるというようなことをやりたいのではないかと思いますが、もしその想像が当たっているなら自分なら「Button の配列を作って・・・」というやり方はしません。

もしそのあたりの話をするのがご希望であれば、新たに別のスレッドを立てて、質問してください。

投稿2016/11/23 02:29

編集2016/11/24 01:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ehyai

2016/11/23 18:39

回答してくださってありがとうございます。自分のアプリケーションに対する知識不足が思い知らされました。おそらく、自分の最終的に考えているプログラムでは、デザイン画面の方でボタンを配置するのは難しいと思います。acの方でtextファイルから読み込んだ数字の数だけデザイン画面の方で配置する方法などを調べるようにしたいと思います。もしそのためのアドバイスなどがありましたら、SurferOnWwwさんさえよろしければ、教えていただけたらと思います。
退会済みユーザー

退会済みユーザー

2016/11/24 01:20

「デザイン画面の方でボタンを配置するのは難しいと思います」というところ、私のレスを誤解されているように思います。詳しい説明はコメント欄に書けないので、別途回答欄に追記します。
ehyai

2016/11/24 18:37

質問の回答のみならず、PanelやPlaceHolderを用いたButtonを動的に配置する方法までも丁寧に教えてくださってありがとうございます。textファイルの読み込みとは関係がないことを理解できました。また、そちらのおっしゃる通り、Buttonの配列を作る方法は確かに使うべきではないと考えるようになりました。もう少しASP.NETについて詳しく勉強し、別の方法を考えたいと思います。
guest

0

私はASP.NET(Web Form)は基本的にボタンの配置等はデザイナ上で行うと認識しています。
(ボタンクリックイベント等を*.csファイルに書く)
https://msdn.microsoft.com/ja-jp/library/7ytf5t7k(v=vs.100).aspx
https://msdn.microsoft.com/ja-jp/library/ms178135(v=vs.100).aspx

記述方法はたくさんあると思いますが、以下に一例を書いて見ます。
(ButtonにIDとか振ってどのボタンが押されたか判定する方法は調査不足のため保留)
デザイナ(.aspx)

ASP

1<% for(int i = 0; i < 10; i++) { %> 2<asp:Button runat="server" Text="aiueo" OnClick="Unnamed_Click"/> 3<% } %>

コード(.aspx.cs)

C#

1protected void Unnamed_Click(object sender, EventArgs e) { 2 var button = sender as Button; 3 Console.WriteLine(button.Text); 4}

投稿2016/11/23 00:38

Hey_CH

総合スコア437

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

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

退会済みユーザー

退会済みユーザー

2016/11/23 02:34

コードブロックを .aspx に書くより、Panel または PlaceHolder を Page 上の適当な場所に配置し、Button は動的にその中に配置するという手段を使った方がよさそうです。
ehyai

2016/11/23 18:33

回答してくださってありがとうございます。noricyan2さんへのコメントにも書きましたが、もしcs側でtextファイルを読み込み、そこに書かれた数字だけボタンをデザイナ上で配置する方法などがわかりましたら、教えていただけましたら嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問