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

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

ただいまの
回答率

89.63%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,420

ehyai

score 41

前提・実現したいこと

私は、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ディレクティブまたはアセンブリ参照が不足していないことを確認してください。

該当のソースコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    private Button[] buttons;
    protected void Page_Load(object sender, EventArgs e)
    {
        //ボタンコントロール配列の作成
        this.buttons = new Button[10];
        for (int i = 0; i < buttons.Length; i++)
        {
            //ボタンコントロールのインスタンス作成
            this.buttons[i] = new Button();

            //プロパティ設定
            this.buttons[i].Name = "btn" + i.ToString();
            this.buttons[i].Text = "ボタン" + i.ToString();
            this.buttons[i].Top = i * 30;

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

試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • MasahikoHirata

    2016/11/23 02:32

    それは通常のWindowsのプロパティーで、ASP.NETのプロパティーはこちらでは? https://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.button(v=vs.110).aspx

    キャンセル

  • ehyai

    2016/11/23 03:11

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

    キャンセル

回答 3

checkベストアンサー

+3

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

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

private Button[] buttons;
    protected void Page_Load(object sender, EventArgs e)
    {
        buttons = new Button[10];
        for (int i = 0; i < buttons.Length; i++)
        {
            //ボタンコントロールのインスタンス作成
            this.buttons[i] = new Button();
            //プロパティ設定
            this.buttons[i].CommandName  = "btn" + i.ToString();
            this.buttons[i].Text = "ボタン" + i.ToString();
            this.buttons[i].Click += new System.EventHandler(Btn_Click);

            //コントロールをフォームに追加
            this.Form.Controls.Add(this.buttons[i]);
        }
    }
    protected void Btn_Click(object sender, EventArgs e)
    {
        //押されたときの処理 押されたボタン名は  ((Button)sender).CommandName
    }

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/24 09:00

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

    キャンセル

  • 2016/11/25 03:40

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

    キャンセル

  • 2016/11/25 08:52

    キャンセル

+1

私は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)

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


コード(.aspx.cs)

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/23 11:34

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

    キャンセル

  • 2016/11/24 03:33

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

    キャンセル

+1

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

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/24 03:39

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

    キャンセル

  • 2016/11/24 10:20

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

    キャンセル

  • 2016/11/25 03:37

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

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる